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 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 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 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) 2011-02-04 5 / 17 miten täsmätään oikeat korjaukset järjestettyihin ehdotuksiin Oikaisulukuvirhekorpus 2011-02-04 6 / 17 Vertailtavat oikaisulukuaineistot 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ä 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 7 / 17 2011-02-04 8 / 17
Tiedostojen yhdistely vierekkäin: paste Sarakkeiden yhdistely awkilla 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 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 9 / 17 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: 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? 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 11 / 17 2011-02-04 12 / 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 13 / 17 2011-02-04 14 / 17 Oikaisulukuaineistojen nouto Korjausaineistojen yhdistely haetaan kurssisivuaineistosta: clt131/materiaalit/fiwiki.virhekorpus clt131/materiaalit/fiwiki.1.korjaukset clt131/materiaalit/fiwiki.2.korjaukset Make-skriptissä tiedostojen noudon voi esittää muodossa: fiwiki.virhekorpus: <tab>wget... 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 15 / 17 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);} 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