MIKKO RAHIKKA

The electrical things have their lives too, paltry as those lives are.


Tekstin virkkeiden pituus Pythonilla

Pari vuotta sitten kirjoitin blogiini Seitsemässä veljeksen sanojen pituuksista. Sitä varten olin tuottanut koodin, jonka avulla tutkin kirjan tekstiä. Ystäväni Hannu Korhonen pyysi apua liittyen artikkeliin, jossa tutkitaan virkkeiden pituuksia eri kielissä. Muokkasin vanhaa koodia ja niin saimme aikaiseksi tietoa virkkeiden pituuksista eri kirjoissa. Suurin osa tutkimistamme teksteistä on Project Gutenbergistä.

Linkki koodiin Google Colabissa löytyy artikkelin lopusta. Tee siitä kopio omalle koneellesi, niin voit muokata sitä itse.

Tässä tarinassa käytän esimerkkinä Tommi Kinnusen Pimeät kuut kirjan tekstiä, koska se on hyvä kirja ja Tommi antoi kirjansa tekstin käyttöömme.

Tulevassa artikkelissamme tutkimme kirjan tekstin virkkeiden pituuksia. Virkkeet määritellään alkavaksi edellisestä välimerkistä ja päättyvät välimerkkiin. Virkkeen päättävinä välimerkkeinä pidetään isoja välimerkkejä eli piste, kysymysmerkki ja huutomerkki.

koodi

Aluksi pitää suorittaa alla olevat kaksi riviä, niiden avulla saa GoogleDriven tiedostot Pythonin käyttöön. Kun solun koodi suoritetaan, niin Colab pyytää lupaa käyttää Driven tiedostoja.

Varsinainen virkkeiden pituuksia tutkiva koodi alkaa tiedoston lukemisella Cola Notebook -kansiosta. Tätä ennen sinne on pitänyt viedä tutkittava tiedosto, tässä minulla se on nimeltään pimeatkuutalkup.txt.

Readlines-metodi lukee tekstitiedoston yhdeksi listaksi, jonka jäseninä on merkkijonoja. Nyt kirja-muuttujan 10 ensimmäistä jäsentä näyttävät tältä. Nuo \n -merkit ovat rivinsiirtoja.

['\n', 'Väsyneille.\n', '\n', 'Opettajan erotodistus\n', '\n', 'Opettajatar Elna Aliina Suorajärvi, joka otettiin Posion kunnan Jyrkkävaaran koulun määräaikaiseksi kansakoulun opettajaksi elokuun 1. päivänä 1946, on siinä työssä ollut tähän asti virkavapautta nauttimatta sekä osoittanut kiitettävää ahkeruutta ja tunnollisuutta, kykyä kurin ja järjestyksen pidossa, kiitettävää opetustaitoa sekä yleensä hoitanut työnsä hyvin samalla kun hänen käytöksensä sekä työssä että sen ulkopuolella on ollut tyydyttävää, josta tämä hänelle todistukseksi annetaan hakiessa työtä Niemen koululta. \n', '\n']

Riveillä 9 – 18 luodaan funktiot, joiden avulla kirjalistan merkkijonoista poistetaan turhat merkit. Periaatteessa tämän olisi voinut tehdä myöhemmin, sen jälkeen kun lista on muutettu yhdeksi merkkijonoksi. Tämä on perua alkuperäisestä sanojen pituuksiin liittyvästä koodista, joka toimi tässä järjestyksessä paremmin.

Kirjan alku on nyt tällainen, pilkut katosivat.

['\n', 'Väsyneille.\n', '\n', 'Opettajan erotodistus\n', '\n', 'Opettajatar Elna Aliina Suorajärvi joka otettiin Posion kunnan Jyrkkävaaran koulun määräaikaiseksi kansakoulun opettajaksi elokuun 1. päivänä 1946 on siinä työssä ollut tähän asti virkavapautta nauttimatta sekä osoittanut kiitettävää ahkeruutta ja tunnollisuutta kykyä kurin ja järjestyksen pidossa kiitettävää opetustaitoa sekä yleensä hoitanut työnsä hyvin samalla kun hänen käytöksensä sekä työssä että sen ulkopuolella on ollut tyydyttävää josta tämä hänelle todistukseksi annetaan hakiessa työtä Niemen koululta. \n', '\n']

Join-metodin avulla muutetaan kirjalista merkkijonoksi. Nyt koko kirja on yksi pitkä merkkijono.

Merkkijonossa on edelleen mukana rivinsiirrot, niinpä alla niiden kohdalla hypätään udelle riville

Väsyneille.
Opettajan erotodistus
Opettajatar Elna Aliina Suorajärvi joka otettiin Posion kunnan Jyrkkävaaran koulun määräaikaiseksi kansakoulun opettajaksi elokuun 1. päivänä 1946 on siinä työssä

Jos olisin ollut oikein fiksu, olisin keksinyt miten olisin voinut selviytyä ilman tätä merkkijonomuutosta, mutta koska menetelmä toimii, niin en jaksanut käyttää aikaa koodin viilaamiseen. Merkkijonoksi muuttamista tarvitaan, jotta saadaan lainausmerkit pois tekstistä, samalla poistetaan peräkkäiset välilyönnit. Muutetaan merkkijono takaisin listaksi.

Kirjalista näyttää nyt tältä. Kirjan tekstin sanat ovat listan jäseniä.

['Väsyneille.', 'Opettajan', 'erotodistus', 'Opettajatar', 'Elna', 'Aliina', 'Suorajärvi', 'joka', 'otettiin', 'Posion', 'kunnan', 'Jyrkkävaaran', 'koulun', 'määräaikaiseksi', 'kansakoulun', 'opettajaksi', 'elokuun', '1.', 'päivänä', '1946']

Varsinainen laskenta tehdään rivien 36-46 silmukalla. Rivin 40 if-lauseen ehto tutkii päättyykö tarkasteltava sana johonkin välimerkitlistan välimerkeistä. Tulokset tallennetaan tulos muuttujaan, joka on tyypiltään sanakirja (dictionary).

Tulossanakirja on nyt tällainen. Ensimmäinen jäsen 1:114 tarkoittaa, että yhden sanan mittaisia virkkeitä kirjassa on 114.

{1: 114, 17: 75, 49: 1, 38: 3, 6: 378, 2: 171, 18: 46, 10: 299, 12: 238, 13: 168, 8: 344, 5: 466, 9: 312, 3: 350, 19: 45, 7: 382, 4: 425, 14: 128, 22: 14, 11: 235, 15: 102, 23: 21, 16: 92, 20: 32, 26: 4, 37: 2, 21: 27, 24: 14, 25: 9, 27: 5, 31: 5, 28: 2, 34: 1, 30: 2, 47: 1, 39: 1, 29: 2, 50: 1}

Tulostusta ja kuvaajaa varten järjestetään tulossanakirja ja tuotetaan pituus- ja lkmlistat.

10 ensimmäistä pituus- ja lkmlistan jäsentä alla. 

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[114, 171, 350, 425, 466, 378, 382, 344, 312]

Tallennetaan pituudet ja vastaavat lukumäärät merkkijonoina tekstitiedostoon tabulaattorieroteltuna, \t on tabulaattori.

Tekstitiedoston pimeatkuut1 alku näyttää tältä. Copy-Pastella sen saa suoraan taulukkolaskenta-ohjelmiin, esimerkiksi GeoGebran laskentataulukkoon.

Tehdään vielä matplotlib-kirjaston avulla pylväsdiagrammi.

Alla koodin tuottama kuvaaja.

Varsinainen artikkelimme aiheesta tultaneen julkaisemaan jossain julkaisussa joskus :o) 

lähteet

Linkki artikkelissa esitettyyn koodiin Colabissa
https://colab.research.google.com/drive/1cvVlEhdwSHDefE3KoHda19dAIyppakPI?usp=sharing

Blogiartikkelini Seitsemän veljestä on Poissonjakautunut
https://mikkorahikka.blog/2020/12/13/seitseman-veljesta-on-poisson-jakautunut/

Project Gutenberg
https://www.gutenberg.org/

Tommi Kinnusen Pimeät kuut
https://www.wsoy.fi/kirja/tommi-kinnunen/pimeat-kuut/9789510480991

Yksi vastaus artikkeliin “Tekstin virkkeiden pituus Pythonilla”

Jätä kommentti

This site uses Akismet to reduce spam. Learn how your comment data is processed.