Yle on julkaissut tapahtumakalenterinsa tiedot vapaana datana:
https://www.avoindata.fi/data/fi/dataset/yle-arkiston-historiallinen-tapahtumakalenteri
Halusin selvittää, kuinka monta tapathumakalenterissa olevista ihmisistä löytyy wikidatasta. Tämä on edellytys sille, että tietoja voitaisiin siirtää kalenterista wikidataan.
Data
Ylen kalenteridata näyttää tällaiselta:
"id": 9234,
"vuosi": 1945,
"kuukausi": 6,
"paiva": 2,
"tapahtuma": "Kim Brown syntyi",
"huomautus": "Englantilainen laulaja & lauluntekijä, the Renegades-yhtyeen johtohahmo. Kuoli 11.10.2011.",
"linkki": "",
"henkilo": 1,
"fennica": 0,
"lahde": "hs 13.10.11",
"valmis": 1,
"tallpvm": "4.1.2012",
"muokkpvm": "4.1.2012"
Aineisto koostuu erillisistä tiedoista, joilla ei ole muuta keskinäistä viitettä kuin henkilön nimi. Henkilöitä koskevat tiedot on merkitty "henkilo" -lipulla, joten aineiston rajaaminen tämän mukaan on ensimmäinen vaihe.
Toiseksi aineistosta pitää kaivaa henkilöiden nimet, sillä
nimet eivät ole omana kenttänään vaan ne ovat muotoa "Aleksi Lehtonen
syntyi" tai "Ari Vatanen voitti ensimmäisenä suomalaisena ralliautoilun
virallisen maailmanmestaruuden".
Vaiheet
Prosessi jakautui neljään vaiheeseen.
Konvertointi
Ääkköset näkyivät rumasti kun tiedostoa katseli tekstimuodossa.
Ensiksi piti siis
päästää eroon väärästä merkistöstä. Sen jälkeen muunsin tiedoston json-formaattiin, jotta jatkokäsittely olisi helpompaa.
Yhtenäistäminen
Yhtenäisteminen
tarkoittaa tässä tapauksessa sitä että yksittäistä henkilöä koskevat
tiedot kootaan yhteen. Siis esimerkiksi kaikki Matti Nykästä koskevat
huomiot linkitetään Matti Nykäsen
alla. Tästä muodostuu Matti Nykäsen tapahtumat. Tätä voisi kutsua myös tapahtumallistamiseksi(?).
Kysely
Seuraavaksi
tein kohteesta hakutiedoston json-formaattiin. Tiedosto sisältää hakutermit ja viitteet alkuperäisen aineiston tietoihin. Tähän tiedostoon
kirjoitetaan kyselyn tulokset. Näin voidaan tehdä useita hakuja ilman
että haetaan samoja tietoja uudestaan ja uudestaan.
"name": "Alfred Kordelin",
"response": {
"head": {
"vars": [
"s",
"label",
"birth",
"death"
]
},
"results": {
"bindings": []
}
},
"ids": [
5857
],
"response_count": 0,
"long_name": 6,
"new_id": 123
Käytin wikidatan SPARQL-rajapintaa. Kokeilujen jälkeen päädyin kysymään siltä joko suomen- tai englanninkielistä versiota nimestä.
Analyysi
Kun onnistuineita hakuja on saatu tarpeeksi, voi tuloksia analysoida. Anayysissa tutkitaan millaisia vastauksia on saatu tai onko niitä saatu ollenkaan.
henkilöitä: 3071
ei löydy: 314
yksi osuma: 2516
useita osumia: 241
Yli 80 prosenttia kyselyistä tuotti yhden osuman. Se ei tietysti tarkoita että henkilö on oikea, mutta siitä on hyvä jatkaa esimerkiksi syntymä- ja kuolinpäivien (tai vuosien) vertailulla. Mutta entä nuo yli 300 joita ei löytynyt?
Aleksander vai Alexander?
Nimi on kehno ihmisen tunniste. On samoja nimiä, eri tavalla kirjoitettuja samoja nimiä (esim. aksenttimerkit), väärin kirjoitettuja nimiä (
Bertrand Russel) ja sitten on vielä kuninkaalliset. Esimerkiksi Ylen kalenteridatassa on "
Anne, englannin prinsessa". Tässä muodossa wikidatasta ei löydy mitään. Sen sijaan "
Prinsessa Anne" löytyy.
Myös aksenttimerkit aiheuttava omat ongelmansa. Kalenterissa osassa nimissä on aksenttimerkit ja osassa ei. Salvador Dali ja Edith Piaf ovat kalenterissa ilman aksenttia mutta näiden henkilöiden wikidatan suomenkielinen label on aksentin kanssa. Siksi haku ei löydä kyseisiä taitelijoita.
Lisäksi on vielä kielivalinta. Wikidata on aidosti monikielinen ja siksi myös henkilöiden nimillä voi olla useita eri kieliasuja kielen mukaan. Esimerkiksi aiemmin mainittu prinsessa Anne on suomennettu nimi Princess Annelle. Tosin haun kannalta tällä on merkitystä lähinnä SPARQL -hakujen kannalta.
Google ratkaisuksi?
Entä jos syötetään "
Anne, englannin prinsessa" Googlen hakuun? Jo vain, ensimmäinen osuma on wikipedian sivu "Anne (prinsessa)". Wikipedian sivun kautta taas voidaan löytyy prinsessa Annen wikidatakohde!
En tehnyt ohjelmallista google-hakua, vaan tein suppean testin käsin. Mutta näyttää siltä, että
kattavin hakualgoritmi näyttää menevän mutkan (Google) kautta.
Loppujen kohdalla on tehtävä sitä, mitä kukaan ohjelmointitaitoiseksi itseään kutsuva ei halua tehdä eli käsineditointia. Otetaan siis listaus niistä nimistä, joista ei löytynyt tietoa minkään haun avulla ja tutkitaan ovatko hakutermit järkeviä ja jos on, niin miksi mitään ei löytynyt (kirjoitusvirhe, ei wikipediasivua jne.)
Entä useat osumat?
Nopean katsauksen perusteella useita osumia tuli koska henkilöillä oli useita syntymä- tai kuolinpäiviä (wikidatassa tämä on mahdollista, niin kuin olla pitääkin). Moni nimi myös tuotti useampia henkilöitä, kuten esimerkiksi
Aarre Merikanto.
Johtopäätös
Pelkkien nimien avulla tietojen yhdistäminen on hankalaa ja vaatii jossain vaiheessa perinteistä käsityötä. Paras algoritmi näyttäisi olevan Googlen kautta wikipediaan ja sieltä wikidataan.Kaiken kaikkiaan tehtävä ei ole triviaali. Teknisen värkkäämisen lisäksi tarvitaan myös aika lailla tietoa, jotta tiedot kohtaavat oikeat henkilöt silloin kun erehtymisen vaara on.
Tekniikkaa
Merkistömuunnos iconv-ohjelmistolla:
iconv -f WINDOWS-1252 -t UTF-8 Yle-tapahtumat.csv > Yle-tapahtumat-utf8.csv
Tein kokeilut javascriptillä
nodejs-ympäristössä. Wikidatahaut tein wikidatan
sparql -apin kautta seuraavalla kyselyllä:
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
SELECT DISTINCT ?s ?birth ?death WHERE {
?s wdt:P31/wdt:P279* wd:Q5 .
{ ?s ?label "Eubie Blake"@en }
UNION
{ ?s ?label "Eubie Blake"@fi }
OPTIONAL { ?s wdt:P569 ?birth }
OPTIONAL { ?s wdt:P570 ?death }
}