• Ei tuloksia

CLT131: Tekstityökalut 2010, viides luento

N/A
N/A
Info
Lataa
Protected

Academic year: 2024

Jaa "CLT131: Tekstityökalut 2010, viides luento"

Copied!
63
0
0

Kokoteksti

(1)

CLT131: Tekstityökalut 2010, viides luento

Tommi A Pirinen

tommi.pirinen@helsinki.fi

Helsingin yliopisto

Kieliteknologian oppiaine, Nykykielten laitos

2010-12-09 päivitetty: 2010-12-16

(2)

Asialista

Käytännön asiat

Ongelman kuvaus

Menetelmät ja aineistot

Toteutus

Viitteitä

(3)

Kurssipalaute

Kerätään kurssin puolivälistä kurssipalaute elomakkeella, tästä saa yhden tehtäväpisteen seuraaviin harjoituksiin.

(4)

Tuleva ohjelma

I harjoitusten deadline tiistaina — laskarit keskiviikkona

I nämä ja seuraavat luennot käsittelevät lähinnä lisää säännöllisiä lausekkeita korpusten siistimiseen

I ensi luennoilla esitellään yksi monimutkaisemmista merkkauksista siistittäväksi — siitä laajentamalla saa suoraan yhden harjoitustehtävän

I näillä luennoilla on myös suhteellisen monimutkainen esimerkki awkin käytöstä

I kevät aloitetaan tammikuun lopussa todennäköisesti kertaamalla säännölliset lausekkeet ja laajentamalla skriptausta ja tiedostojenhallintaa (esim. make)

(5)

Asialista

Käytännön asiat

Ongelman kuvaus

Menetelmät ja aineistot

Toteutus

Viitteitä

(6)

Tutkimusongelma: saneparien todennäköisyyslistan

Tehtäväkuvaus:

I Halutaan taajuuksittain järjestetty lista sanepareista (bigrammeja) esim. ennakoivan tekstinsyötön parantamiseksi

Lähtökohdat:

I Europarl-korpus

I haetaan vain saneita

Ongelmat:

I lähtöteksti XML-merkattua: uusi formaatti siistittäväksi

I jokainen sane esiintyy kahdessa parissa: edeltävän ja seuraavan kanssa

I rivien aluissa ja lopuissa ei ole perinteisillä tekstityökaluilla edeltävää tai vastaavasti seuraavaa paria

I todennäköisyyslistaan halutaan laskea frekvenssin sijaan todennäköisyys (P = CSf )

(7)

Tutkimusongelma: saneparien todennäköisyyslistan

Tehtäväkuvaus:

I Halutaan taajuuksittain järjestetty lista sanepareista (bigrammeja) esim. ennakoivan tekstinsyötön parantamiseksi

Lähtökohdat:

I Europarl-korpus

I haetaan vain saneita

Ongelmat:

I lähtöteksti XML-merkattua: uusi formaatti siistittäväksi

I jokainen sane esiintyy kahdessa parissa: edeltävän ja seuraavan kanssa

I rivien aluissa ja lopuissa ei ole perinteisillä tekstityökaluilla edeltävää tai vastaavasti seuraavaa paria

I todennäköisyyslistaan halutaan laskea frekvenssin sijaan todennäköisyys (P = CSf )

(8)

Tutkimusongelma: saneparien todennäköisyyslistan

Tehtäväkuvaus:

I Halutaan taajuuksittain järjestetty lista sanepareista (bigrammeja) esim. ennakoivan tekstinsyötön parantamiseksi

Lähtökohdat:

I Europarl-korpus

I haetaan vain saneita Ongelmat:

I lähtöteksti XML-merkattua: uusi formaatti siistittäväksi

I jokainen sane esiintyy kahdessa parissa: edeltävän ja seuraavan kanssa

I rivien aluissa ja lopuissa ei ole perinteisillä tekstityökaluilla edeltävää tai vastaavasti seuraavaa paria

I todennäköisyyslistaan halutaan laskea frekvenssin sijaan todennäköisyys (P = CSf )

(9)

Tutkimusongelma: saneparien todennäköisyyslistan

Tehtäväkuvaus:

I Halutaan taajuuksittain järjestetty lista sanepareista (bigrammeja) esim. ennakoivan tekstinsyötön parantamiseksi

Lähtökohdat:

I Europarl-korpus

I haetaan vain saneita Ongelmat:

I lähtöteksti XML-merkattua: uusi formaatti siistittäväksi

I jokainen sane esiintyy kahdessa parissa: edeltävän ja seuraavan kanssa

I rivien aluissa ja lopuissa ei ole perinteisillä tekstityökaluilla edeltävää tai vastaavasti seuraavaa paria

I todennäköisyyslistaan halutaan laskea frekvenssin sijaan todennäköisyys (P = CSf )

(10)

Tutkimusongelma: saneparien todennäköisyyslistan

Tehtäväkuvaus:

I Halutaan taajuuksittain järjestetty lista sanepareista (bigrammeja) esim. ennakoivan tekstinsyötön parantamiseksi

Lähtökohdat:

I Europarl-korpus

I haetaan vain saneita Ongelmat:

I lähtöteksti XML-merkattua: uusi formaatti siistittäväksi

I jokainen sane esiintyy kahdessa parissa: edeltävän ja seuraavan kanssa

I rivien aluissa ja lopuissa ei ole perinteisillä tekstityökaluilla edeltävää tai vastaavasti seuraavaa paria

I todennäköisyyslistaan halutaan laskea frekvenssin sijaan todennäköisyys (P = CSf )

(11)

Tutkimusongelma: saneparien todennäköisyyslistan

Tehtäväkuvaus:

I Halutaan taajuuksittain järjestetty lista sanepareista (bigrammeja) esim. ennakoivan tekstinsyötön parantamiseksi

Lähtökohdat:

I Europarl-korpus

I haetaan vain saneita Ongelmat:

I lähtöteksti XML-merkattua: uusi formaatti siistittäväksi

I jokainen sane esiintyy kahdessa parissa: edeltävän ja seuraavan kanssa

I rivien aluissa ja lopuissa ei ole perinteisillä tekstityökaluilla edeltävää tai vastaavasti seuraavaa paria

I todennäköisyyslistaan halutaan laskea frekvenssin sijaan todennäköisyys (P = CSf )

(12)

Asialista

Käytännön asiat

Ongelman kuvaus

Menetelmät ja aineistot

Toteutus

Viitteitä

(13)

Aineisto: Euroopan parlamentin puheenvuorot

I http://www.statmt.org/europarl/— monikielinen aineisto tilastolliseen kääntämiseen

I XML-merkkaus pitää siistiä ja poistaa

I teksti jaettu moneen pieneen tiedostoon

I katsostaan esimerkiksi

europarl/txt/fi/ep-00-01-17.txt

(14)

Aineisto: Euroopan parlamentin puheenvuorot

I http://www.statmt.org/europarl/— monikielinen aineisto tilastolliseen kääntämiseen

I XML-merkkaus pitää siistiä ja poistaa

I teksti jaettu moneen pieneen tiedostoon

I katsostaan esimerkiksi

europarl/txt/fi/ep-00-01-17.txt

(15)

Aineisto: Euroopan parlamentin puheenvuorot

I http://www.statmt.org/europarl/— monikielinen aineisto tilastolliseen kääntämiseen

I XML-merkkaus pitää siistiä ja poistaa

I teksti jaettu moneen pieneen tiedostoon

I katsostaan esimerkiksi

europarl/txt/fi/ep-00-01-17.txt

(16)

Menetelmät: säännöllisten lausekkeiden komplementtiryhmät

I joskus on hyödyllistä täsmätä kaikkeen paitsi tiettyihin merkkeihin

I säännöllisten lausekkeiden joukot voi kääntää

komplementiksisirkumfleksi-hakasuluilla[ˆ ]; kokeillaan:

I egrep ’[ˆaeiouyäö ]’— ei vokaali tai välilyönti

I egrep ’[ˆaeiouyäö ]*[aeiouyäö]*[ˆaeiouyäö ]+’— konsonanttiklusterien rajaama vokaaliaines

I sed -r -e

’s/[ˆ[:digit:]]*

([+-]?[[:digit:]]+[.,]?[[:digit:]]*) /\1/’— poimitaan rivin ensimmäinen luku

(17)

Menetelmät: säännöllisten lausekkeiden komplementtiryhmät

I joskus on hyödyllistä täsmätä kaikkeen paitsi tiettyihin merkkeihin

I säännöllisten lausekkeiden joukot voi kääntää

komplementiksisirkumfleksi-hakasuluilla[ˆ ]; kokeillaan:

I egrep ’[ˆaeiouyäö ]’— ei vokaali tai välilyönti

I egrep ’[ˆaeiouyäö ]*[aeiouyäö]*[ˆaeiouyäö ]+’— konsonanttiklusterien rajaama vokaaliaines

I sed -r -e

’s/[ˆ[:digit:]]*

([+-]?[[:digit:]]+[.,]?[[:digit:]]*) /\1/’— poimitaan rivin ensimmäinen luku

(18)

Menetelmät: säännöllisten lausekkeiden komplementtiryhmät

I joskus on hyödyllistä täsmätä kaikkeen paitsi tiettyihin merkkeihin

I säännöllisten lausekkeiden joukot voi kääntää

komplementiksisirkumfleksi-hakasuluilla[ˆ ]; kokeillaan:

I egrep ’[ˆaeiouyäö ]’— ei vokaali tai välilyönti

I egrep ’[ˆaeiouyäö ]*[aeiouyäö]*[ˆaeiouyäö ]+’— konsonanttiklusterien rajaama vokaaliaines

I sed -r -e

’s/[ˆ[:digit:]]*

([+-]?[[:digit:]]+[.,]?[[:digit:]]*) /\1/’— poimitaan rivin ensimmäinen luku

(19)

Menetelmät: awk-ohjelmointikielen matematiikka

I todennäköisyyden laskemiseen tarvitaan awkin laskuominaisuuksia

I awk käsittelee useimmat matemaattiset lausekkeet

itsestäänselvällä syntaksilla:1 + 2,4 - 1,2 * 5,10 / 2jne.

I muuttujat ja sijoitus totuttuun tapaan yhtäsuuruusmerkillä: yks = 1; kaks = 2; kolme = yks + kaks

I sekä luvuilla että muuttujilla voi viitata tekstin saneisiin:

$kaks = $2toinen sane

I huomattavaa tulostettaessa: awk seuraa locale-asetuksia: print 2/3= 0,66667

(20)

Menetelmät: awk-ohjelmointikielen matematiikka

I todennäköisyyden laskemiseen tarvitaan awkin laskuominaisuuksia

I awk käsittelee useimmat matemaattiset lausekkeet

itsestäänselvällä syntaksilla:1 + 2,4 - 1,2 * 5,10 / 2jne.

I muuttujat ja sijoitus totuttuun tapaan yhtäsuuruusmerkillä: yks = 1; kaks = 2; kolme = yks + kaks

I sekä luvuilla että muuttujilla voi viitata tekstin saneisiin:

$kaks = $2toinen sane

I huomattavaa tulostettaessa: awk seuraa locale-asetuksia: print 2/3= 0,66667

(21)

Menetelmät: awk-ohjelmointikielen matematiikka

I todennäköisyyden laskemiseen tarvitaan awkin laskuominaisuuksia

I awk käsittelee useimmat matemaattiset lausekkeet

itsestäänselvällä syntaksilla:1 + 2,4 - 1,2 * 5,10 / 2jne.

I muuttujat ja sijoitus totuttuun tapaan yhtäsuuruusmerkillä:

yks = 1; kaks = 2; kolme = yks + kaks

I sekä luvuilla että muuttujilla voi viitata tekstin saneisiin:

$kaks = $2toinen sane

I huomattavaa tulostettaessa: awk seuraa locale-asetuksia: print 2/3= 0,66667

(22)

Menetelmät: awk-ohjelmointikielen matematiikka

I todennäköisyyden laskemiseen tarvitaan awkin laskuominaisuuksia

I awk käsittelee useimmat matemaattiset lausekkeet

itsestäänselvällä syntaksilla:1 + 2,4 - 1,2 * 5,10 / 2jne.

I muuttujat ja sijoitus totuttuun tapaan yhtäsuuruusmerkillä:

yks = 1; kaks = 2; kolme = yks + kaks

I sekä luvuilla että muuttujilla voi viitata tekstin saneisiin:

$kaks = $2toinen sane

I huomattavaa tulostettaessa: awk seuraa locale-asetuksia: print 2/3= 0,66667

(23)

Menetelmät: awk-ohjelmointikielen matematiikka

I todennäköisyyden laskemiseen tarvitaan awkin laskuominaisuuksia

I awk käsittelee useimmat matemaattiset lausekkeet

itsestäänselvällä syntaksilla:1 + 2,4 - 1,2 * 5,10 / 2jne.

I muuttujat ja sijoitus totuttuun tapaan yhtäsuuruusmerkillä:

yks = 1; kaks = 2; kolme = yks + kaks

I sekä luvuilla että muuttujilla voi viitata tekstin saneisiin:

$kaks = $2toinen sane

I huomattavaa tulostettaessa: awk seuraa locale-asetuksia:

print 2/3= 0,66667

(24)

Menetelmät: awkin valmiit muuttujat ja ehtokenttä

I joitain asioita saa awkissa valmiina muuttujina:

I NF— kenttien määrä

I NR— rivinumero

I awkin komennothan olivat muotoa ehto {komennot}

I ehtokin voi olla matemaattinen lauseke:

I awk ’NF > 2 {print}’tulostaa vain yli kaksisaneiset rivit

I awk ’NR => 13 {print}’tulosta rivistä kolmetoista alkaen

(25)

Menetelmät: awkin valmiit muuttujat ja ehtokenttä

I joitain asioita saa awkissa valmiina muuttujina:

I NF— kenttien määrä

I NR— rivinumero

I awkin komennothan olivat muotoa ehto {komennot}

I ehtokin voi olla matemaattinen lauseke:

I awk ’NF > 2 {print}’tulostaa vain yli kaksisaneiset rivit

I awk ’NR => 13 {print}’tulosta rivistä kolmetoista alkaen

(26)

Menetelmät: awkin valmiit muuttujat ja ehtokenttä

I joitain asioita saa awkissa valmiina muuttujina:

I NF— kenttien määrä

I NR— rivinumero

I awkin komennothan olivat muotoaehto{komennot}

I ehtokin voi olla matemaattinen lauseke:

I awk ’NF > 2 {print}’tulostaa vain yli kaksisaneiset rivit

I awk ’NR => 13 {print}’tulosta rivistä kolmetoista alkaen

(27)

Menetelmät: awk-ohjelmointikielen toisto

I saneparit on mahdoillista saada erotettua myös sedillä

I rivinrajojen ohitus ym. vaatisi mutkikkaampia korvauksia kuin ohjelmallisempi ratkaisu

I siis: käsitellään rivin saneet awkin toistorakenteella

I awkin toistolauseke on myösfor, kuten bashissa, mutta se on muotoafor (aloitus; lopetusehto;

toisto) {toistettavat}(kuten C-kielessä, javassa jne.):

I aloitus on komento joka suoritetaan ennen alkua; yleensä laskurin lähtökohta (esim.kentta=1aloitetaan 1. kentästä)

I lopetusehto on ehtolauseke, joka kertoo milloin lopetetaan toisto; yleensä laskurin loppukohta (esim.kentta <3 pienemmät kuin 3)

I toisto on joka kierroksen jälkeen suoritettava komento; yleensä laskurin muunnos (esim.kentta++kasvata yhdellä)

I kokeillaan:awk ’{for (kentta = 1; kentta < 3; kentta++) {print $kentta}}

(28)

Menetelmät: awk-ohjelmointikielen toisto

I saneparit on mahdoillista saada erotettua myös sedillä

I rivinrajojen ohitus ym. vaatisi mutkikkaampia korvauksia kuin ohjelmallisempi ratkaisu

I siis: käsitellään rivin saneet awkin toistorakenteella

I awkin toistolauseke on myösfor, kuten bashissa, mutta se on muotoafor (aloitus; lopetusehto;

toisto) {toistettavat}(kuten C-kielessä, javassa jne.):

I aloitus on komento joka suoritetaan ennen alkua; yleensä laskurin lähtökohta (esim.kentta=1aloitetaan 1.

kentästä)

I lopetusehto on ehtolauseke, joka kertoo milloin lopetetaan toisto; yleensä laskurin loppukohta (esim.kentta <3 pienemmät kuin 3)

I toisto on joka kierroksen jälkeen suoritettava komento; yleensä laskurin muunnos (esim.kentta++kasvata yhdellä)

I kokeillaan:awk ’{for (kentta = 1; kentta < 3; kentta++) {print $kentta}}

(29)

Menetelmät: awk-ohjelmointikielen toisto

I saneparit on mahdoillista saada erotettua myös sedillä

I rivinrajojen ohitus ym. vaatisi mutkikkaampia korvauksia kuin ohjelmallisempi ratkaisu

I siis: käsitellään rivin saneet awkin toistorakenteella

I awkin toistolauseke on myösfor, kuten bashissa, mutta se on muotoafor (aloitus; lopetusehto;

toisto) {toistettavat}(kuten C-kielessä, javassa jne.):

I aloitus on komento joka suoritetaan ennen alkua; yleensä laskurin lähtökohta (esim.kentta=1aloitetaan 1.

kentästä)

I lopetusehto on ehtolauseke, joka kertoo milloin lopetetaan toisto; yleensä laskurin loppukohta (esim.kentta <3 pienemmät kuin 3)

I toisto on joka kierroksen jälkeen suoritettava komento; yleensä laskurin muunnos (esim.kentta++kasvata yhdellä)

I kokeillaan:awk ’{for (kentta = 1; kentta < 3; kentta++) {print $kentta}}

(30)

Menetelmät: awk-ohjelmointikielen toisto

I saneparit on mahdoillista saada erotettua myös sedillä

I rivinrajojen ohitus ym. vaatisi mutkikkaampia korvauksia kuin ohjelmallisempi ratkaisu

I siis: käsitellään rivin saneet awkin toistorakenteella

I awkin toistolauseke on myösfor, kuten bashissa, mutta se on muotoafor (aloitus; lopetusehto;

toisto) {toistettavat}(kuten C-kielessä, javassa jne.):

I aloitus on komento joka suoritetaan ennen alkua; yleensä laskurin lähtökohta (esim.kentta=1aloitetaan 1.

kentästä)

I lopetusehto on ehtolauseke, joka kertoo milloin lopetetaan toisto; yleensä laskurin loppukohta (esim.kentta <3 pienemmät kuin 3)

I toisto on joka kierroksen jälkeen suoritettava komento;

yleensä laskurin muunnos (esim.kentta++kasvata yhdellä)

I kokeillaan:awk ’{for (kentta = 1; kentta < 3; kentta++) {print $kentta}}

(31)

Menetelmät: awk-ohjelmointikielen toisto

I saneparit on mahdoillista saada erotettua myös sedillä

I rivinrajojen ohitus ym. vaatisi mutkikkaampia korvauksia kuin ohjelmallisempi ratkaisu

I siis: käsitellään rivin saneet awkin toistorakenteella

I awkin toistolauseke on myösfor, kuten bashissa, mutta se on muotoafor (aloitus; lopetusehto;

toisto) {toistettavat}(kuten C-kielessä, javassa jne.):

I aloitus on komento joka suoritetaan ennen alkua; yleensä laskurin lähtökohta (esim.kentta=1aloitetaan 1.

kentästä)

I lopetusehto on ehtolauseke, joka kertoo milloin lopetetaan toisto; yleensä laskurin loppukohta (esim.kentta <3 pienemmät kuin 3)

