R-ohjelmointi.org

Tilastotieteellistä ohjelmointia R-kielellä

Tekstinlouhintaa R:llä, osa 2

Kirjoitin jo aiemmin R:n tarjoamista mahdollisuuksista harrastaa tekstinlouhintaa. Tuossa aiemmassa artikkelissa esiteltyjä funktioita on nyt kehitetty hieman eteenpäin, ja toiminnallisuutta on myös paranneltu.

Seuraava esimerkki kuvaa mitä funktioilla voi nykyisin tehdä. Uusina lisäyksinä ovat mm. tekstin irrottaminen suoraan PDF-tiedostoista, kielen tunnistaminen ja tekstien filtteröinti kielen perusteella sekä erilaiset semanttiset mallit ja topic modeling. Funktioiden koodin voi ladata tästä: tm-functions.

source("/wp-content/uploads/2015/06/tm-functions.txt")
 
# Esikäsittelyvaiheet
# Luetaan PDF-tiedostoista teksti puhtaisiin tekstitiedostoihin, ei pakollinen
dat<-pdf2txt("C:\\Users\\Jarno Tuimala\\Desktop\\pdffolder\\", "C:\\Users\\Jarno Tuimala\\Desktop\\pdffolder\\")
 
# Luetaan taulukkomuotoinen tekstitiedosto
# Tiedostossa ovat sarakkeet text, profile, time, ketju ja folder
# Varsinainen analysoitava teksti on sarakkeessa text
dat<-readText("C:\\Users\\Jarno Tuimala\\Desktop\\tutkimus\\vauva-textmining\\res.tsv")
 
# Esikäsitellään edellä luettu taulukko: ketju yksilöi tekstidokumentin ryhmiin, ja text on tekstiä sisältävä sarake
dat<-preprocessText(dat, "ketju", "text")
 
# Tunnistetaan kieli
dat<-detectLang(dat, keep="finnish")
 
# Poistetaan tekstistä välimerkit, ym. ja tehdään stemming
dat<-processText(dat)
 
 
# Analyysivaiheet
# Topic modeling
top<-topicModeling(dat, plot=T)
plotTopics(top, dat)
 
# Sanamatriisi -> vaikkapa tiedonlouhinnan pohjalle
mat<-textMatrix(dat, group="")
 
# Verkkorakennevisualisointi tekstien välisistä suhteista
gra<-plotAdjacencyMatrix(mat)
 
# Sanayhdistelmät
findNgrams(dat, 2)
 
# Missä tietty sana esiintyy
findTermco(dat, "isä")
 
# Eri tekstejä parhaiten erottelevat sanat
fin<-findIndicators(mat, as.numeric(as.factor(unique(dat$id))))
 
# Tehdään latentti semanttinenanalyysi (LSA)
las<-performLSA(mat)
 
# Tehdään MDS-analyysi sanamatriisille
mdsfit<-performMDS(mat, 2, col=max.col(top$data$theta))
mdsfit<-performMDS(mat, 2, col=max.col(t(top$fit$document_sums)))

Esimerkiksi funktio topicModeling() etsii aineistosta aihealueet, joihin tekstit sitten sijoitetaan. Oletusarvoisesti etsitään 20 aihealuetta, mutta lukumäärää voi säätää. Tuloksena on interaktiivinen visualisointi, joka näyttää staattisessa kuvassa seuraavalta:

Kuvan keskellä on esitetty aihealueisiin jakautuminen, ja aihealueet on numeroitu. Oikealla puolella olevassa pylväskaaviossa on esitetty kunkin aihealueen termien frekvenssi. Esimerkiksi kuvassa esitettyssä aihealueessa puhutaan ilmeisesti raskausajasta.

Jatkokehityksen painopisteenä on integroida myös OCR-teknologia eli mahdollistaa tekstin irrottaminen kuviksi skannatuista teksteistä. Tähän tarjoaa mahdollisuuden esimerkiksi Tesseract-ohjelmisto, joka on avointa lähdekoodia. Lisäksi funktioiden käyttämisen helpottamiseksi on kehitteillä graafinen käyttöliittymä, joka tosin on toistaiseksi lähinnä käynnistysikkuna-tyyppinen viritelmä. Alla on esimerkki, miten graafinen käyttöliittymä voidaan nopeasti luoda valmiille funktioille fgui-paketilla. Käyttöliittymä ei vielä toimi kunnolla!

library(RQDA)
 
# GUI
library(fgui)
 
source("/wp-content/uploads/2015/06/tm-functions.txt")
 
mgui(pdf2text, title = c("Tekstin louhinta", "Esikäsittely", "PDF:stä tekstiksi"))
mgui(readText, title = c("Tekstin louhinta", "Esikäsittely", "Tuo taulukko ohjelmaan"))
mgui(preprocessText, title = c("Tekstin louhinta", "Esikäsittely", "Muokkaa taulukko käyttökuntoon"))
mgui(detectLang, title = c("Tekstin louhinta", "Esikäsittely", "Tunnista kielet, ja säästä vain halutun kieliset"))
mgui(processText, title = c("Tekstin louhinta", "Esikäsittely", "Muokkaa tekstiaineisto käyttökuntoon"))
 
mgui(textMatrix, title = c("Tekstin louhinta", "Analyysi", "Tee sanamatriisi"))
mgui(findNgrams, title = c("Tekstin louhinta", "Analyysi", "Etsi sanayhdistelmiä"))
mgui(findTermco, title = c("Tekstin louhinta", "Analyysi", "Etsi sanafrekvenssit"))
mgui(findIndicators, title = c("Tekstin louhinta", "Analyysi", "Etsi indikaattorisanat"))
mgui(performMDS, title = c("Tekstin louhinta", "Analyysi", "Visualisoi sanamatriisi"))
#fguiNewMenu(c("Analyysi","SEPARATOR"))
mgui(performLSA, title = c("Tekstin louhinta", "Analyysi", "Latentti semanttinen analyysi (LSA)"))
mgui(topicModeling, title = c("Tekstin louhinta", "Analyysi", "Topic Modeling (LDA)"))
mgui(plotTopics, title = c("Tekstin louhinta", "Analyysi", "Visualisoi topic models"))
 
mgui(rqda, title = c("Kvalitatiivinen analyysi", "RQDA GUI"))
mgui(jfox, title = c("Kvantitatiivinen analyysi", "R Commander"))

Tällä hetkellä graafinen käyttöliittymä näyttää seuraavalta:

Tarkoituksena on saada tuotettua oikeasti toimiva GUI-ratkaisu ennen syksyä. Kunhan edellä mainittu Tesseract-ohjelmisto saadaan mukaan, puuttuu ratkaisusta enää sentimenttianalyysi, josta on ollut vaikea löytyy avointa suomenkielistä toteutusta.

Jos sinulla on tiedossasi suomenkieliselle tekstille soveltuva, ilmainen, avoimen lähdekoodin sentimenttianalyysiä tekevä ohjelma, olisin kiinnostunut kuulemaan asiasta.

EDIT 2015-09-27
Tekstinlouhintafunktiot on päivitetty. Uusin versio on tm-functions_2015-09-24.


Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *