### Ülesanne: kuidas koostada antud lause sõnade loend? >>> tekst = "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. >>> tekst.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(tekst.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(" |, |\. ", tekst) ['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(" |, |\.", tekst) ['Kui', 'Arno', 'isaga', 'koolimajja', 'jõudis', 'olid', 'tunnid', 'juba', 'alanud', ''] >>> tekstisonad = re.split(" |, |\.", tekst) >>> tekstisonad = [sona for sona in tekstisonad if len(sona) != 0] >>> tekstisonad ['Kui', 'Arno', 'isaga', 'koolimajja', 'jõudis', 'olid', 'tunnid', 'juba', 'alanud'] # Nüüd saab välja arvutada ka sõnade õiged pikkused. >>> sonapikkused = [len(sona) for sona in tekstisonad] >>> sonapikkused [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. >>> tekst2 = "Arno on tubli! Miks siis? Sellepärast, et ta käib hea meelega koolis." >>> tekstisonad2 = re.split(" |, |\.|\?|!", tekst2) >>> tekstisonad2 ['Arno', 'on', 'tubli', '', 'Miks', 'siis', '', 'Sellepärast', 'et', 'ta', 'käib', 'hea', 'meelega', 'koolis', ''] >>> tekstisonad2 = [sona for sona in tekstisonad2 if len(sona) != 0] >>> tekstisonad2 ['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. >>> re.findall("[\w]+", tekst) ['Kui', 'Arno', 'isaga', 'koolimajja', 'jõudis', 'olid', 'tunnid', 'juba', 'alanud'] # Juhul, kui täpitähti sisaldavad sõnad probleemi valmistavad, toimib pikem regulaaravaldis: >>> re.findall("[A-Za-z0-9õäöü]+", tekst2) ['Arno', 'on', 'tubli', 'Miks', 'siis', 'Sellepärast', 'et', 'ta', 'käib', 'hea', 'meelega', 'koolis'] ### Mida me teada saime? Pealtnäha lihtsaid keeleteadmisi ei ole tingimata lihtne arvutile õpetada. Ülesande lahendamisel lähtusime kolmest reeglist: 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.