Spacy ja NLP: näin tietokoneesi ymmärtää suomea

Olen tuskaillut vuosikausia sitä että tietokoneita on vaikea saada ymmärtämään suomen kieltä. Kielemme on pieni ja sen ymmärtämiseen ei ole käytetty yhtä paljon resursseja kuin suurten indoeurooppalaisten kielten opettamiseen tietokoneille. Monine sijamuotoineen suomi onkin erityisen hankala kieli tietokoneparoille.
Mitä on NLP? Lyhenne viittaa huvittavasti kahteen eri ilmiöön: psykologian puolella NLP on neurolingvistinen ohjelmointi (Neuro-Linguistic Programming), jota jotkut voivat pitää hieman pseudotieteellisenä, mutta tietojenkäsittelytieteen puolella NLP on luonnollisen kielen käsittely (Natural Language Processing), jossa on kyse siitä että tietokone yrittää tulkita ihmisten puhumia luonnollisesti syntyneitä kieliä.
Tietokoneen ohjelmointikielet ovat huomattavasti ihmisen kieltä yksinkertaisempia ja loogisempia. Erilaista monitulkintaisuutta ei ole. Uudella tietokonekielellä voi oppia kirjoittamaan yksinkertaisen ohjelman yhdessä illassa, mutta kestää hyvin kauan oppia kirjoittamaan järjellinen tekstinpätkä ihmiskielellä. Eipä siis ole ihme että on ollut hyvin vaikeaa saada tietokoneet kaivamaan esille merkityksiä ihmiskielistä.
Suomenkielinen NLP on kuitenkin muuttunut viime vuosina paljon helpommaksi ja on nyt aivan tavallisen avoimen lähdekoodin koodarin ulottuvissa. Tähän syynä ovat Turun Yliopistossa toimivan TurkuNLP-tutkimusryhmän suomenkieliset mallit, jotka ovat helposti käytettävissä Python-ohjelmointikielen Spacy-kirjaston kautta.
Spacy suomeksi
Miten tämä tapahtuu käytännössä? Otetaanpas selvää! Tässä pikaoppaassa oletetaan että tietokoneellesi on asennettu Python 3. Aluksi täytyy asentaa Spacy-ohjelmistokirjasto seuraavalla komennolla:
pip install spacy
Kun Spacy on asennettu tarvitsemme myös suomenkielisen mallin. TurkuNLP:n tarjoamat Spacy-mallit perustuvat uutisteksteihin. Tarjolla on pieni, keskikokoinen ja suuri malli. Valitsemme tässä tapauksessa suuren mallin.
python -m spacy download fi_core_news_lg
Spacy jäsentää tekstin merkkeihin (token), millä ei tarkoiteta kirjoitusmerkkiä vaan tekstin merkitsevää osaa, esimerkiksi yksittäistä sanaa tai merkitsevää lauseen päättävää pistettä. Lisäksi Spacy osaa esittää niiden roolin lauseessa. Kokeillaanpa seuraavaa pientä ohjelmaa:
# Käytetään Spacy-kirjastoa
import spacy
# Ladataan suomenkielinen malli nlp-muuttujaan
nlp = spacy.load("fi_core_news_lg")
# Syötetäään teksti doc-muuttujaan
doc = nlp("Käärijä on voittanut Euroviisut.")
# Käydään doc-muuttujan token-merkit läpi
for token in doc:
# Tulostetaan tokenin teksti, perusmuoto, sanaluokka ja sanan tehtävä lauseessa
print(token.text, token.lemma_, token.pos_, token.dep_)
Ohjelman pitäisi antaa seuraava ulostulo:
Käärijä Käärijä NOUN nsubj
on olla AUX aux
voittanut voittaa VERB ROOT
Euroviisut Euroviisut NOUN obj
. . PUNCT punct
Ensimmäisenä on tekstissä oleva sana (token.text), seuraavana sen perusmuoto (token.lemma_), sanaluokka (token.pos_) ja sanan tehtävä lauseessa (token.dep_). Käärijä jäsentyy lauseen subjektiksi (nsubj), voittanut lauseen predikaatiksi ja Euroviisut lauseen objektiksi (obj). On helppoa nähdä että jo tällä voidaan jäsentää yksinkertaisia lauseita.
Spacy tarjoaa muutakin. Se osaa myös tunnistaa tekstissä olevia nimettyjä entiteettejä (named entity recognition). Kokeillaan seuraavaa koodinpätkää:
# Käytetään Spacy-kirjastoa
import spacy
# Ladataan suomenkielinen malli nlp-muuttujaan
nlp = spacy.load("fi_core_news_lg")
# Syötetäään teksti doc-muuttujaan
doc = nlp("Suomi on liitynyt Natoon.")
# Käydään doc-muuttujan entiteetit läpi
for entity in doc.ents:
# Tulostetaan entiteetin teksti ja tunniste
print(entity.text, entity.label_)
Koodin pitäisi tuottaa seuraava ulostulo:
Suomi GPE
Natoon ORG
Spacy tunnistaa entiteetit Suomi ja Nato. Suomen tyyppi on GPE eli geopoliittinen entiteetti, Nato on ORG eli organisaatio.
Mitä seuraavaksi?
Jo näillä yksinkertaisilla esimerkeillä pystyy jäsentämään suomenkielisistä lauseista yksinkertaisia subjekti-predikaatti-objekti-tyyppisiä tulkintoja ja löytämään niissä olevia entiteettejä. Jatkamme Spacyn tutkimista myöhemmin tutoriaalisarjan toisessa osassa.
Vastaa