Skip to content

Instantly share code, notes, and snippets.

@mjlassila
Created October 22, 2012 13:12
Show Gist options
  • Save mjlassila/3931447 to your computer and use it in GitHub Desktop.
Save mjlassila/3931447 to your computer and use it in GitHub Desktop.
ITIA41 - Viikkoharjoitusten esimerkkiratkaisuja 5
#### 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))
##### 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))
#### 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']
#### 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