CLT255: Harjoitustyö

Kurssin suorittamiseen kuuluu luentomateriaalin yhteydessä annettujen tehtävien lisäksi yksi harjoitustyö, josta tehdään muutaman sivun mittainen selostus. Harjoitustyö sisältää jonkun tai joitakin tilastollisia analyysejä, selostuksen niistä askelista, joilla käsittely on suoritettu sekä analyysitulosten tulkinnan. Selostuksen voi tehdä sellaisella tekstinkäsittelyohjelmalla, jonka käyttöön on tottunut tai vaikkapa verkkosivun muotoon. Työ palautetaan joko vain verkko-osoitteena tai sitten PDF-muotoisena sähköpostin liitteenä.

Harjoitustyön voi tehdä joko jostakin alla luetellusta aiheesta tai itse valitusta aiheesta, josta on sopinut sähköpostitse luennoijan kanssa. Kummassakin tapauksessa, lähettäkää luennoijalle viesti, josta käy ilmi harjoitustyön aihe. Jos aiheiden määrittelyssä ilmenee kysyttävä, kysykää herkästi.

Käyttäkää työtä tehdessänne herkästi keskustelualuetta, joka on tarkoitettu nimenomaan harjoitustyön tekijöille.

Harjoitustyö A (havainnollistamista ja visualisointia)

Hipulla on hakemistossa /kielipankki/words/sktp joukko valmiiksi laskettuja erilaisten sananmuotojen frekvenssejä. Osa tiedostoista eli kooltaan suurimmat sisältävät Suomen kielen tekstipankin (SKTP) aineistoista laskettuja täydellisempiä listoja ja jotkut pienemmät taajuuslistan eniten esiintyneitä sananmuotoja. SKTP-aineisto jakautuu kahteen osaan lisenssinsä perusteella (akateemisiin käyttöihin aca ja myös kaupallisiin kieliteknologisten sovellusten kehittämiseen sallittuihin biz).

Sananmuodon pituuden laskemiseksi pitää laatia esim. pieni Python-ohjelman pätkä tai etsiä R:n funktioista sellainen (nchar(x,type="bytes")), jolla sanan pituuden saa lasketuksi R:n puolella.

Tehtävänä on ottaa esimerkiksi kärkifrekvenssejä edustava sanat.biz.33000.txt tiedosto ja selvitellä sen perusteella suomenkielisen tekstin sanamuotojen frekvenssien jakautumaa ja frekvenssin riippuvuutta sananmuodon pituudesta. Tehtävänä olisi selvitellä, millainen on frekvenssien jakautuma (ovatko kappalemäärillä kuvatut frekvenssit sellaisenaan havainnollistettavissa vai esim. niiden logaritmit). Toisena tehtävänä olisi sananmuotojen pituuden ja frekvenssin välisen suhteen hahmottaminen ja visualisointi. Ks. erillinen ohje kuvien liittämisestä omaan dokumenttiin.

Harjoitustyö B (ristiintaulukointia ja testausta)

HKV-aineistossa on enimmäkseen luokittelumuuttujia, jotka erottavat virkkeitä laadullisesti, esimerkiksi syntaktisten ilmiöiden mukaan. Tällaisten muuttujien avulla syntyy taulukoita, jotka kuvaavat kunkin muuttujan saamien eri arvojen määriä. Eräs muuttuja kuvaa tekstilajia eli genreä, joka olisi mielenkiintoinen sikäli, että syntyy mielekkäitä kysymyksiä siitä, ovatko tiettyjen muuttujien jakautumat eri tekstilajeissa samoja vai eroavatko ne melkein merkitsevästi, merkitsevästi tai erittäin merkitsevästi toisistaan.

Tutki siis HKV-kirjaa ja selvittele muuttujien arvoja taulukoimalla, mikä muuttuja tekstilajia kuvaavan luokittelija lisäksi olisi jakautumaltaan sellainen, että testaaminen voisi olla mielekästä. Tee sitten tälle khin neliö -testi, jolla selvität parittain joidenkin tekstilajien eroja.

Harjoitustyö C (kaksikielinen korpus)

