### Ülesanne: kuidas koostada antud lause sõnade loend? >>> text = "Kui Arno isaga koolimajja jõudis, olid tunnid juba alanud." # Sõnad on üksteisest eraldatud tühikutega. Funktsioon split() võimaldab koostada loendi teksti elementidest, mida eraldab tühik. Nii saab küll teada sõnade arvu, kasutades funktsiooni len(), kuid sõnade külge kuuluvaks on loetud ka neile järgnevad kirjavahemärgid. Seega ei saaks õigesti määrata nt sõnade pikkust. >>> text.split() # Tekstilise muutuja ehk stringi tükeldamine või elementide loendi tükeldamisel on ['Kui', 'Arno', 'isaga', 'koolimajja', 'jõudis,', 'olid', 'tunnid', 'juba', 'alanud.'] >>> len(text.split()) 9 # Lihtne split()-funktsioon ei võimalda teksti tükeldamisel arvesse võtta mitut eraldajat. Selleks tuleb kasutada Pythoni regulaaravaldiste moodulit. # Valime esmalt kolm eraldajat: tühik, koma ja tühik, punkt ja tühik. Eraldajate vahele lisame püstkriipsu, mis tähendab "või". Kuna punkt on regulaaravaldistes kasutatav erisümbol, tuleb selle ette lisada langjoon. # Viimase sõna külge jääb punkt siiski alles, kuna sellele ei järgne tekstis tühikut. >>> import re >>> re.split(" |, |\. ", text) ['Kui', 'Arno', 'isaga', 'koolimajja', 'jõudis', 'olid', 'tunnid', 'juba', 'alanud.'] # Kui määrata eraldajaks punkt ilma tühikuta, tekib loendi lõppu tühi element. See pole aga probleem, kuna teame, et sõna ei saa koosneda 0 sümbolist. Niisiis saame määrata tingimuse, et loeme sõnaks vaid loendi elemendid, mis koosnevad rohkematest sümbolitest. Enne salvestame sõnajada eraldi muutujana. >>> re.split(" |, |\.", text) ['Kui', 'Arno', 'isaga', 'koolimajja', 'jõudis', 'olid', 'tunnid', 'juba', 'alanud', ''] >>> text_words = re.split(" |, |\.", text) >>> text_words = [word for word in text_words if len(word) != 0] >>> text_words ['Kui', 'Arno', 'isaga', 'koolimajja', 'jõudis', 'olid', 'tunnid', 'juba', 'alanud'] # Nüüd saab välja arvutada ka sõnade õiged pikkused. >>> word_lens = [len(word) for word in text_words] >>> word_lens [3, 4, 5, 10, 6, 4, 6, 4, 6] # Sõnu eraldavad tekstides ka muud kirjavahemärgid. Regulaaravaldist saab vastavalt täiendada. Küsimärk on samuti erisümbol, mille ette on tarvis lisada langjoon. Lauselõpumärke tasub eraldajana arvesse võtta ilma järgneva tühikuta, kuna need võivad esineda ka teksti lõpus. Nagu nägime, ei valmista tühjad elemendid probleemi. Seevastu koma ja ka nt kooloni järel kasutatakse üldiselt tühikut. >>> text2 = "Arno on tubli! Miks siis? Sellepärast, et ta käib hea meelega koolis." >>> text_words2 = re.split(" |, |\.|\?|!", text2) >>> text_words2 ['Arno', 'on', 'tubli', '', 'Miks', 'siis', '', 'Sellepärast', 'et', 'ta', 'käib', 'hea', 'meelega', 'koolis', ''] >>> text_words2 = [word for word in text_words2 if len(word) != 0] >>> text_words2 ['Arno', 'on', 'tubli', 'Miks', 'siis', 'Sellepärast', 'et', 'ta', 'käib', 'hea', 'meelega', 'koolis'] # Hea uudis: tegelikus elus saab teksti sõnad loetellu koondada üheainsa regulaaravaldist sisaldava funktsiooniga :) # Regulaaravaldis [\w]+ tähistab ühte või enamat üksteisest eraldamata sümbolit. Juhul, kui täpitähti sisaldavad sõnad probleemi valmistavad, toimib pikem regulaaravaldis: [A-Za-z0-9õäöü]+ # Sõnades esineb aga ka sümboleid, mis pole tähed või numbrid. Näiteks sidekriips või %-märk. Nii saab regulaaravaldist vastavalt täiendada. >>> text3 = "E-poes on kaubad 20% alla hinnatud." >>> re.findall("[\w%-]+", text3) ['E-poes', 'on', 'kaubad', '20%', 'alla', 'hinnatud'] ### Mida me teada saime? Pealtnäha lihtsaid keeleteadmisi ei ole tingimata lihtne arvutile õpetada. Ülesande lahendamisel lähtusime järgmistest reeglitest: 1. Sõnu eraldavad tühikud ja kirjavahemärgid. 2. Lauselõpumärgile (punkt, küsimärk ja hüüumärk) ei pruugi järgneda tühik. 3. Sõna ei saa koosneda 0 tähemärgist. 4. Sõnad sisaldavad tähti ja numbreid, kuid võivad sisaldada teatud muidki sümboleid.