I toisto on joka kierroksen jälkeen suoritettava komento;

yleensä laskurin muunnos (esim.kentta++kasvata yhdellä)

I kokeillaan:awk ’{for (kentta = 1; kentta < 3;

kentta++) {print $kentta}}

(32)

Asialista

Käytännön asiat

Ongelman kuvaus

Menetelmät ja aineistot

Toteutus

Viitteitä

(33)

Työsuunnitelma

I haetaan korpus (wget)

I puretaan se (tar)

I otetaan vain tarpeellinen (ln -s;vain tämä tarvitsee tehdä hipulla)

I siistitään XML-merkkaus (→sed)

I muunnetaan saneet pareiksi (→awk)

I lasketaan frekvenssit (sort, uniq)

I muunnetaan frekvenssit todennäköisyyksiksi (→awk)

(34)

Työsuunnitelma

I haetaan korpus (wget)

I puretaan se (tar)

I otetaan vain tarpeellinen (ln -s; vain tämä tarvitsee tehdä hipulla)

I siistitään XML-merkkaus (→sed)

I muunnetaan saneet pareiksi (→awk)

I lasketaan frekvenssit (sort, uniq)

I muunnetaan frekvenssit todennäköisyyksiksi (→awk)

(35)

Työsuunnitelma

I haetaan korpus (wget)

I puretaan se (tar)

I otetaan vain tarpeellinen (ln -s; vain tämä tarvitsee tehdä hipulla)

I siistitään XML-merkkaus (→sed)

I muunnetaan saneet pareiksi (→awk)

I lasketaan frekvenssit (sort, uniq)

I muunnetaan frekvenssit todennäköisyyksiksi (→awk)

(36)

Korpuksen haku ja purkaminen

Tätä ei tarvitse toistaa, koska korpus on iso (n. 1 Gt.) ja voidaan käyttää samaa:

I wget http:

//www.statmt.org/europarl/v5/europarl.tgz

I tar xcvf europarl.tgz

Tällä saa asken puretun version käytettäväkseen (jos oikeudet ovat kunnossa):

I ln -s /fs/metawrk/tpirinen/europarl/txt/fi

$HOME/europarl-fi

(37)

Korpuksen haku ja purkaminen

Tätä ei tarvitse toistaa, koska korpus on iso (n. 1 Gt.) ja voidaan käyttää samaa:

I wget http:

//www.statmt.org/europarl/v5/europarl.tgz

I tar xcvf europarl.tgz

Tällä saa asken puretun version käytettäväkseen (jos oikeudet ovat kunnossa):

I ln -s /fs/metawrk/tpirinen/europarl/txt/fi

$HOME/europarl-fi

(38)

XML-siistintä

I lähes yleisellä tasolla: kaikki kulmasulkeissa olevat merkkaukset pois:<CHAPTER ID=1><SPEAKER ID=2 LANGUAGE=”EN” NAME=”Evans, Robert J”>

I joskus merkkauksessakin voi olla tarvittavaa lisätekstiä: (esim. HTML:ssä:<img title=”kuva

jonkinlaisesta joulukuusesta” src=”joulukuusi.jpg”>)

I tällä kertaa poistetaan vain kaikki kulmasuljeosiot: tekstinpätkät jotka alkavat <:lla ja päättyvät >:seen ilman muita >:ta välissä:

I sed -r -e ’s/<[ˆ>]*>//g’ europarl-fi/ep-00-01-17.txt

I oikeastaan europarl-korpus on kiltisti tehty niin että

merkkaus on omilla riveillään: grepin –invert-match tarjoaa riittävät siistimismahdollisuudet tähän:

I egrep -invert-match ’ˆ<’

(39)

XML-siistintä

I lähes yleisellä tasolla: kaikki kulmasulkeissa olevat merkkaukset pois:<CHAPTER ID=1><SPEAKER ID=2 LANGUAGE=”EN” NAME=”Evans, Robert J”>

I joskus merkkauksessakin voi olla tarvittavaa lisätekstiä:

(esim. HTML:ssä:<img title=”kuva jonkinlaisesta joulukuusesta”

src=”joulukuusi.jpg”>)

I tällä kertaa poistetaan vain kaikki kulmasuljeosiot: tekstinpätkät jotka alkavat <:lla ja päättyvät >:seen ilman muita >:ta välissä:

I sed -r -e ’s/<[ˆ>]*>//g’ europarl-fi/ep-00-01-17.txt

I oikeastaan europarl-korpus on kiltisti tehty niin että

merkkaus on omilla riveillään: grepin –invert-match tarjoaa riittävät siistimismahdollisuudet tähän:

I egrep -invert-match ’ˆ<’

(40)

XML-siistintä

I lähes yleisellä tasolla: kaikki kulmasulkeissa olevat merkkaukset pois:<CHAPTER ID=1><SPEAKER ID=2 LANGUAGE=”EN” NAME=”Evans, Robert J”>

I joskus merkkauksessakin voi olla tarvittavaa lisätekstiä:

(esim. HTML:ssä:<img title=”kuva jonkinlaisesta joulukuusesta”

src=”joulukuusi.jpg”>)

I tällä kertaa poistetaan vain kaikki kulmasuljeosiot:

tekstinpätkät jotka alkavat <:lla ja päättyvät >:seen ilman muita >:ta välissä:

I sed -r -e ’s/<[ˆ>]*>//g’

europarl-fi/ep-00-01-17.txt

I oikeastaan europarl-korpus on kiltisti tehty niin että

merkkaus on omilla riveillään: grepin –invert-match tarjoaa riittävät siistimismahdollisuudet tähän:

I egrep -invert-match ’ˆ<’

(41)

XML-siistintä

I lähes yleisellä tasolla: kaikki kulmasulkeissa olevat merkkaukset pois:<CHAPTER ID=1><SPEAKER ID=2 LANGUAGE=”EN” NAME=”Evans, Robert J”>

I joskus merkkauksessakin voi olla tarvittavaa lisätekstiä:

(esim. HTML:ssä:<img title=”kuva jonkinlaisesta joulukuusesta”

src=”joulukuusi.jpg”>)

I tällä kertaa poistetaan vain kaikki kulmasuljeosiot:

tekstinpätkät jotka alkavat <:lla ja päättyvät >:seen ilman muita >:ta välissä:

I sed -r -e ’s/<[ˆ>]*>//g’

europarl-fi/ep-00-01-17.txt

I oikeastaan europarl-korpus on kiltisti tehty niin että

merkkaus on omilla riveillään: grepin –invert-match tarjoaa riittävät siistimismahdollisuudet tähän:

I egrep -invert-match ’ˆ<’

(42)

Saneiden parinmuodostus awkilla

I Rivi kerrallaan: otetaan sanat toisesta viimeiseen yhdessä edeltävien sanojen kanssa

I Rivin viimeinen sane muodostaa puolikkaan parin seuraavan rivin ensimmäisen kanssa

I Rivin ensimmäinen sane muodostaa oman puolikkaansa edellisen viimeisen kanssa

I erotetaan sarkaimilla ’\t’

I muoodostetaan awk-komento osa kerrallaan:

I rivin ensimmäinen sane parin loppupuoliskona:print

"\t", $1

I saneet toisesta viimeiseen:for (sane = 2; sane <= NF; sane++) {

I saneparin toinen osa:edellinen = sane - 1

I sarkaimin eroteltuna:print $edellinen, "\t",

$sane }

I viimeinen sane puolikkaaksi riviksi:print $NF

(43)

Saneiden parinmuodostus awkilla

I Rivi kerrallaan: otetaan sanat toisesta viimeiseen yhdessä edeltävien sanojen kanssa

I Rivin viimeinen sane muodostaa puolikkaan parin seuraavan rivin ensimmäisen kanssa

I Rivin ensimmäinen sane muodostaa oman puolikkaansa edellisen viimeisen kanssa

I erotetaan sarkaimilla ’\t’

I muoodostetaan awk-komento osa kerrallaan:

I rivin ensimmäinen sane parin loppupuoliskona:print

"\t", $1

I saneet toisesta viimeiseen:for (sane = 2; sane <= NF; sane++) {

I saneparin toinen osa:edellinen = sane - 1

I sarkaimin eroteltuna:print $edellinen, "\t",

$sane }

I viimeinen sane puolikkaaksi riviksi:print $NF

(44)

Saneiden parinmuodostus awkilla

I Rivi kerrallaan: otetaan sanat toisesta viimeiseen yhdessä edeltävien sanojen kanssa

I Rivin viimeinen sane muodostaa puolikkaan parin seuraavan rivin ensimmäisen kanssa

I Rivin ensimmäinen sane muodostaa oman puolikkaansa edellisen viimeisen kanssa

I erotetaan sarkaimilla ’\t’

I muoodostetaan awk-komento osa kerrallaan:

I rivin ensimmäinen sane parin loppupuoliskona:print

"\t", $1

I saneet toisesta viimeiseen:for (sane = 2; sane <= NF; sane++) {

I saneparin toinen osa:edellinen = sane - 1

I sarkaimin eroteltuna:print $edellinen, "\t",

$sane }

I viimeinen sane puolikkaaksi riviksi:print $NF

(45)

Saneiden parinmuodostus awkilla

I Rivi kerrallaan: otetaan sanat toisesta viimeiseen yhdessä edeltävien sanojen kanssa

I Rivin viimeinen sane muodostaa puolikkaan parin seuraavan rivin ensimmäisen kanssa

I Rivin ensimmäinen sane muodostaa oman puolikkaansa edellisen viimeisen kanssa

I erotetaan sarkaimilla ’\t’

I muoodostetaan awk-komento osa kerrallaan:

I rivin ensimmäinen sane parin loppupuoliskona:print

"\t", $1

I saneet toisesta viimeiseen:for (sane = 2; sane <=

NF; sane++) {

I saneparin toinen osa:edellinen = sane - 1

I sarkaimin eroteltuna:print $edellinen, "\t",

$sane }

I viimeinen sane puolikkaaksi riviksi:print $NF

(46)

Saneiden parinmuodostus awkilla

I Rivi kerrallaan: otetaan sanat toisesta viimeiseen yhdessä edeltävien sanojen kanssa

I Rivin viimeinen sane muodostaa puolikkaan parin seuraavan rivin ensimmäisen kanssa

I Rivin ensimmäinen sane muodostaa oman puolikkaansa edellisen viimeisen kanssa

I erotetaan sarkaimilla ’\t’

I muoodostetaan awk-komento osa kerrallaan:

I rivin ensimmäinen sane parin loppupuoliskona:print

"\t", $1

I saneet toisesta viimeiseen:for (sane = 2; sane <=

NF; sane++) {

I saneparin toinen osa:edellinen = sane - 1

I sarkaimin eroteltuna:print $edellinen, "\t",

$sane }

I viimeinen sane puolikkaaksi riviksi:print $NF

(47)

Saneiden parinmuodostus awkilla

I Rivi kerrallaan: otetaan sanat toisesta viimeiseen yhdessä edeltävien sanojen kanssa

I Rivin viimeinen sane muodostaa puolikkaan parin seuraavan rivin ensimmäisen kanssa

I Rivin ensimmäinen sane muodostaa oman puolikkaansa edellisen viimeisen kanssa

I erotetaan sarkaimilla ’\t’

I muoodostetaan awk-komento osa kerrallaan:

I rivin ensimmäinen sane parin loppupuoliskona:print

"\t", $1

I saneet toisesta viimeiseen:for (sane = 2; sane <=

NF; sane++) {

I saneparin toinen osa:edellinen = sane - 1

I sarkaimin eroteltuna:print $edellinen, "\t",

$sane }

I viimeinen sane puolikkaaksi riviksi:print $NF

(48)

lopullinen skripti

I Voi kestää tovin ymmärtää ja sulatella

I tämänkin voi tallentaa erilliseen tiedostoonawk -F skriptitoimii:

awk ’NF > 2 {print "\t", $1; for (kentta = 2;

kentta <= NF; kentta++) { edellinen = kentta - 1; print $edellinen, "\t", $kentta; } print

$NF}’

(49)

Frekvenssilaskenta (kertausta)

I täysin samoin kuin ennenkin:

I sort | uniq -c | sort -nr

I seuraavaan ?

I tehdään tästä jo skripti (catilla, vimillä, nanolla jne.): 1. #!/bin/bash

2. sort $@ | uniq -c | sort -nr

(50)

Frekvenssilaskenta (kertausta)

I täysin samoin kuin ennenkin:

I sort | uniq -c | sort -nr

I seuraavaan ?

I tehdään tästä jo skripti (catilla, vimillä, nanolla jne.): 1. #!/bin/bash

2. sort $@ | uniq -c | sort -nr

(51)

Frekvenssilaskenta (kertausta)

I täysin samoin kuin ennenkin:

I sort | uniq -c | sort -nr

I seuraavaan ?

I tehdään tästä jo skripti (catilla, vimillä, nanolla jne.):

1. #!/bin/bash

2. sort $@ | uniq -c | sort -nr

(52)

Todennäköisyyden laskenta awkilla

I todennäköisyyden laskentaan tarvitaan sanaparien kokonaismäärä; tallennetaan saneparit tiedostoon saneparit.freqkäsittelyn helpottamiseksi

I sanaparirivien lukumäärä alkuperäisessä tiedostossa tallennetaanbash-muuttujaan:

I CS=$(wc -l < saneparit.freq)

I todennäköisyys oli CSf , f joka rivin frekvenssiuniq -cja CS rivien määräwc -l

I poimitaan awkilla frekvenssidatan ensimmäinen kenttä ja jaetaan se bashista saatavalla muuttujalla; syntaksista tulee väistämättä sotkuisa:

I awk "{print \$1/$CS, \"\t\", \$2, \"\t\",

\$3}"

I Loppuun ?

(53)

Todennäköisyyden laskenta awkilla

I todennäköisyyden laskentaan tarvitaan sanaparien kokonaismäärä; tallennetaan saneparit tiedostoon saneparit.freqkäsittelyn helpottamiseksi

I sanaparirivien lukumäärä alkuperäisessä tiedostossa tallennetaanbash-muuttujaan:

I CS=$(wc -l < saneparit.freq)

I todennäköisyys oli CSf , f joka rivin frekvenssiuniq -cja CS rivien määräwc -l

I poimitaan awkilla frekvenssidatan ensimmäinen kenttä ja jaetaan se bashista saatavalla muuttujalla; syntaksista tulee väistämättä sotkuisa:

I awk "{print \$1/$CS, \"\t\", \$2, \"\t\",

\$3}"

I Loppuun ?

(54)

Todennäköisyyden laskenta awkilla

I todennäköisyyden laskentaan tarvitaan sanaparien kokonaismäärä; tallennetaan saneparit tiedostoon saneparit.freqkäsittelyn helpottamiseksi