Verrataan englanniksi kirjoitettua teosta ja sen suomenkielistä käännöstä. Tämän sivun liitteenä on kaksi Gutenbergin arkistosta kotoisin olevaa tekstiä, Connan Doylen "Hound of Baskervilles" ja sen suomenkielinen käännös "Baskervillen koira". Teksti on virkkeistetty siten, että enimmäkseen rivillä on yksi virke. Ensimmäisen kolmen luvun osalta (noin kuudesosa tekstin pituudesta) on näissä kahdessa tiedostossa kohdistettu siten, että vastinrivit olisivat toistensa käännösvastineita. Silloin tällöin kääntäjä on tehnyt kahdesta virkkeestä yhden, jolloin englanninkielisessä versiossa on kaksi virkettä samalla rivillä, mutta välissä on kaksi peräkkäistä välilyöntiä. Vastaavasti kun yksi virke on käännetty kahdeksi eri virkkeeksi, käännökset on pantu samalle riville kahden välilyönnin erottamana.

Ota siis nuo kaksi tiedostoa ja eristä niistä tuo kohdistettu kolmen ensimmäisen luvun osuus. Tehtävänä on muodostaa havaintoaineisto, jossa yksikköinä ovat vastinvirkkeet. Yhtenä muuttujana olisi siten englanninkielisen virkkeen pituus ja toisena muuttujana vastaavan suomenkielisen virkkeen pituus. Siksi aineistoksi otetaan vain keskenään kohdistettu osuus, jossa samannumeroiset virkkeet ovat toistensa käännösvastineita (ottaen huomioon, että toisessa vastineessa on joskus kaksikin virkettä).

Tarkastellaan näiden virkkeiden pituuksia merkkeinä. Jos virkkeet lukee suoraan R:ään yhdeksi muuttujaksi, pituuden voi laskea sielläkin. Muuten pituuden voi laskea vaikka pienellä Python-ohjelman pätkällä. Kaksi aineistoa voi käsitellä erikseen. Huomaa, että suomenkielisessä UTF-8 -koodatussa 'ä' ja 'ö' ovat kahden tietokonetavun (byte) mittaisia (mikä ei kuitenkaan ole ongelma Python 3:ssa, eikä R:n nchar() -funktiolle). Seuraava Python 3 -kielinen ohjelmanpätkä laskee kunkin rivin pituuden ja tulostaa niistä yksimuuttujaisen havaintomatriisin, jonka voi lukea read.table() -komennolla:

import sys
print("LEN")
for line in sys.stdin:
    ll = len(line) - 1
    print(ll,)

Havainnollista virkkeiden pituuden yhteisvaikutusta eli samansuuntaisuutta piirtämällä ns. hajontadiagrammi, laskemalla korrelaatiokerroin, sekä testaamalla korrelaatiokertoimen merkitsevyyttä (nollahypoteesina se, että korrelaatio olisi nolla). (Huomaa kuitenkin, että jakautuma ei todellisuudessa ehkä ole normaalijakautuman mukainen, eikä testaus ole siinä mielessä oikea, eikä P-arvoja voi tulkita niin kuin pitäisi. Tässä tehtävässä saa kuitenkin laskea korrelaatiokertoimin oletuksella, että jakautuma olisi normaali.) Liitä hyödylliseksi katsomasi kuviot selostukseesi, ks. erillinen ohje kuvan saamisesta omaan dokumenttiin.

Harjoitustyö D (yhden tekstin homogeenisuus)

Tarkastellaan yhtä teosta ajatuksella, että ovatko sen eri osat keskenään samanlaisia. Ota edellisen tehtävän englanninkielinen Baskervillen koiran virketiedosto. Pura kahden välilyönnin erottamat samalle riville laitetut virkkeet erillisiksi. (Voit tehdä sen Linux/Unix -järjestelmässä komennolla sed 's/  /\n/' kokeile kuitenkin pikku esimerkeillä.) Muodosta virkkeiden pituuksista muuttuja. Muistathan, että voit ottaa muuttujasta X osia esim. merkinnällä X[1001:1500]. (Nuo kahden välilyönnin kohdat voi myös etsiä ja korvata rivinvaihdolla käyttäen tavallista ohjelmaeditoria kuten Emacsia.)

Etsi näin muodostetusta yhden muuttujan aineistosta esim. sadan virkkeen jaksoja, jotka ovat keskenään hyvin erilaisia virkkeen keskipituuden suhteen. Osoita kokeilemalla eri pituisilla näytteillä tällaisilta alueilta, minkä mittaisella näytteellä ero jää vaille tilastollista melkein merkitsevää tasoa ja esimerkiksi millaisella tämä taso saavutetaan. Tässä tehtävässä voidaan olettaa virkkeiden pituuksien jakautuvan riittävän normaalisti.

Harjoitustyö E (kirjan teksti aikasarjana)

Ajatellaan, että kirjan juoni saattaisi edistyä jaksoittain tai ainakin siinä voisi olla jonkinlaisia toisistaan eroavia ja keskenään vuorottelevia ilmiöitä. Peräkkäiset virkkeet eivät ole mitenkään riippumattomia toisistaan. Voidaan ajatella, että pitkää virkettä seuraa todennäköisemmin toinen pitkä virke ja lyhyttä puolestaan lyhyt, siis tekstistä löytyisi jaksoja, joissa on keskimääräistä pitempiä virkkeitä (esimerkiksi, kun kerrotaan ulkopuolisen kannalta), tai lyhyempiä virkkeitä (esimerkiksi, kun toimintajakson aikana asetetaan sanoja suoraan henkilöiden suuhun).

Kun yhteen liimatut virkkeet on jaettu omille riveilleen, aineiston voi lukea R:ään seuraavasti:

> E = read.table("baskeren.snt", sep="\t", header=F, quote="", stringsAsFactors=F)
> summary(E)
      V1           
 Length:3999   
 Class :character  
 Mode  :character
Tässä on käytetty read.table -funktion erinäisiä parametreja, jotta virkkeet saadaan ahdetuksi yhden muuttujan arvoksi ilman, että ne on merkitty lainausmerkeillä (joita ikävä kyllä aineistossa on muutenkin). Parametri quote hoitaa lainausmerkkien puutteen, stringsAsFactors hoitaa sen, että samanlaisina toistuvat virkkeet pidetään erillisinä havaintoina. Komennolla summary on hyvä tarkistaa, että tuli oikea määrä havaintoja. Vastaavasti voi kokeilla yksittäisiä virkkeitä, esim. E$V1[100], että ne ovat menneet oikeanlaisina.

> y = nchar(E$V1)
Funktiolla nchar saadaan virkkeiden pituudet merkkeinä vektoriksi y. Aikasarjoja voi piirtää seuraavasti:
> plot(ts(y))
mutta tämä ei ole kovin informatiivinen tällaisena. Aikasarjassa on liikaa pisteitä, jotka tempoilevat ylös ja alas. Tarvitaan jonkinlaista käyrän tasoitusta. Funktio runmed(y,7) korvaa y:n arvot sen ja kolmen edellisen ja kolmen seuraavan arvon mediaanilla. Kokeile, millaisella "ikkunalla" aikasarjaan saa lupaavannäköistä säännönmukaisuutta. Liitä kuva selostukseesi, ks. kuvan ottaminen R:stä omaan dokumenttiin.

Tee vertailu satunnaisella keinotekoisella aineistolla, jollaisen saat rnorm(4000, mean=80, sd=60) -funktiolla, johon laitat aikasarjan y keskiarvon ja hajonnan. Tee sama tasoitus kuin kirjan virkkeiden pituuksille ja piirrä. Vertaa tätä kirjasta saatujen pituuksien käyrään. Kuvaile samanlaisuuksia ja ennen kaikkea eroja.

-- KimmoKoskenniemi - 2011-12-09

Liitteet:


Topic attachments
I Attachment Action Size Date Who Comment
Unknown file formatsnt baskeren.snt manage 308.8 K 2011-12-15 - 20:06 KimmoKoskenniemi Baskerville engl. virkkeittäin
Unknown file formatsnt baskerfi.snt manage 340.6 K 2011-12-15 - 20:07 KimmoKoskenniemi Baskerville suom. virkkeittäin
Topic revision: r8 - 2012-02-06 - KimmoKoskenniemi
 
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2018 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback