Sanojen hakua: grep -o

Pureudutaan nyt koko suomenkielisen Wikipedian tekstiaineistoon. Mitkä mahtavat olla kaikkein yleisimmät sanat?

Tämä ei ole erityisen hyvin määritelty kysymys, kun ei ole mitenkään ilmiselvää, mitä edes tarkoitetaan "sanalla" ja miten pitäisi suhtautua kaikenlaisiin wikitekstissä esiintyviin ohjauskomentoihin. Mutta aloitetaan tutkiminen muutamalla helpolla kokeella, ja tarkennetaan sitten tarpeen mukaan.

Joka tapauksessa olisi hyödyllistä yrittää jollain tapaa saada kaivettua kaikki sanat yhteen listaan niin, että kullakin rivillä esiintyy vain yksi sana. Tämän jälkeen osaisimmekin samaan tapaan kuin edellä komentojen sort, uniq -c ja sort -n -r avulla löytää yleisimmät sanat. Miten päästäisiin tähän?

Aloitetaan aivan pienestä. Haetaan esimerkkinä vaikkapa Wikipedian Lapio-artikkelin wikitekstistä yksi virke:

Tavallisimpia lapion malleja ovat kärkilapio (tunnettu myös nimellä [[pistolapio]]), betonilapio eli tasakärkilapio, viljalapio ja [[lumilapio]].

Tallennetaan tämä kokeeksi tiedostoon lapio.txt, niin voimme helposti tehdä kokeita lyhyellä tekstinpätkällä. Meitä ei tässä kiinnosta välimerkit ja erikoismerkit kuten ., ( ja [, vaan haluaisimme jollain tapaa saada kaivettua pelkästään sanat kuten Tavallisimpia ja lapion.

Komento grep on jo tuttu, ja olemme käyttäneet sitä tähän asti etsimään rivejä, jotka sopivat tiettyyn hahmoon. Valitsimella -o (eli pidemmin --only-matching) voidaan kuitenkin etsiä rivien sisältä kaikki tekstinpätkät, jotka sopivat tiettyyn hahmoon. Mutta millaista hahmoa haluaisimme etsiä? Miten saisimme kuvattua haun "tekstinpätkät, jotka näyttävät sanoilta"? Voisimme yrittää luetella kaikki mahdolliset sanoissa esiintyvät kirjaimet kuten a, b, c, …, mutta tämä menee työlääksi. Onneksi grep tukee myös merkkiluokkia, joiden avulla voi suoraan sanoa esimerkiksi "mikä tahansa kirjainmerkki". Hahmo [[:alpha:]] tekee juuri tämän: se osuu mihin tahansa yksittäiseen kirjainmerkkiin kuten "a" tai "ä". Hahmo [[:alpha:]][[:alpha:]] siis osuisi mihin tahansa kahden kirjaimen mittaiseen pätkään. Ja kun muistetaan, että * tarkoittaa edellisen toistamista kuinka monta kertaa tahansa (myös nolla), hahmo [[:alpha:]][[:alpha:]]* osuisi kaikkiin tekstinpätkiin, joissa on yksi tai useampi kirjainmerkki.

Kokeillaan saman tien! Meillä on tiedostossa lapio.txt yhden virkkeen verran Wikipediasta otettua tekstiä. Ajetaan tämä komento:

grep -o '[[:alpha:]][[:alpha:]]*' lapio.txt

Tuloksena pitäisi tulla tällaista:

Tavallisimpia
lapion
malleja
ovat
kärkilapio
tunnettu
myös
nimellä
pistolapio
betonilapio
eli
tasakärkilapio
viljalapio
ja
lumilapio

Tarkista, että tulos on juuri haluttu myös omalla koneellasi! Kiinnitä erityisesti huomiota siihen, että merkit ä ja ö toimivat oikein!

Ongelmia?

Jos jostain syystä omalla koneellasi tulos näyttää väärältä, kaikkein tavallisin ongelma liittyy koneen maa-asetuksiin. Helpoin korjaus on siirtyä käyttämään Aallon Linux-koneita, joissa kaikki asetukset on valmiiksi oikein, mutta pidempi tarina löytyy tämän moduulin lopussa olevasta luvusta Maa-asetukset!

Palautusta lähetetään...