Add norwegian lemmatizer and tag_map

This commit is contained in:
Ole Henrik Skogstrøm 2018-01-24 12:28:29 +01:00
parent fe4748fc38
commit b9b3a40c78
4 changed files with 248 additions and 0 deletions

View File

@ -7,6 +7,8 @@ from .morph_rules import MORPH_RULES
from ..tokenizer_exceptions import BASE_EXCEPTIONS
from ..norm_exceptions import BASE_NORMS
from .lemmatizer import LOOKUP
from .tag_map import TAG_MAP
from ...language import Language
from ...attrs import LANG, NORM
from ...util import update_exc, add_lookups
@ -18,6 +20,8 @@ class NorwegianDefaults(Language.Defaults):
lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
stop_words = STOP_WORDS
tag_map = TAG_MAP
lemma_lookup = LOOKUP
class Norwegian(Language):

164
spacy/lang/nb/lemmatizer.py Normal file
View File

@ -0,0 +1,164 @@
# coding: utf8
from __future__ import unicode_literals
LOOKUP = {
'a':'a',
'aabakken':'aabakken',
'aabakkens':'aabakkens',
'aarbakke':'aarbakke',
'aarum':'aarum',
'aase':'aase',
'ab':'ab',
'abitanti':'abitanti',
'abitazione':'abitazione',
'ablegøyer':'ablegøyer',
'absolutt':'absolutt',
'absorberes':'absorberes',
'ad':'ad',
'adgang':'adgang',
'adgangen':'adgangen',
'adkomst':'adkomst',
'adkomstdokument':'adkomstdokument',
'adkomstdokumenter':'adkomstdokumenter',
'adkomsten':'adkomsten',
'adlyde':'adlyde',
'adlyder':'adlyder',
'adm':'adm',
'administrasjon':'administrasjon',
'administrasjonen':'administrasjonen',
'administrasjonsdepartementet':'administrasjonsdepartementet',
'administrasjonskostnadene':'administrasjonskostnadene',
'administrativ':'administrativ',
'administrative':'administrative',
'administrativt':'administrativt',
'administrere':'administrere',
'administrerende':'administrerende',
'administreres':'administreres',
'administrert':'administrert',
'adopsjon':'adopsjon',
'adopsjonspenger':'adopsjonspenger',
'adresse':'adresse',
'adresser':'adresser',
'adskillelse':'adskillelse',
'adskilt':'adskilt',
'advare':'advare',
'advarselen':'advarselen',
'advart':'advart',
'advokat':'advokat',
'advokatar':'advokatar',
'advokatfirmaet':'advokatfirmaet',
'advokatfullmektig':'advokatfullmektig',
'agder':'agder',
'agenter':'agenter',
'agenturer':'agenturer',
'aggregeres':'aggregeres',
'aggregert':'aggregert',
'agn':'agn',
'agnar':'agnar',
'agreement':'agreement',
'ajourføring':'ajourføring',
'akademikerne':'akademikerne',
'akademikernes':'akademikernes',
'ake':'ake',
'akershus':'akershus',
'akkord':'akkord',
'akkumulerte':'akkumulerte',
'akkurat':'akkurat',
'aksept':'aksept',
'akseptabel':'akseptabel',
'akseptabelt':'akseptabelt',
'akseptable':'akseptable',
'aksepterast':'aksepterast',
'akseptere':'akseptere',
'aksepteres':'aksepteres',
'akseptert':'akseptert',
'aksjane':'aksjane',
'aksjar':'aksjar',
'aksje':'aksje',
'aksjeandel':'aksjeandel',
'aksjeavkastning':'aksjeavkastning',
'aksjebrev':'aksjebrev',
'aksjebustader':'aksjebustader',
'aksjeeigar':'aksjeeigar',
'aksjeeigarane':'aksjeeigarane',
'aksjeeigarar':'aksjeeigarar',
'aksjeeigaravtale':'aksjeeigaravtale',
'aksjeeigaren':'aksjeeigaren',
'aksjegevinster':'aksjegevinster',
'aksjeinnskot':'aksjeinnskot',
'aksjekapital':'aksjekapital',
'aksjekapitalen':'aksjekapitalen',
'aksjelov':'aksjelov',
'aksjelova':'aksjelova',
'aksjeloven':'aksjeloven',
'aksjelovens':'aksjelovens',
'aksjelovgjeving':'aksjelovgjeving',
'aksjelovgjevinga':'aksjelovgjevinga',
'aksjer':'aksjer',
'aksjerettslig':'aksjerettslig',
'aksjeselskap':'aksjeselskap',
'aksjeselskaper':'aksjeselskaper',
'aksjeselskapet':'aksjeselskapet',
'aksjeselskapsformen':'aksjeselskapsformen',
'aksjeselskapsrettslege':'aksjeselskapsrettslege',
'aksjonær':'aksjonær',
'aksjonæroppgaver':'aksjonæroppgaver',
'aktersetet':'aktersetet',
'aktes':'aktes',
'aktiv':'aktiv',
'aktiva':'aktiva',
'aktivaklasser':'aktivaklasser',
'aktivasammensetning':'aktivasammensetning',
'aktive':'aktive',
'aktivitet':'aktivitet',
'aktivitetane':'aktivitetane',
'aktivitetar':'aktivitetar',
'aktiviteten':'aktiviteten',
'aktivitetene':'aktivitetene',
'aktiviteter':'aktiviteter',
'aktivitetsøkning':'aktivitetsøkning',
'aktivt':'aktivt',
'aktlaust':'aktlaust',
'aktløyse':'aktløyse',
'aktsemd':'aktsemd',
'aktsemdplikta':'aktsemdplikta',
'aktualisere':'aktualisere',
'aktuar':'aktuar',
'aktuell':'aktuell',
'aktuelle':'aktuelle',
'aktuelt':'aktuelt',
'aktør':'aktør',
'aktørane':'aktørane',
'aktørar':'aktørar',
'aktørene':'aktørene',
'aktørenes':'aktørenes',
'aktørens':'aktørens',
'aktører':'aktører',
'aktørers':'aktørers',
'aktørgruppe':'aktørgruppe',
'aku':'aku',
'alarmsignalet':'alarmsignalet',
'aldeles':'aldeles',
'alder':'alder',
'alderdom':'alderdom',
'alderdommen':'alderdommen',
'alderen':'alderen',
'alderkilde':'alderkilde',
'alderpensjonen':'alderpensjonen',
'alderpensjonskapital':'alderpensjonskapital',
'alders':'alders',
'aldersdifferanse':'aldersdifferanse',
'aldersforskjellen':'aldersforskjellen',
'aldersgrense':'aldersgrense',
'aldersgrensen':'aldersgrensen',
'aldersgrensene':'aldersgrensene',
'aldersgrupper':'aldersgrupper',
'alderspensjon':'alderspensjon',
'alderspensjonen':'alderspensjonen',
'alderspensjoner':'alderspensjoner',
'alderspensjonist':'alderspensjonist',
'alderspensjonistene':'alderspensjonistene',
'alderspensjonister':'alderspensjonister',
'alderspensjonsforsikring':'alderspensjonsforsikring',
'alderspensjonsforsikringen':'alderspensjonsforsikringen',
}

View File

@ -0,0 +1,25 @@
# coding: utf8
"""Punctuation stolen from Danish"""
from __future__ import unicode_literals
from ..char_classes import LIST_ELLIPSES, LIST_ICONS
from ..char_classes import QUOTES, ALPHA, ALPHA_LOWER, ALPHA_UPPER
from ..punctuation import TOKENIZER_SUFFIXES
_quotes = QUOTES.replace("'", '')
_infixes = (LIST_ELLIPSES + LIST_ICONS +
[r'(?<=[{}])\.(?=[{}])'.format(ALPHA_LOWER, ALPHA_UPPER),
r'(?<=[{a}])[,!?](?=[{a}])'.format(a=ALPHA),
r'(?<=[{a}"])[:<>=](?=[{a}])'.format(a=ALPHA),
r'(?<=[{a}]),(?=[{a}])'.format(a=ALPHA),
r'(?<=[{a}])([{q}\)\]\(\[])(?=[\{a}])'.format(a=ALPHA, q=_quotes),
r'(?<=[{a}])--(?=[{a}])'.format(a=ALPHA)])
_suffixes = [suffix for suffix in TOKENIZER_SUFFIXES if suffix not in ["'s", "'S", "s", "S", r"\'"]]
_suffixes += [r"(?<=[^sSxXzZ])\'"]
TOKENIZER_INFIXES = _infixes
TOKENIZER_SUFFIXES = _suffixes

55
spacy/lang/nb/tag_map.py Normal file
View File

@ -0,0 +1,55 @@
# coding: utf8
"""Based on Garman tag map, converted using
https://pdfs.semanticscholar.org/87b9/24e2134f6782acc59ab567f6bf87cb5e5d9f.pdf"""
from __future__ import unicode_literals
from ...symbols import POS, PUNCT, ADJ, CONJ, CCONJ, SCONJ, SYM, NUM, DET, ADV, ADP, X, VERB
from ...symbols import NOUN, PROPN, PART, INTJ, SPACE, PRON, AUX
TAG_MAP = {
"$(": {POS: PUNCT, "PunctType": "PUNCT"},
"$)": {POS: PUNCT, "PunctType": "PUNCT"},
# <parentes-slutt> PUNCT
# <parentes-beg> PUNCT
"$,": {POS: PUNCT, "PunctType": "PUNCT"},
"$.": {POS: PUNCT, "PunctType": "PUNCT"},
"$\"": {POS: PUNCT, "PunctType": "PUNCT"},
"$-": {POS: PUNCT, "PunctType": "PUNCT"},
'NOUN': {POS: NOUN},
'PROPN': {POS: PROPN},
'VERB': {POS: VERB},
'PUNCT': {POS: PUNCT},
'ADJ': {POS: ADJ},
'ADP': {POS: ADP},
'PART': {POS: PART},
'DET': {POS: DET},
'AUX': {POS: AUX},
'PRON': {POS: PRON},
'CCONJ': {POS: CCONJ},
'NUM': {POS: NUM},
'ADV': {POS: ADV},
'SCONJ': {POS: SCONJ},
'SYM': {POS: SYM},
'X': {POS: X},
'INTJ': {POS: INTJ},
# <anf> PUNCT
# 'adj': {POS: ADJ},
# 'adv': {POS: ADV},
# 'clb': {POS: PUNCT}, # SYM
# 'det': {POS: DET}, # NUM
# 'konj': {POS: CONJ},
# 'interj': {POS: INTJ},
# 'inf-merke': {POS: PART},
# 'prep': {POS: ADP},
# # 'prep': {POS: ADV},
# 'pron': {POS: PRON},
# 'sbu': {POS: SCONJ}, #
# 'subst': {POS: NOUN}, #, PROPN
# 'symb': {POS: SYM}, #
# 'ukjent': {POS: X}, #
# 'verb': {POS: AUX}, #, VERB
}