Skip to content

Instantly share code, notes, and snippets.

@mjlassila
Created October 1, 2012 12:03
Show Gist options
  • Save mjlassila/3811216 to your computer and use it in GitHub Desktop.
Save mjlassila/3811216 to your computer and use it in GitHub Desktop.
ITIA41 - Viikkoharjoitusten esimerkkiratkaisuja 2--3
# Luodaan FreqDist sanojen pituuksista
freq_of_word_lengths = FreqDist([len(w) for w in text2])
#Katsotaan frekvenssijakaumaa
sorted(freq_of_word_lengths.keys())
# FreqDist:n avaimina on sanojen pituudet.
# Katsotaan kuinka monta sanaa löytyy avaimella 17.
freq_of_word_lengths[17]
#Tuottaa tuloksena 3. Tiedetään nyt, että tuloksena pitäisi saada kolme sanaa.
# Haetaan text2:n sanat, jotka sisältävät 17 merkkiä
[w for w in text2 if len(w) == 17]
# Saatiin ['disinterestedness', 'companionableness', 'disqualifications']
# Tässä vastaukseksi riitti pelkät indeksit, jotka sai selville kokeilemalla.
# Annoin lisäksi arvostelussa 0,25 pistettä ylimääräistä, jos vastaukseksi
# annettiin lisäksi komento, jolla vastauksen saa selville arvaamatta.
>>> kalevala
'Kasvoi maahan marjanvarret, kukat kultaiset keolle;\nruohot kasvoi kaikenlaiset,
monenmuotoiset sikesi.\nOhra on yksin nousematta, touko kallis kasvamatta.\n'
>>> kalevala[1:4]
'asv'
>>> kalevala.find('ruohot')
52
>>> 52 + len('ruohot')
58
>>> kalevala[52:58]
'ruohot'
# Viimeisen kohdan ratkaisu toimii tässä muodossa vain, jos teksti on ladattu suoraan
# kalevala.txt -tiedostosta tai itse kirjoitetun tekstin loppuun oli lisätty
# rivinvaihto. Tiedoston merkkimäärä on tällöin parillinen luku
# ja len(kalevala)/2 antaa tuloksena indeksiksi kelpaavan kokonaisluvun.
>>> kalevala[:10]
'Kasvoi maa'
>>> kalevala[-10:]
'svamatta.\n'
>>> kalevala[:len(kalevala)/2]
'Kasvoi maahan marjanvarret, kukat kultaiset keolle;\nruohot kasvoi kaikenlaise'
# Tässä tehtävässä piti olla tarkkana, tarkoitetaanko listan toista sanaa
# vai listan indeksinumerolla kaksi olevaa sanaa.
>>> kalevala_splitted = kalevala.split()
>>> kalevala_splitted[:3]
['Kasvoi', 'maahan', 'marjanvarret,']
>>> kalevala_splitted[1]
'maahan'
>>> kalevala_splitted[1][:3]
'maa'
>>
>>> kalevala_splitted
['Kasvoi', 'maahan', 'marjanvarret,', 'kukat', 'kultaiset', 'keolle;', 'ruohot', 'kasvoi', 'kaikenlaiset,', 'mone
nmuotoiset', 'sikesi.', 'Ohra', 'on', 'yksin', 'nousematta,', 'touko', 'kallis', 'kasvamatta.']
>>> kalevala_x_joined = 'X'.join(kalevala_splitted)
>>> kalevala_x_joined
'KasvoiXmaahanXmarjanvarret,XkukatXkultaisetXkeolle;XruohotXkasvoiXkaikenlaiset,XmonenmuotoisetXsikesi.XOhraXonXy
ksinXnousematta,XtoukoXkallisXkasvamatta.'
>>>
# Tässä tehtävässä on voinut saada hieman eri vastauksia, jos Kalevala-teksti
# on ollut itse tehty, ilman lopussa olevaa rivinvaihtoa.
# Tämä on otettu huomioon arvostelussa.
>>> [w for w in kalevala_splitted if len(w)>11]
['marjanvarret,', 'kaikenlaiset,', 'monenmuotoiset']
>>> kalevala_splitted.count('marjanvarret')
0
# Listassa on 'marjanvarret,' mutta ei 'marjanvarret' -merkkijonoa. Yhdelläkin merkillä on merkitystä!
>>> len(kalevala)
154
>>> len(kalevala_splitted)
18
# Listan pituus
>>> kalevala_splitted[15]
'touko'
# Täytyy muistaa, että listojen indeksointi alkaa nollasta.
>>> kalevala_splitted[6]
'ruohot'
>>> sorted(kalevala_splitted)
['Kasvoi', 'Ohra', 'kaikenlaiset,', 'kallis', 'kasvamatta.', 'kasvoi', 'keolle;', 'kukat', 'kultaiset', 'maa
han', 'marjanvarret,', 'monenmuotoiset', 'nousematta,', 'on', 'ruohot', 'sikesi.', 'touko', 'yksin']
>>>
# Lista tulee aakkosjärjestykseen, mutta isolla kirjaimella alkavat sanat ensin.
# Tässä herää kysymys, miksi? Järjestäminen tapahtuu tässä merkkijonojen ASCII-
# numeroarvon, eikä merkkijonojen luonnollisen aakkosjärjestyksen mukaan.
# Siihen, mitä ASCII-numeroarvolla tarkoitetaan, tutustutaan kurssilla
# hieman myöhemmin.
# Hieman extraa: jos listan haluaa järjestää yksinkertaisesti luonnolliseen
# aakkosjärjestykseen, se onnistuu esimerkiksi näin:
>>> sorted(kalevala_splitted, key = str.lower)
['kaikenlaiset,', 'kallis', 'kasvamatta.', 'Kasvoi', 'kasvoi', 'keolle;', 'kukat', 'kultaiset', 'maahan', 'marjan
varret,', 'monenmuotoiset', 'nousematta,', 'Ohra', 'on', 'ruohot', 'sikesi.', 'touko', 'yksin']
>>>
# Tässä yksinkertaisessa ratkaisussa ei kuitenkaan oteta huomioon kieliriippuvaisia
# aakkostussääntöjä, joten kaikki tapaukset kattava ratkaisu on vielä
# hieman monimutkaisempi.
# Tässä tehtävässä on oletettu, että tekstin sisältöä päästään muuttuja tulostamalla
# katsomaan helposti ja sitä kautta saadaan selville, että ohra-sanan esiintymä on
# kirjoitettu suuraakkosin ja sana esiintyy tekstissä vain kerran. Olen hyväksynyt
# myös vastaukset, jossa oikea indeksi on katsottu tekstistä silmämääräisesti.
>>> kalevala_splitted.index('Ohra')
11
>>> kalevala_splitted[11] = 'Kaura'
>>> kalevala_splitted
['Kasvoi', 'maahan', 'marjanvarret,', 'kukat', 'kultaiset', 'keolle;', 'ruohot', 'kasvoi', 'kaikenlaiset,', 'mone
nmuotoiset', 'sikesi.', 'Kaura', 'on', 'yksin', 'nousematta,', 'touko', 'kallis', 'kasvamatta.']
>>>
# Eräs ratkaisu:
>>> [word for word in kalevala_splitted if word.istitle()]
# Tässä tehtävässä oli olennaisinta tutustua enumerate()-metodiin.
# Enumerate muodostaa listasta rakenteen, jonka avulla on helppo päästä käsiksi
# listan indeksiin ja indeksiin liittyvään arvoon. Enumeraten synnyttämää
# rakennetta voi tutkailla esimerkiksi näin:
>>> names = ['Ukko','Tapio','Ahti','Ilmarinen','Louhi']
>>> enumerate(names)
<enumerate object at 0x93d993c> // tässä syntyi enumerate-rakenne, mutta sitä ei otettu vielä muuttujaan talteen.
>>> enumerated_names = enumerate(names)
>>> enumerated_names.next()
(0, 'Ukko')
>>> enumerated_names.next()
(1, 'Tapio')
>>> enumerated_names.next()
(2, 'Ahti')
>>> enumerated_names.next()
(3, 'Ilmarinen')
>>> enumerated_names.next()
(4, 'Louhi')
>>> enumerated_names.next()
Traceback (most recent call last):
File "<input>", line 1, in <module>
StopIteration
# Tästä tehtävästä tulikin aiottua hankalampi tehtävään jääneen tulkinnanvaran vuoksi.
# Sulkusanalista-käsitettä ei tavallisesti käytetä tehtävässä ymmärretyssä muodossa,
# eli niin että lista sisältäisi vain yksittäisiä merkkejä. Vain merkkejä sisältävästä
# 'sulkusanalistasta' voisi käyttää yksiselitteisempää nimitystä sulkumerkkilista.
# Tämä epäselvyys teki tehtävästä hankalan, kun joissain tapauksissa ratkaisussa oli
# otettu huomioon myös suomen kielen sulkusanat, jotka voi ladata käyttöön
# NLTK:n uumenista.
# Lisäksi tarkoituksena oli, että tehtäväsarjassa olisi käsitelty jo aiemmin NLTK:n
# tokenize-työkaluja, jotka olisivat helpottaneet tehtävän tekoa jonkin verran.
# Tokenize-työkalut jäivät kuitenkin pois tehtäväsarjasta (olivat nyt mukana viime
# viikon tehtävissä). Tehtävän sai kuitenkin ratkaistua myös muilla tavoin.
# Alla eräs ratkaisu, jossa sovelletaan vain tähän asti kurssilla harjoiteltuja
# asioita, l. merkkijonokäsittelyä ja indeksejä.
>>> kalevala
'Kasvoi maahan marjanvarret, kukat kultaiset keolle;\nruohot kasvoi kaikenlaiset, monenmuotoiset sikesi.\nOhra on
yksin nousematta, touko kallis kasvamatta.\n'
>>> punctuation = ['.', ',', ';', ':', '?', '!']
>>> atomized_lowercase_kalevala = [character.lower() for character in kalevala if character not in punctuation]
>>> atomized_lowercase_kalevala
['k', 'a', 's', 'v', 'o', 'i', ' ', 'm', 'a', 'a', 'h', 'a', 'n', ' ', 'm', 'a', 'r', 'j', 'a', 'n', 'v', 'a', 'r
', 'r', 'e', 't', ' ', 'k', 'u', 'k', 'a', 't', ' ', 'k', 'u', 'l', 't', 'a', 'i', 's', 'e', 't', ' ', 'k', 'e',
'o', 'l', 'l', 'e', '\n', 'r', 'u', 'o', 'h', 'o', 't', ' ', 'k', 'a', 's', 'v', 'o', 'i', ' ', 'k', 'a', 'i', 'k
', 'e', 'n', 'l', 'a', 'i', 's', 'e', 't', ' ', 'm', 'o', 'n', 'e', 'n', 'm', 'u', 'o', 't', 'o', 'i', 's', 'e',
't', ' ', 's', 'i', 'k', 'e', 's', 'i', '\n', 'o', 'h', 'r', 'a', ' ', 'o', 'n', ' ', 'y', 'k', 's', 'i', 'n', '
', 'n', 'o', 'u', 's', 'e', 'm', 'a', 't', 't', 'a', ' ', 't', 'o', 'u', 'k', 'o', ' ', 'k', 'a', 'l', 'l', 'i',
's', ' ', 'k', 'a', 's', 'v', 'a', 'm', 'a', 't', 't', 'a', '\n']
>>> ''.join(atomized_lowercase_kalevala)
'kasvoi maahan marjanvarret kukat kultaiset keolle\nruohot kasvoi kaikenlaiset monenmuotoiset sikesi\nohra on yksin nousematta touko kallis kasvamatta\n'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment