Eit lite tekstsøkeprogram

Sjekk kor godt ein tekst passar med ein annan tekst.

Eg sit her på Nicar 2014 i Baltimore og har utsett barrunden fordi eg blei hekta på litt R-koding.
Vegard Venli (@vegardvenlie) i Kommunal Rapport er jo ein gravekonge, og han spekulerer på eitt eller anna. Han vil gjerne ha eit program som kan sjekke kor godt ein tekst passar med ein annan tekst.

Eg sa så sikkert eg kunne at dette kan vi kode i R. Så då gjorde eg det. Kan jo vere vi får bruk for det, vi òg. Samstundes fekk eg sjansen til å innvie Github-repositoriet mitt, så heile koden finn du her.

Har ikkje snakka nok med Vegard til at eg veit om dette er akkurat det han treng, det er det sikkert ikkje, men for meg blei det ein fin læringsstund.
Utgangspunktet er at vi har ein kjeldetekststreng. I dømet mitt er teksten «Jeg heter Christian og jobber i Bergens Tidende.», men vi kan sjølvsagt laste inn kva tekst som helst.

Så spør programmet om kva tekst du vil sjekke. Planen er så å finne ut kor stor del denne teksten utgjer av kjeldeteksten. For å finne ut det, kuttar eg opp kjeldeteksten bokstav for bokstav og set han saman att, bokstav for bokstav, og puttar det i ei liste:

atom <- unlist(strsplit(tekst, ""))
biter <- list()
lengde <- length(atom)
for (i in 1:lengde) {
biter <- c(biter, paste(atom[1:i], collapse=""))
}
for (i in 1:lengde) {
biter <- c(biter, paste(atom[i:lengde], collapse=""))
}

Lister er greie å jobbe med i R. Ved å telje antall objekt i lista har eg eit måleverktøy. Eg tel kjeldeteksten to gonger, forfra og bakfra, elles vil strengar tidleg i teksten få uforholdsmessig god score.

Eg brukar R-funksjonen grepl for å sjekke kor mange gonger tekstbiten vi søkjer etter, dukkar opp i lista.

#Finnes teksten vi leter etter i liste?
#Tell opp alle forekomster der hele tekst2 er i listen.
res <- grepl(tekst2, biter)
res2 <- length(res[res==TRUE])

Denne neste linja sleit eg med: Fordi eg tel bokstavane to gonger, vil det vere to forekomstar der teksten kan stemme hundre prosent. Samstundes vil vi ha 0% svar viss teksten ikkje finst i kjeldeteksten i det heile tatt. Etter litt grubling laga eg ein nestet (godt norsk for nested, nokon?) ifelse-kommando:

resultat <- ifelse(res2 !=2 , ifelse(res2 !=0, deler-res2, 0),deler)

«deler» er her talet på oppstykka kjeldetekstbitar, delt på to, for å oppveie at vi har skrudd saman kjeldeteksten både forfra og bakfra.

Svaret er derfra og ut rein prosentrekning.
Køyrer du programmet, kan du etterpå skrive «biter» i kommandolinja for å sjå korleis teksten er stykka opp.