From 73f66ec5706108f193b8dcabaf79473a87925d26 Mon Sep 17 00:00:00 2001 From: Michael Wallin Date: Wed, 1 Feb 2017 00:27:29 +0200 Subject: [PATCH] Add preliminary support for Finnish --- setup.py | 1 + spacy/__init__.py | 4 +- spacy/fi/__init__.py | 17 + spacy/fi/language_data.py | 17 + spacy/fi/stop_words.py | 854 +++++++++++++++++++++++++++++++ spacy/fi/tokenizer_exceptions.py | 202 ++++++++ 6 files changed, 1094 insertions(+), 1 deletion(-) create mode 100644 spacy/fi/__init__.py create mode 100644 spacy/fi/language_data.py create mode 100644 spacy/fi/stop_words.py create mode 100644 spacy/fi/tokenizer_exceptions.py diff --git a/setup.py b/setup.py index 70099da0a..585cb1025 100644 --- a/setup.py +++ b/setup.py @@ -31,6 +31,7 @@ PACKAGES = [ 'spacy.pt', 'spacy.nl', 'spacy.sv', + 'spacy.fi', 'spacy.language_data', 'spacy.serialize', 'spacy.syntax', diff --git a/spacy/__init__.py b/spacy/__init__.py index 21e0f7db4..373974330 100644 --- a/spacy/__init__.py +++ b/spacy/__init__.py @@ -13,7 +13,7 @@ from . import fr from . import pt from . import nl from . import sv - +from . import fi try: basestring @@ -31,6 +31,8 @@ set_lang_class(hu.Hungarian.lang, hu.Hungarian) set_lang_class(zh.Chinese.lang, zh.Chinese) set_lang_class(nl.Dutch.lang, nl.Dutch) set_lang_class(sv.Swedish.lang, sv.Swedish) +set_lang_class(fi.Finnish.lang, fi.Finnish) + def load(name, **overrides): diff --git a/spacy/fi/__init__.py b/spacy/fi/__init__.py new file mode 100644 index 000000000..79a92b970 --- /dev/null +++ b/spacy/fi/__init__.py @@ -0,0 +1,17 @@ +# encoding: utf8 +from __future__ import unicode_literals, print_function + +from ..language import Language +from ..attrs import LANG +from .language_data import * + + +class Finnish(Language): + lang = 'fi' + + class Defaults(Language.Defaults): + lex_attr_getters = dict(Language.Defaults.lex_attr_getters) + lex_attr_getters[LANG] = lambda text: 'fi' + + tokenizer_exceptions = TOKENIZER_EXCEPTIONS + stop_words = STOP_WORDS diff --git a/spacy/fi/language_data.py b/spacy/fi/language_data.py new file mode 100644 index 000000000..8bf88842a --- /dev/null +++ b/spacy/fi/language_data.py @@ -0,0 +1,17 @@ +# encoding: utf8 +from __future__ import unicode_literals + +from .. import language_data as base +from ..language_data import update_exc, strings_to_exc + +from .stop_words import STOP_WORDS +from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS + + +STOP_WORDS = set(STOP_WORDS) + +TOKENIZER_EXCEPTIONS = dict(TOKENIZER_EXCEPTIONS) +update_exc(TOKENIZER_EXCEPTIONS, strings_to_exc(base.EMOTICONS)) + + +__all__ = ["TOKENIZER_EXCEPTIONS", "STOP_WORDS"] diff --git a/spacy/fi/stop_words.py b/spacy/fi/stop_words.py new file mode 100644 index 000000000..6f94d2567 --- /dev/null +++ b/spacy/fi/stop_words.py @@ -0,0 +1,854 @@ +# encoding: utf8 +from __future__ import unicode_literals + +# Source https://github.com/stopwords-iso/stopwords-fi/blob/master/stopwords-fi.txt + +STOP_WORDS = set(""" +aiemmin +aika +aikaa +aikaan +aikaisemmin +aikaisin +aikajen +aikana +aikoina +aikoo +aikovat +aina +ainakaan +ainakin +ainoa +ainoat +aiomme +aion +aiotte +aist +aivan +ajan +alas +alemmas +alkuisin +alkuun +alla +alle +aloitamme +aloitan +aloitat +aloitatte +aloitattivat +aloitettava +aloitettevaksi +aloitettu +aloitimme +aloitin +aloitit +aloititte +aloittaa +aloittamatta +aloitti +aloittivat +alta +aluksi +alussa +alusta +annettavaksi +annetteva +annettu +ansiosta +antaa +antamatta +antoi +aoua +apu +asia +asiaa +asian +asiasta +asiat +asioiden +asioihin +asioita +asti +avuksi +avulla +avun +avutta +edelle +edelleen +edellä +edeltä +edemmäs +edes +edessä +edestä +ehkä +ei +eikä +eilen +eivät +eli +ellei +elleivät +ellemme +ellen +ellet +ellette +emme +en +enemmän +eniten +ennen +ensi +ensimmäinen +ensimmäiseksi +ensimmäisen +ensimmäisenä +ensimmäiset +ensimmäisiksi +ensimmäisinä +ensimmäisiä +ensimmäistä +ensin +entinen +entisen +entisiä +entisten +entistä +enää +eri +erittäin +erityisesti +eräiden +eräs +eräät +esi +esiin +esillä +esimerkiksi +et +eteen +etenkin +etessa +ette +ettei +että +haikki +halua +haluaa +haluamatta +haluamme +haluan +haluat +haluatte +haluavat +halunnut +halusi +halusimme +halusin +halusit +halusitte +halusivat +halutessa +haluton +he +hei +heidän +heidät +heihin +heille +heillä +heiltä +heissä +heistä +heitä +helposti +heti +hetkellä +hieman +hitaasti +hoikein +huolimatta +huomenna +hyvien +hyviin +hyviksi +hyville +hyviltä +hyvin +hyvinä +hyvissä +hyvistä +hyviä +hyvä +hyvät +hyvää +hän +häneen +hänelle +hänellä +häneltä +hänen +hänessä +hänestä +hänet +häntä +ihan +ilman +ilmeisesti +itse +itsensä +itseään +ja +jo +johon +joiden +joihin +joiksi +joilla +joille +joilta +joina +joissa +joista +joita +joka +jokainen +jokin +joko +joksi +joku +jolla +jolle +jolloin +jolta +jompikumpi +jona +jonka +jonkin +jonne +joo +jopa +jos +joskus +jossa +josta +jota +jotain +joten +jotenkin +jotenkuten +jotka +jotta +jouduimme +jouduin +jouduit +jouduitte +joudumme +joudun +joudutte +joukkoon +joukossa +joukosta +joutua +joutui +joutuivat +joutumaan +joutuu +joutuvat +juuri +jälkeen +jälleen +jää +kahdeksan +kahdeksannen +kahdella +kahdelle +kahdelta +kahden +kahdessa +kahdesta +kahta +kahteen +kai +kaiken +kaikille +kaikilta +kaikkea +kaikki +kaikkia +kaikkiaan +kaikkialla +kaikkialle +kaikkialta +kaikkien +kaikkin +kaksi +kannalta +kannattaa +kanssa +kanssaan +kanssamme +kanssani +kanssanne +kanssasi +kauan +kauemmas +kaukana +kautta +kehen +keiden +keihin +keiksi +keille +keillä +keiltä +keinä +keissä +keistä +keitten +keittä +keitä +keneen +keneksi +kenelle +kenellä +keneltä +kenen +kenenä +kenessä +kenestä +kenet +kenettä +kennessästä +kenties +kerran +kerta +kertaa +keskellä +kesken +keskimäärin +ketkä +ketä +kiitos +kohti +koko +kokonaan +kolmas +kolme +kolmen +kolmesti +koska +koskaan +kovin +kuin +kuinka +kuinkan +kuitenkaan +kuitenkin +kuka +kukaan +kukin +kukka +kumpainen +kumpainenkaan +kumpi +kumpikaan +kumpikin +kun +kuten +kuuden +kuusi +kuutta +kylliksi +kyllä +kymmenen +kyse +liian +liki +lisäksi +lisää +lla +luo +luona +lähekkäin +lähelle +lähellä +läheltä +lähemmäs +lähes +lähinnä +lähtien +läpi +mahdollisimman +mahdollista +me +meidän +meidät +meihin +meille +meillä +meiltä +meissä +meistä +meitä +melkein +melko +menee +meneet +menemme +menen +menet +menette +menevät +meni +menimme +menin +menit +menivät +mennessä +mennyt +menossa +mihin +mikin +miksi +mikä +mikäli +mikään +mille +milloin +milloinkan +millä +miltä +minkä +minne +minua +minulla +minulle +minulta +minun +minussa +minusta +minut +minuun +minä +missä +mistä +miten +mitkä +mitä +mitään +moi +molemmat +mones +monesti +monet +moni +moniaalla +moniaalle +moniaalta +monta +muassa +muiden +muita +muka +mukaan +mukaansa +mukana +mutta +muu +muualla +muualle +muualta +muuanne +muulloin +muun +muut +muuta +muutama +muutaman +muuten +myöhemmin +myös +myöskin +myöskään +myötä +ne +neljä +neljän +neljää +niiden +niihin +niiksi +niille +niillä +niiltä +niin +niinä +niissä +niistä +niitä +noiden +noihin +noiksi +noilla +noille +noilta +noin +noina +noissa +noista +noita +nopeammin +nopeasti +nopeiten +nro +nuo +nyt +näiden +näihin +näiksi +näille +näillä +näiltä +näin +näinä +näissä +näissähin +näissälle +näissältä +näissästä +näistä +näitä +nämä +ohi +oikea +oikealla +oikein +ole +olemme +olen +olet +olette +oleva +olevan +olevat +oli +olimme +olin +olisi +olisimme +olisin +olisit +olisitte +olisivat +olit +olitte +olivat +olla +olleet +olli +ollut +oma +omaa +omaan +omaksi +omalle +omalta +oman +omassa +omat +omia +omien +omiin +omiksi +omille +omilta +omissa +omista +on +onkin +onko +ovat +paikoittain +paitsi +pakosti +paljon +paremmin +parempi +parhaillaan +parhaiten +perusteella +peräti +pian +pieneen +pieneksi +pienelle +pienellä +pieneltä +pienempi +pienestä +pieni +pienin +poikki +puolesta +puolestaan +päälle +runsaasti +saakka +sadam +sama +samaa +samaan +samalla +samallalta +samallassa +samallasta +saman +samat +samoin +sata +sataa +satojen +se +seitsemän +sekä +sen +seuraavat +siellä +sieltä +siihen +siinä +siis +siitä +sijaan +siksi +sille +silloin +sillä +silti +siltä +sinne +sinua +sinulla +sinulle +sinulta +sinun +sinussa +sinusta +sinut +sinuun +sinä +sisäkkäin +sisällä +siten +sitten +sitä +ssa +sta +suoraan +suuntaan +suuren +suuret +suuri +suuria +suurin +suurten +taa +taas +taemmas +tahansa +tai +takaa +takaisin +takana +takia +tallä +tapauksessa +tarpeeksi +tavalla +tavoitteena +te +teidän +teidät +teihin +teille +teillä +teiltä +teissä +teistä +teitä +tietysti +todella +toinen +toisaalla +toisaalle +toisaalta +toiseen +toiseksi +toisella +toiselle +toiselta +toisemme +toisen +toisensa +toisessa +toisesta +toista +toistaiseksi +toki +tosin +tuhannen +tuhat +tule +tulee +tulemme +tulen +tulet +tulette +tulevat +tulimme +tulin +tulisi +tulisimme +tulisin +tulisit +tulisitte +tulisivat +tulit +tulitte +tulivat +tulla +tulleet +tullut +tuntuu +tuo +tuohon +tuoksi +tuolla +tuolle +tuolloin +tuolta +tuon +tuona +tuonne +tuossa +tuosta +tuota +tuotä +tuskin +tykö +tähän +täksi +tälle +tällä +tällöin +tältä +tämä +tämän +tänne +tänä +tänään +tässä +tästä +täten +tätä +täysin +täytyvät +täytyy +täällä +täältä +ulkopuolella +usea +useasti +useimmiten +usein +useita +uudeksi +uudelleen +uuden +uudet +uusi +uusia +uusien +uusinta +uuteen +uutta +vaan +vahemmän +vai +vaiheessa +vaikea +vaikean +vaikeat +vaikeilla +vaikeille +vaikeilta +vaikeissa +vaikeista +vaikka +vain +varmasti +varsin +varsinkin +varten +vasen +vasenmalla +vasta +vastaan +vastakkain +vastan +verran +vielä +vierekkäin +vieressä +vieri +viiden +viime +viimeinen +viimeisen +viimeksi +viisi +voi +voidaan +voimme +voin +voisi +voit +voitte +voivat +vuoden +vuoksi +vuosi +vuosien +vuosina +vuotta +vähemmän +vähintään +vähiten +vähän +välillä +yhdeksän +yhden +yhdessä +yhteen +yhteensä +yhteydessä +yhteyteen +yhtä +yhtäälle +yhtäällä +yhtäältä +yhtään +yhä +yksi +yksin +yksittäin +yleensä +ylemmäs +yli +ylös +ympäri +älköön +älä +""".split()) diff --git a/spacy/fi/tokenizer_exceptions.py b/spacy/fi/tokenizer_exceptions.py new file mode 100644 index 000000000..abb43c139 --- /dev/null +++ b/spacy/fi/tokenizer_exceptions.py @@ -0,0 +1,202 @@ +# encoding: utf8 +from __future__ import unicode_literals + +from ..symbols import * +from ..language_data import PRON_LEMMA + +# Source https://www.cs.tut.fi/~jkorpela/kielenopas/5.5.html + +TOKENIZER_EXCEPTIONS = { + "aik.": [ + {ORTH: "aik.", LEMMA: "aikaisempi"} + ], + "alk.": [ + {ORTH: "alk.", LEMMA: "alkaen"} + ], + "alv.": [ + {ORTH: "alv.", LEMMA: "arvonlisävero"} + ], + "ark.": [ + {ORTH: "ark.", LEMMA: "arkisin"} + ], + "as.": [ + {ORTH: "as.", LEMMA: "asunto"} + ], + "ed.": [ + {ORTH: "ed.", LEMMA: "edellinen"} + ], + "esim.": [ + {ORTH: "esim.", LEMMA: "esimerkki"} + ], + "huom.": [ + {ORTH: "huom.", LEMMA: "huomautus"} + ], + "jne.": [ + {ORTH: "jne.", LEMMA: "ja niin edelleen"} + ], + "joht.": [ + {ORTH: "joht.", LEMMA: "johtaja"} + ], + "k.": [ + {ORTH: "k.", LEMMA: "kuollut"} + ], + "ks.": [ + {ORTH: "ks.", LEMMA: "katso"} + ], + "lk.": [ + {ORTH: "lk.", LEMMA: "luokka"} + ], + "lkm.": [ + {ORTH: "lkm.", LEMMA: "lukumäärä"} + ], + "lyh.": [ + {ORTH: "lyh.", LEMMA: "lyhenne"} + ], + "läh.": [ + {ORTH: "läh.", LEMMA: "lähettäjä"} + ], + "miel.": [ + {ORTH: "miel.", LEMMA: "mieluummin"} + ], + "milj.": [ + {ORTH: "milj.", LEMMA: "miljoona"} + ], + "mm.": [ + {ORTH: "mm.", LEMMA: "muun muassa"} + ], + "myöh.": [ + {ORTH: "myöh.", LEMMA: "myöhempi"} + ], + "n.": [ + {ORTH: "n.", LEMMA: "noin"} + ], + "nimim.": [ + {ORTH: "nimim.", LEMMA: "nimimerkki"} + ], + "ns.": [ + {ORTH: "ns.", LEMMA: "niin sanottu"} + ], + "nyk.": [ + {ORTH: "nyk.", LEMMA: "nykyinen"} + ], + "oik.": [ + {ORTH: "oik.", LEMMA: "oikealla"} + ], + "os.": [ + {ORTH: "os.", LEMMA: "osoite"} + ], + "p.": [ + {ORTH: "p.", LEMMA: "päivä"} + ], + "par.": [ + {ORTH: "par.", LEMMA: "paremmin"} + ], + "per.": [ + {ORTH: "per.", LEMMA: "perustettu"} + ], + "pj.": [ + {ORTH: "pj.", LEMMA: "puheenjohtaja"} + ], + "puh.joht.": [ + {ORTH: "puh.joht.", LEMMA: "puheenjohtaja"} + ], + "prof.": [ + {ORTH: "prof.", LEMMA: "professori"} + ], + "puh.": [ + {ORTH: "puh.", LEMMA: "puhelin"} + ], + "pvm.": [ + {ORTH: "pvm.", LEMMA: "päivämäärä"} + ], + "rak.": [ + {ORTH: "rak.", LEMMA: "rakennettu"} + ], + "ry.": [ + {ORTH: "ry.", LEMMA: "rekisteröity yhdistys"} + ], + "s.": [ + {ORTH: "s.", LEMMA: "sivu"} + ], + "siht.": [ + {ORTH: "siht.", LEMMA: "sihteeri"} + ], + "synt.": [ + {ORTH: "synt.", LEMMA: "syntynyt"} + ], + "t.": [ + {ORTH: "t.", LEMMA: "toivoo"} + ], + "tark.": [ + {ORTH: "tark.", LEMMA: "tarkastanut"} + ], + "til.": [ + {ORTH: "til.", LEMMA: "tilattu"} + ], + "tms.": [ + {ORTH: "tms.", LEMMA: "tai muuta sellaista"} + ], + "toim.": [ + {ORTH: "toim.", LEMMA: "toimittanut"} + ], + "v.": [ + {ORTH: "v.", LEMMA: "vuosi"} + ], + "vas.": [ + {ORTH: "vas.", LEMMA: "vasen"} + ], + "vast.": [ + {ORTH: "vast.", LEMMA: "vastaus"} + ], + "vrt.": [ + {ORTH: "vrt.", LEMMA: "vertaa"} + ], + "yht.": [ + {ORTH: "yht.", LEMMA: "yhteensä"} + ], + "yl.": [ + {ORTH: "yl.", LEMMA: "yleinen"} + ], + "ym.": [ + {ORTH: "ym.", LEMMA: "ynnä muuta"} + ], + "yms.": [ + {ORTH: "yms.", LEMMA: "ynnä muuta sellaista"} + ], + "yo.": [ + {ORTH: "yo.", LEMMA: "ylioppilas"} + ], + "yliopp.": [ + {ORTH: "yliopp.", LEMMA: "ylioppilas"} + ], + "ao.": [ + {ORTH: "ao.", LEMMA: "asianomainen"} + ], + "em.": [ + {ORTH: "em.", LEMMA: "edellä mainittu"} + ], + "ko.": [ + {ORTH: "ko.", LEMMA: "kyseessä oleva"} + ], + "ml.": [ + {ORTH: "ml.", LEMMA: "mukaan luettuna"} + ], + "po.": [ + {ORTH: "po.", LEMMA: "puheena oleva"} + ], + "so.": [ + {ORTH: "so.", LEMMA: "se on"} + ], + "ts.": [ + {ORTH: "ts.", LEMMA: "toisin sanoen"} + ], + "vm.": [ + {ORTH: "vm.", LEMMA: "viimeksi mainittu"} + ], + "siht.": [ + {ORTH: "siht.", LEMMA: "sihteeri"} + ], + "srk.": [ + {ORTH: "srk.", LEMMA: "seurakunta"} + ] +}