Created
October 22, 2012 13:12
-
-
Save mjlassila/3931447 to your computer and use it in GitHub Desktop.
ITIA41 - Viikkoharjoitusten esimerkkiratkaisuja 5
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#### Tehtävä 2 | |
# Tässä tehtävässä suurimmat hankaluudet liittyivät tulosjoukon saamiseen oikeaan muotoon. | |
# Kurssin alussa harjoitellut taajuusjakauma-asiat olivat pysyneet mielessä, hyvä! | |
# Eräs ratkaisu: | |
from nltk import pprint | |
from nltk.book import text4 | |
from nltk import ingrams, FreqDist | |
# Tallennetaan muuttujaan merkkijono, jota etsitään n-grammeista | |
match = "freedom" | |
# Luodaan taajuusjakauma kuuden sanan mittaisista n-grammeista, jotka sisältävät | |
# merkkijonon 'freedom'. | |
# Poimitaan kaikki kuuden sanan mittaiset n-grammit, jotka sisältävät | |
# halutun merkkijonon ja otetaan näistä taajuusjakauma. | |
fd = FreqDist(ngram for ngram in ingrams(text4, 6) if match in ngram) | |
# Edellä ei ole välttämätöntä käyttää ingrams-metodia, vaan | |
# samaan lopputulokseen pääsee luomalla aluksi listan kuuden sanan ngrammeista, | |
# esim. näin: | |
list_of_ngrams = ngrams(text4, 6)) | |
# ja käymällä listan läpi samaan tapaan kuin tässä malliratkaisussa. | |
# Tulostetaan n-grammit | |
for sample in fd.samples()[:6]: | |
pprint(' '.join(sample)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
##### Tehtävä 3 | |
# Kuten edellisessä tehtävässä, tässäkin suurimmat hankaluudet liittyivät tulostukseen. | |
# Olen ottanut tämän huomioon arvostelussa. | |
#Sama ratkaisumalli sopii kaikkiin tehtävän kohtiin n-grammin pituutta vaihtaen. | |
from nltk.util import ngrams | |
kalevala = open('/home/courses/itima41/kalevala.txt').read() | |
kalevala_ngram = ngrams(kalevala, 5) | |
for ngram in kalevala_ngram[:10]: | |
pprint(''.join(ngram)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#### Tehtävä 4 | |
# Tehtävässä auttoi, jos mielsi säännöllisen lausekkeen merkkijonoksi, | |
# jonka muodostamisessa voi käyttää samoja keinoja kuin merkkijonojen käsittelyssä yleensä. | |
# Verrattain pitkän säännöllisen lausekkeen muodostamisessa käsin sattuu herkästi kirjoitusvirheitä. | |
# Eräs ratkaisu: | |
from nltk import SnowballStemmer, RegexpStemmer | |
nouns = open('/home/courses/itima41/substantiivit.txt').read() | |
suffixes = open('/home/courses/itima41/suffiksit.txt').read() | |
>>>nouns | |
'pommier\nsucrier\nsaliere\nverriere\nhorloger\nmecanicien\nmilicien\npharmacienne\ndentiste\nebeniste | |
# Huomataan, että substantiivit ovat tiedostossa yksi/rivi | |
>>>suffixes | |
'ier\ner\nien\niste\naire\neron\ | |
# Näin on myös suffixsien kohdalla. | |
# Tokenisoidaan substantiivi, ja suffiksilistat rivinvaihdon kohdalta | |
tokenized_suffixes = suffixes.split('\n') | |
tokenized_nouns = nouns.split('\n') | |
pattern = '$|'.join(tokenized_suffixes) + '$' | |
>>> pattern | |
'ier$|er$|ien$|iste$|aire$|eron$|ard$|age$|ure$|ature$|aie$|ie$|erie$|isme$|at$|ade$|aille$|ain$|et$|elle$|el | |
et$|iole$|ule$|ille$|illon$|ine$|as$|ot$|ise$|eau$|on$|eron$|ite$|ose$' | |
# Luodaan säännöllisiin lausekkeihin perustuva stemmeri | |
stemmer = RegexpStemmer(pattern) | |
# Stemmataan substantiivilistan sisältö regexp-stemmerillä. | |
stemmed_nouns = [stemmer.stem(w) for w in tokenized_nouns] | |
# Luodaan Snowball-stemmeri | |
snowball_stemmer = SnowballStemmer('french') | |
# Stemmataan substantiivilista Snowball-stemmerillä. | |
snowball_stemmed_nouns = [snowball_stemmer.stem(w) for w in tokenized_nouns] | |
# Kuinka monen sanan kohdalla tulos on identtinen? | |
matching = [w for w in stemmed_nouns if w in snowball_stemmed_nouns] | |
>>> len(matching) | |
6 | |
# Katsotaan mitä nuo identtiset sanat ovat | |
sanat = [] | |
for noun in tokenized_nouns: | |
for match in matching: | |
if noun.startswith(match): | |
sanat.append(noun) | |
>>> sanat | |
['horloger', 'ebeniste', 'congressiste', 'agronomie', 'progressisme', 'platras'] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#### Tehtävä 5 | |
# Tässä tehtävässä saattoi auttaa, jos tutki tiedostoa ja huomasi, että lähettäjä | |
# ja vastaanottajatiedot ovat aina rivin lopussa. Tällöin säännöllisen lausekkeen | |
# sai määriteltyä niin, että se täsmäsi vain halutun muotoisiin merkkijonoihin, | |
# joiden jäljessä on välittömästi rivinvaihto. | |
# Eräs ratkaisu: | |
from nltk.tokenize import * | |
wikileaks = open('/home/courses/itima41/wikileaks-estonia.txt').read() | |
>>> wikileaks | |
REFTEL A: 2007 TALLINN 366\n B: 2008 TALLINN 428\n C: BAKU 526\n | |
# (ylläoleva on katkelma tulosteesta, jossa huomataan lähettäjä- ja vastaanottotietojen sijainti) | |
# Luodaan sopiva säännöllinen lauseke | |
pattern = r'([A-Z]{2,}\s{1}\d{1,}$)' | |
>>> regexp_tokenize(wikileaks,pattern) | |
['TALLINN 000231', 'TALLINN 366', 'TALLINN 428', 'BAKU 526', 'JEDDAH 236', 'SANTIAGO 2322'] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment