CLT131: Tekstityökalut 2011, kahdeksas luento Tommi A Pirinen tommi.pirinen@helsinki.fi Helsingin yliopisto Kieliteknologian oppiaine, Nykykielten laitos 2011-02-04 2011-02-04 1 / 17
Asialista 1 Käytännön asiat 2 Ongelman kuvaus 3 Menetelmät ja aineistot Aineistot Menetelmät 4 Toteutus 2011-02-04 2 / 17
Merkistöistä ja kalvostoista Huomattiin, taas, harjoitustehtävistä, että kalvostoista kopioidut ja liitetyt esimerkit eivät suoraan toimi Windowsilla/Puttyllä, johtuen eräiden koodiesimerkkien esitysmuotojen erilaisuudesta: kahdesta viivasta tulee kalvoissa helposti ajatusviiva: - suorista konekirjoituslainausmerkeistä tulee kaarevat: sirkumfleksistä tulee vääränlainen: ˆ jne. sen sijaan tehtävien malliratkaisuissa on varmasti oikeat merkinnät 2011-02-04 3 / 17
Asialista 1 Käytännön asiat 2 Ongelman kuvaus 3 Menetelmät ja aineistot Aineistot Menetelmät 4 Toteutus 2011-02-04 4 / 17
Mitataan oikaisulukujen (tai muun kt-sovelluksen) toimivuutta Tehtäväkuvaus tekstissä olevien kirjoitusvirheiden korjaavia sovelluksia pitää vertailla tarvitaan jonkinmoisiin tilastollisiin lukuihin perustuvaa luokittelua korjauksista Lähtökohdat Ongelmat 2011-02-04 5 / 17
Mitataan oikaisulukujen (tai muun kt-sovelluksen) toimivuutta Tehtäväkuvaus tekstissä olevien kirjoitusvirheiden korjaavia sovelluksia pitää vertailla tarvitaan jonkinmoisiin tilastollisiin lukuihin perustuvaa luokittelua korjauksista Lähtökohdat tunnetaan väärinkirjoitettu sana ja oikea korjaus on joukko oikaisulukimia, jotka arvuuttelevat oikeaa korjausta [0..n] järjestettyä korjausehdotusta Ongelmat 2011-02-04 5 / 17
Mitataan oikaisulukujen (tai muun kt-sovelluksen) toimivuutta Tehtäväkuvaus tekstissä olevien kirjoitusvirheiden korjaavia sovelluksia pitää vertailla tarvitaan jonkinmoisiin tilastollisiin lukuihin perustuvaa luokittelua korjauksista Lähtökohdat tunnetaan väärinkirjoitettu sana ja oikea korjaus on joukko oikaisulukimia, jotka arvuuttelevat oikeaa korjausta [0..n] järjestettyä korjausehdotusta Ongelmat millä mitataan oikaisuluvun hyvyyttä (tarkemmin ks. CLT255) miten täsmätään oikeat korjaukset järjestettyihin ehdotuksiin 2011-02-04 5 / 17
Asialista 1 Käytännön asiat 2 Ongelman kuvaus 3 Menetelmät ja aineistot Aineistot Menetelmät 4 Toteutus 2011-02-04 6 / 17
Oikaisulukuvirhekorpus oikaisuluvun testaamiseen tarvitaan kirjoitusvirheitä ja oikeita korjauksia nyt meillä on Wikipediasta käsin kerättyjä virheitä käytettävän virheiden keruu ja korjausten tarkistaminen on usein työläs tehtävä, esim. tässä on tehty: omorfi-analyse.sh fgrep +? less 2011-02-04 7 / 17
Oikaisulukuvirhekorpus oikaisuluvun testaamiseen tarvitaan kirjoitusvirheitä ja oikeita korjauksia nyt meillä on Wikipediasta käsin kerättyjä virheitä käytettävän virheiden keruu ja korjausten tarkistaminen on usein työläs tehtävä, esim. tässä on tehty: omorfi-analyse.sh fgrep +? less fgrep virhe jokaiselle löydetylle selvittämään oikeaa käännöstä käsin tehdyssä tiedostossa muodon saa päättää itse; päätetään että väärin\<tab>oikein on helppo käsitellä 2011-02-04 7 / 17
Vertailtavat oikaisulukuaineistot oikaisuluvun korjaimen tehtävä on siis antaa käyttäjälle järjestetty lista ehdotuksista listojen järjestämisessä voi yhdistellä erilaisia menetelmiä: mallintaa näppäilyvirheitä näppäimistöllä (Levenshtein-etäisyys): kisas kisa,kissa,kisasi,... kaikki menetelmät tuottavat yleensä oikeita ja vääriä ehdotuksia; pitää arvioida paras 2011-02-04 8 / 17
Vertailtavat oikaisulukuaineistot oikaisuluvun korjaimen tehtävä on siis antaa käyttäjälle järjestetty lista ehdotuksista listojen järjestämisessä voi yhdistellä erilaisia menetelmiä: mallintaa näppäilyvirheitä näppäimistöllä (Levenshtein-etäisyys): kisas kisa,kissa,kisasi,... katsoa saneiden yleisyyttä: kissa > kisa > kisasi kaikki menetelmät tuottavat yleensä oikeita ja vääriä ehdotuksia; pitää arvioida paras 2011-02-04 8 / 17
Vertailtavat oikaisulukuaineistot oikaisuluvun korjaimen tehtävä on siis antaa käyttäjälle järjestetty lista ehdotuksista listojen järjestämisessä voi yhdistellä erilaisia menetelmiä: mallintaa näppäilyvirheitä näppäimistöllä (Levenshtein-etäisyys): kisas kisa,kissa,kisasi,... katsoa saneiden yleisyyttä: kissa > kisa > kisasi kaikki menetelmät tuottavat yleensä oikeita ja vääriä ehdotuksia; pitää arvioida paras voidaan järjestellä ehdotukset myös riveittäin: ehdotus1\<tab>\<tab>ehdotus2... 2011-02-04 8 / 17
Tiedostojen yhdistely vierekkäin: paste jotta voitaisiin laskea esim. awkilla oikeita korjauksia, helpottaa kun saadaan samaan tiedostoon vastaavat rivit kun tässä tapauksessa rivit aina täsmäävät, voidaan käyttää paste-komentoa sellaisenaan; se liittää kahden tiedoston rivit tabilla eroteltuna: paste virhekorpus korjausehdotukset-1 > korjauskorpus-1 nyt korjauskorpuksessa on toinen sarake on oikea sana ja se pitäisi löytyä korjausehdotuksista sarakkeissa kolmannesta eteenpäin 2011-02-04 9 / 17
Sarakkeiden yhdistely awkilla tutusti nyt awk osaa käsitellä rivejä saneittain eli sarakkeittain awkin komentoriveissä käytetyt ehdot voivat puuttua sarakkeiden samuuteen vertailuoperaattorilla ==: awk $2 == $3 {print} tulosta rivit joilla kolmas sarake on sama kuin toinen 2011-02-04 10 / 17
Tulosten vertailu ja tulostus awkilla awkilla voi myös tehdä laskelmia; erikoisehdoissa BEGIN ja END voi alustaa ja tulostaa laskelmia. Usein halutaankin prosentteja absoluuttisten lukujen sijaan: 2011-02-04 11 / 17
Tulosten vertailu ja tulostus awkilla awkilla voi myös tehdä laskelmia; erikoisehdoissa BEGIN ja END voi alustaa ja tulostaa laskelmia. Usein halutaankin prosentteja absoluuttisten lukujen sijaan: BEGIN {ekat = 0; kaikki = 0;} nollataan laskurit 2011-02-04 11 / 17
Tulosten vertailu ja tulostus awkilla awkilla voi myös tehdä laskelmia; erikoisehdoissa BEGIN ja END voi alustaa ja tulostaa laskelmia. Usein halutaankin prosentteja absoluuttisten lukujen sijaan: BEGIN {ekat = 0; kaikki = 0;} nollataan laskurit $2 == $3 {ekat++;} lasketaan täsmäävät {kaikki++;} lasketaan rivien määrää 2011-02-04 11 / 17
Tulosten vertailu ja tulostus awkilla awkilla voi myös tehdä laskelmia; erikoisehdoissa BEGIN ja END voi alustaa ja tulostaa laskelmia. Usein halutaankin prosentteja absoluuttisten lukujen sijaan: BEGIN {ekat = 0; kaikki = 0;} nollataan laskurit $2 == $3 {ekat++;} lasketaan täsmäävät {kaikki++;} lasketaan rivien määrää END {printf("oikeita tuloksia %d/%d = %.2f %%",ekat,kaikki, 100*ekat/kaikki);} tulostetaan täsmäävien osuus riveistä kirjoitettaessa komentoriville koko rimpsu menisi yhdeksi riviksi; myös awkit voi tallentaa tiedostoihin ja suorittaa awk -f skripti.awk 2011-02-04 11 / 17
Tulosten vertailu ja tulostus awkilla awkilla voi myös tehdä laskelmia; erikoisehdoissa BEGIN ja END voi alustaa ja tulostaa laskelmia. Usein halutaankin prosentteja absoluuttisten lukujen sijaan: BEGIN {ekat = 0; kaikki = 0;} nollataan laskurit $2 == $3 {ekat++;} lasketaan täsmäävät {kaikki++;} lasketaan rivien määrää END {printf("oikeita tuloksia %d/%d = %.2f %%",ekat,kaikki, 100*ekat/kaikki);} tulostetaan täsmäävien osuus riveistä kirjoitettaessa komentoriville koko rimpsu menisi yhdeksi riviksi; myös awkit voi tallentaa tiedostoihin ja suorittaa awk -f skripti.awk ohita vaihtoehto? 2011-02-04 11 / 17
Vaihtoehtoinen, awkiton täsmäystapa: join voidaan käsitellä virhekorpusta ja ehdotustiedostoja tietokantoina join on siis tietokantamaailman join-komento; yhdistää rivit jos annetut sarakkeet täsmäävät ommi.pirinen@helsinki.fi (Helsingin yliopisto Kieliteknologian CLT131: oppiaine, 8. luento Nykykielten laitos) 2011-02-04 12 / 17
Vaihtoehtoinen, awkiton täsmäystapa: join voidaan käsitellä virhekorpusta ja ehdotustiedostoja tietokantoina join on siis tietokantamaailman join-komento; yhdistää rivit jos annetut sarakkeet täsmäävät joinin komento on yleensä join -1 sarake1-2 sarake2 tiedosto1 tiedosto2, joissa siis sarake1 on ensimmäisen tiedoston sarake joka täsmätään toisen tiedoston sarakkeeseen sarake2: join -1 2-2 1 virhekorpus korjaukset tulostaa rivit joissa korjausten ensimmäinen sarake on oikea 2011-02-04 12 / 17
Vaihtoehtoinen, awkiton täsmäystapa: join voidaan käsitellä virhekorpusta ja ehdotustiedostoja tietokantoina join on siis tietokantamaailman join-komento; yhdistää rivit jos annetut sarakkeet täsmäävät joinin komento on yleensä join -1 sarake1-2 sarake2 tiedosto1 tiedosto2, joissa siis sarake1 on ensimmäisen tiedoston sarake joka täsmätään toisen tiedoston sarakkeeseen sarake2: join -1 2-2 1 virhekorpus korjaukset tulostaa rivit joissa korjausten ensimmäinen sarake on oikea (rivien sisältö on tässä irrelevantti, sillä haluamme vain laskea ne, mutta lopputulos on sellainen rivi jossa on yhdistetty sarake kerran ja sitten muut sarakkeet järjestyksessä) 2011-02-04 12 / 17
Asialista 1 Käytännön asiat 2 Ongelman kuvaus 3 Menetelmät ja aineistot Aineistot Menetelmät 4 Toteutus 2011-02-04 13 / 17
Työsuunnitelma 1 rakennetaan Make-skriptiä tulevia aineistoja varten 2 noudetaan pari oikaisulukuaineistoa 3 yhdistellään virhekorpuksen kanssa 4 lasketaan prosentit ensimmäisenä oikein annetuille riveille 2011-02-04 14 / 17
Oikaisulukuaineistojen nouto haetaan kurssisivuaineistosta: wget http://www.ling.helsinki.fi/kit/2010s/ clt131/materiaalit/fiwiki.virhekorpus wget http://www.ling.helsinki.fi/kit/2010s/ clt131/materiaalit/fiwiki.1.korjaukset wget http://www.ling.helsinki.fi/kit/2010s/ clt131/materiaalit/fiwiki.2.korjaukset 2011-02-04 15 / 17
Oikaisulukuaineistojen nouto haetaan kurssisivuaineistosta: wget http://www.ling.helsinki.fi/kit/2010s/ clt131/materiaalit/fiwiki.virhekorpus wget http://www.ling.helsinki.fi/kit/2010s/ clt131/materiaalit/fiwiki.1.korjaukset wget http://www.ling.helsinki.fi/kit/2010s/ clt131/materiaalit/fiwiki.2.korjaukset Make-skriptissä tiedostojen noudon voi esittää muodossa: fiwiki.virhekorpus: <tab>wget... 2011-02-04 15 / 17
Korjausaineistojen yhdistely yhdistely pastella oli suoraviivainen: paste virhekorpus korjaukset 2011-02-04 16 / 17
Korjausaineistojen yhdistely yhdistely pastella oli suoraviivainen: paste virhekorpus korjaukset Make-skriptin sääntö monelle tiedostolle on monimutkaisempi, muttei paljoa: %.korjauskorpus: fiwiki.%.korjaukset fiwiki.virhekorpus <tab>paste fiwiki.virhekorpus $< 2011-02-04 16 / 17
Mittaustulosten esitys mittaustuloksille oli pitkähkö awk-skripti: BEGIN {ekat = 0; kaikki = 0;} $2 == $3 {ekat++;} {kaikki++;} END {printf("oikeita tuloksia %d/%d = %.2f %%",ekat,kaikki, 100*ekat/kaikki);} 2011-02-04 17 / 17
Mittaustulosten esitys mittaustuloksille oli pitkähkö awk-skripti: BEGIN {ekat = 0; kaikki = 0;} $2 == $3 {ekat++;} {kaikki++;} END {printf("oikeita tuloksia %d/%d = %.2f %%",ekat,kaikki, 100*ekat/kaikki);} jos sen tallentaa tiedostoon ekat-prosentit.awk, voidaan rakentaa Make-skripti: %.tulokset: %.korjauskorpus <tab>awk -f ekat-prosentit.awk < $< > $@ 2011-02-04 17 / 17
Mittaustulosten esitys mittaustuloksille oli pitkähkö awk-skripti: BEGIN {ekat = 0; kaikki = 0;} $2 == $3 {ekat++;} {kaikki++;} END {printf("oikeita tuloksia %d/%d = %.2f %%",ekat,kaikki, 100*ekat/kaikki);} jos sen tallentaa tiedostoon ekat-prosentit.awk, voidaan rakentaa Make-skripti: %.tulokset: %.korjauskorpus <tab>awk -f ekat-prosentit.awk < $< > $@ nyt siis make 1.tulokset saa aikaan korpuksen 1 tulosprosentin tiedostoon 2011-02-04 17 / 17