I sanaparirivien lukumäärä alkuperäisessä tiedostossa tallennetaanbash-muuttujaan:

I CS=$(wc -l < saneparit.freq)

I todennäköisyys oli CSf , f joka rivin frekvenssiuniq -cja CS rivien määräwc -l

I poimitaan awkilla frekvenssidatanensimmäinenkenttä ja jaetaan se bashista saatavalla muuttujalla; syntaksista tulee väistämättä sotkuisa:

I awk "{print \$1/$CS, \"\t\", \$2, \"\t\",

\$3}"

I Loppuun ?

(55)

Todennäköisyyden laskenta awkilla

I todennäköisyyden laskentaan tarvitaan sanaparien kokonaismäärä; tallennetaan saneparit tiedostoon saneparit.freqkäsittelyn helpottamiseksi

I sanaparirivien lukumäärä alkuperäisessä tiedostossa tallennetaanbash-muuttujaan:

I CS=$(wc -l < saneparit.freq)

I todennäköisyys oli CSf , f joka rivin frekvenssiuniq -cja CS rivien määräwc -l

I poimitaan awkilla frekvenssidatan ensimmäinen kenttä ja jaetaan sebashista saatavalla muuttujalla; syntaksista tulee väistämättä sotkuisa:

I awk "{print \$1/$CS, \"\t\", \$2, \"\t\",

\$3}"

I Loppuun ?

(56)

Todennäköisyyden laskenta awkilla

I todennäköisyyden laskentaan tarvitaan sanaparien kokonaismäärä; tallennetaan saneparit tiedostoon saneparit.freqkäsittelyn helpottamiseksi

I sanaparirivien lukumäärä alkuperäisessä tiedostossa tallennetaanbash-muuttujaan:

I CS=$(wc -l < saneparit.freq)

I todennäköisyys oli CSf , f joka rivin frekvenssiuniq -cja CS rivien määräwc -l

I poimitaan awkilla frekvenssidatan ensimmäinen kenttä ja jaetaan se bashista saatavalla muuttujalla; syntaksista tulee väistämättä sotkuisa:

I awk "{print \$1/$CS, \"\t\", \$2, \"\t\",

\$3}"

I Loppuun ?

(57)

Paketoidaan vaiheet skriptiksi

1. testataan onko korpustest -d europarl:

I haetaan ja pureteaanwget ...; tar zxvf europarl.tgz

I tai kerrotaan virheestä:echo europarl puuttuu

2. muodostetaan parit aiemman kalvon awk-skriptillä:awk -F saneparit.awk

3. lasketaan frekvenssit aiemman kalvon skriptillä:sort | uniq -c | sort -nr

4. muunnetaan frekvenssit toisella awk-skriptilläawk ...

(58)

Paketoidaan vaiheet skriptiksi

1. testataan onko korpustest -d europarl:

I haetaan ja pureteaanwget ...; tar zxvf europarl.tgz

I tai kerrotaan virheestä:echo europarl puuttuu 2. muodostetaan parit aiemman kalvon awk-skriptillä:awk

-F saneparit.awk

3. lasketaan frekvenssit aiemman kalvon skriptillä:sort | uniq -c | sort -nr

4. muunnetaan frekvenssit toisella awk-skriptilläawk ...

(59)

Paketoidaan vaiheet skriptiksi

1. testataan onko korpustest -d europarl:

I haetaan ja pureteaanwget ...; tar zxvf europarl.tgz

I tai kerrotaan virheestä:echo europarl puuttuu 2. muodostetaan parit aiemman kalvon awk-skriptillä:awk

-F saneparit.awk

3. lasketaan frekvenssit aiemman kalvon skriptillä:sort | uniq -c | sort -nr

4. muunnetaan frekvenssit toisella awk-skriptilläawk ...

(60)

Paketoidaan vaiheet skriptiksi

1. testataan onko korpustest -d europarl:

I haetaan ja pureteaanwget ...; tar zxvf europarl.tgz

I tai kerrotaan virheestä:echo europarl puuttuu 2. muodostetaan parit aiemman kalvon awk-skriptillä:awk

-F saneparit.awk

3. lasketaan frekvenssit aiemman kalvon skriptillä:sort | uniq -c | sort -nr

4. muunnetaan frekvenssit toisella awk-skriptilläawk ...

(61)

Valmis skripti:

1. #!/bin/bash

2. if ! test -d europarl ; then

3. echo haepa europarl wgetillä ja pura se 4. fi

5. awk -F saneparit.awk < europarl/fi/* > saneparit.txt 6. sort < saneparit.txt | uniq -c | sort -nr > saneparit.freq 7. CS=$(wc -l < saneparit.freq)

8. awk . . .

(62)

Asialista

Käytännön asiat

Ongelman kuvaus

Menetelmät ja aineistot

Toteutus

Viitteitä

(63)

Kirjallisuus ja linkit

I AWK programming language(978-0201079814)

I Foundations of Statistical NLP(978-0262133609)

Viittaukset

LIITTYVÄT TIEDOSTOT