[Next] [Up] [Previous] [Contents]
Next: Tekstinkäsittelymenetelmät Up: Ctl531: Kurssimateriaalia Previous: 4 Mikroverkko

Työkaluja tekstiaineiston käsittelyyn

Kaikki tässä jakossa käsiteltävät ohjelmat ovat alunperin peräisin Unix-käyttöjärjestelmästä, minkä takia niille annetaan valitsimet yhdysmerkin ''-'' edeltäminä. Valitsimet annetaan heti komennon nimen (ja sitä seuraavan välilyönnin) jälkeen.

Kaikki esitellyt ohjelmat ovat vapaasti kopioitavissa ja käytettävissä ainakin ei-kaupallisesti.

Säännölliset lausekkeet  

Säännölliset lausekkeet eivät ole mikään yksittäinen työkaluohjelma, mutta koska eräät työkaluohjelmat osaavat käyttää säännöllisiä lausekkeita, niiden esittely tässä on perusteltua.

Säännöllinen lauseke (regular expression, RE) kuvaa säännöllisen kielen.[+] Äärimmäisen pelkistetty esimerkki säännöllisestä kielestä olkoon kieli ''mugalog'', johon kuuluvat sanat, jotka koostuvat merkkijonoista, joissa ''AB'' toistuu peräkkäin nolla tai useampia kertoja, ts. ('''' tarkoittaa tyhjää merkkijonoa, epsilonia):

'''', AB, ABAB, ABABAB ...

Kielentutkijalle säännöllisistä lausekkeista on hyötyä etsittäessä tekstiaineistosta sanoja, jotka kuuluvat jonkin säännöllisen lausekkeen kuvaamaan ''kieleen''. Löydettäessä tekstistä osuma (kieleen kuuluva sana), voidaan suorittaa sille jokin toimenpide. Yleensä toimenpiteenä on osuman tulostaminen kuvaruudulle tai tiedostoon, toisaalta voidaan kaikki osumat muuttaa haluttujen sääntöjen mukaan - esimerkiksi vain merkitä <osuma> kulmasuluilla.

Säännöllisten lausekkeiden tarkka syntaksi vaihtelee jossain määrin käytettävän ohjelman ja kontekstin mukaan. Seuraavat merkintätavat ovat jokseenkin vakiintuneita:

[IMAGE (tabular)]

Esimerkkimme säännöllisen kielen ''mugalog'' kuvaava säännöllinen lauseke voisi olla (AB)* . Mieti, miksi ei AB* ?

5.2 Merkkimuunnokset: tr

tr muuttaa merkkejä toisiksi yksi kerrallaan. Yhtä sisään lukemaansa merkkiä kohden ohjelma tulostaa enintään yhden merkin, eli se ei siis yleensä sovi merkkijonomuunnoksiin.

tr:lle annetaan mahdollisten valitsimien lisäksi kaksi argumenttia: muunnettavien merkkien joukko ja niitä vastaavien tulostettavien merkkien joukko. Merkkijoukot voivat olla tavallisia merkkijonoja tai merkkivälejä, joiden alku- ja loppumerkki on erotettu yhdysmerkillä ''-''. tr korvaa kunkin muunnettavan merkin sillä merkillä, joka on tulostettavien merkkien joukossa kyseisellä kohdalla. Erikoismerkit voi esittää muodossa \nnn, missä nnn on merkin oktaalikoodi. Käytännössä usein käsitellään rivinvaihtoja; rivinvaihtomerkin koodi on \012.

Esimerkkejä (lainausmerkit argumenttien ympärillä eivät yksinkertaisimmissa esimerkeissä ole välttämättömiä):

Ohjelma tunnistaa seuraavat valitsimet:

-d
''delete'', poistaa merkkejä. Ohjelmalle annetaan tällöin parametrina vain yksi merkkijoukko, eli ne merkit, jotka halutaan poistaa.

-c
''complement'', muuttaa (valitsimen -d kanssa poistaa) kaikki paitsi ensimmäisessä argumentissa annetut merkit.

-s
''squeeze'', jättää peräkkäisistä samanlaisista tulostettavista merkeistä jäljelle vain yhden.

tr toimii vain suodattimena, ts. komentoketjussa, jossa se saa syötteen uudelleenohjauksena joko toiselta ohjelmalta tai tiedostosta. Siis:

Järjestäminen

5.3.1 Asort

Asort on Anssi Yli-Jyrän kirjoittama erittäin pelkistetty järjestämisohjelma, joka järjestää tiedoston riveittäin järjestykseen. Järjestys perustuu yksinomaan merkkien ASCII-arvoihin, niinpä suomalaiskansalliset merkit tulevat väärään järjestykseen. Ohjelmalla on vain yksi valitsin:

-r
''reverse'', järjestää rivit käänteiseen järjestykseen.

Myös asort on perinteinen suodatinohjelma, eli se ei tunnista komentoriville kirjoitettua tiedostonimeä. Siksi lajiteltava aineisto on ohjattava asortille kulmamerkillä:

5.3.2 gsort

gsort (GNU sort[+]) on asortia monipuolisempi järjestämisohjelma, joka ymmärtää huomattavan joukon valitsimia (tässä eivät ole vielä kaikki):

-c
ainoastaan tarkistaa, onko tiedosto järjestyksessä.

-tC
jossa C on jokin merkki. Käyttää C:tä kenttien erottimena, hyödyllistä jos halutaan järjestää tiedosto jonkin muun kuin ensimmäisen kentän mukaan. Oletusarvoisesti ohjelma tulkitsee kenttien erottimeksi yhden tai useamman välilyönnin.

-u
kuten uniq-ohjelma; poistaa peräkkäiset samanlaiset rivit.

-b
ei välitä sananväleistä.

-d
''dictionary'', sanakirjajärjestys: ei ota aakkostuksessa huomioon välimerkkejä.

-f
''fold'', käsittelee pien- ja suuraakkoset samanarvoisina. Oletusarvoisesti (ASCII-arvojen mukaan) suuraakkoset tulevat ennen pienaakkosia.

-n
''numeric'' järjestää kentän numerojärjestykseen. Ilman tätä valitsinta 10 tulisi ennen 2:ta.

-r
''reverse'', käänteinen järjestys.

+N
N on järjestettävän avainkentän numero, ensimmäinen kenttä on 0. Avainkenttiä voi antaa useitakin. Tällöin ohjelma järjestää ensisijaisesti ensimmäisenä annetun kentän mukaan; jos kentän arvot ovat samat useilla riveillä, järjestetään ne toisen kentän mukaan jne.

gsortkaan ei järjestä suomalaiskansallisia merkkejä oikein, vaan se laskee saksalaiseen tapaan å:n ja ä:n a:ksi ja ö:n o:ksi.

5.4 Unikisointi: uniq

GNU sortissa oli valitsin -u, jolla voidaan tulostaa järjestetystä tiedostosta vain erilaiset rivit; ts. jos tiedostossa on useita samanlaisia rivejä peräkkäin, niistä tulostetaan vain yksi. Asortia käytettäessä voidaan tulostus ohjata erilliselle ohjelmalle, joka hoitaa tämän ''unikisoinnin''.

asort journal.wrd | uniq \end{itemize} {\tt uniq} tuntee kolme valitsinta:
-u
tulostaa vain kerran esiintyneet rivit.

-d
tulostaa vain useammin kuin kerran esiintyneet rivit.

-c
tulostaa jokaisen rivin alkuun hakasulkeissa samanlaisten rivien lukumäärän.

uniqin toiminta on yleensä järkevää vain tiedoston ollessa valmiiksi järjestetty - järjestämättömässä tiedostossa harvoin on peräkkäin identtisiä rivejä.

5.5 Poiminnat: grep-ohjelmat

grep-ohjelmilla[+] voi poimia tekstitiedostoista rivejä joilla esiintyy haluttu merkkijono tai jokin sopivan säännöllisen lausekkeen esiintymä.

DOSiin sovitettuja grep-ohjelmia ovat mm. dgrep ja ggrep. ggrep on näistä kahdesta useimmiten nopeampi, mutta siinä on yksi vakava rajoitus: se katkaisee yli 255 merkkiä pitkät rivit. Kieliaineistossa, jossa kukin virke on yhdellä rivillä, näin pitkät rivit eivät ole lainkaan harvinaisia, joten se ei sovi sellaisen käsittelyyn. dgrep osaa käsitellä huomattavasti pitempiä rivejä (ainakin 15merkin mittaisia), ja lisäksi siinä on muutamia ggrepistä puuttuvia ominaisuuksia. Tämän takia kannattaneekin käyttää ensisijaisesti dgrepiä; seuraavassa käsitellään kuitenkin myös ggrepiä.

ggrep toimii normaalisti kuten DOSin find: se etsii parametrina annettua merkkijonoja tiedostosta ja tulostaa ne rivit, joilla merkkijono esiintyy. Esim.

ggrep "str" journal.snt

ggrepin tärkein valitsin on -e, joka saa ohjelman käsittelemään etsittävää hahmoa säännöllisenä lausekkeena. Mitä eroa on seuraavilla komennoilla?

ggrep "[ei][ei]" journal.snt

ggrep -e "[ei][ei]" journal.snt

dgrep sen sijaan käsittelee etsittävää hahmoa aina säännöllisenä lausekkeena; dgrep tunnistaa kyllä myös valitsimen -e, mutta sillä ei useimmissa tapauksissa ole merkitystä. Jos edellä olevissa komennoissa komento olisi dgrep, niillä ei olisi mitään eroa.

Sekä dgrep että ggrep tuntevat mm. seuraavat hyödylliset valitsimet:

-v
(tulostaa ne rivit, joilla ei esiinny etsittävää merkkijonoa)

-c
(tulostaa vain löytyneiden rivien määrän, ei itse rivejä)

-n
(lisää kunkin löytyneen rivin alkuun rivin järjestysnumeron tiedostossa)

-f file
(ggrep lukee etsittävät merkkijonot, joita voi olla useita, tiedostosta file ja suorittaa poiminnan kerran kullakin; dgrepiä käytettäessä tiedosto ei voi sisältää kuin yhden etsittävän säännöllisen lausekkeen)

Näiden lisäksi dgrep tuntee valitsimen -i, joka saa ohjelman pitämään pien- ja suuraakkosia samanarvoisina etsinnässä (dgrep osaa käsitellä oikein myös suomalaiskansalliset merkit). Ilman tätä valitsinta ne tulkitaan eri merkeiksi.



[Next] [Up] [Previous] [Contents]
Next: Tekstinkäsittelymenetelmät Up: Ctl531: Kurssimateriaalia Previous: 4 Mikroverkko



Jyrki.Niemi@Helsinki.FI