mirror of
https://github.com/explosion/spaCy.git
synced 2024-12-25 09:26:27 +03:00
Merge pull request #1171 from mollerhoj/support-danish
Improve basic support for Danish
This commit is contained in:
commit
d3bf488e16
|
@ -3,6 +3,9 @@ from __future__ import unicode_literals
|
|||
|
||||
from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS
|
||||
from .stop_words import STOP_WORDS
|
||||
from .lex_attrs import LEX_ATTRS
|
||||
from .morph_rules import MORPH_RULES
|
||||
from ..tag_map import TAG_MAP
|
||||
|
||||
from ..tokenizer_exceptions import BASE_EXCEPTIONS
|
||||
from ..norm_exceptions import BASE_NORMS
|
||||
|
@ -13,9 +16,12 @@ from ...util import update_exc, add_lookups
|
|||
|
||||
class DanishDefaults(Language.Defaults):
|
||||
lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
|
||||
lex_attr_getters.update(LEX_ATTRS)
|
||||
lex_attr_getters[LANG] = lambda text: 'da'
|
||||
lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
|
||||
tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
|
||||
# morph_rules = MORPH_RULES
|
||||
tag_map = TAG_MAP
|
||||
stop_words = STOP_WORDS
|
||||
|
||||
|
||||
|
|
52
spacy/lang/da/lex_attrs.py
Normal file
52
spacy/lang/da/lex_attrs.py
Normal file
|
@ -0,0 +1,52 @@
|
|||
# coding: utf8
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from ...attrs import LIKE_NUM
|
||||
|
||||
# Source http://fjern-uv.dk/tal.php
|
||||
|
||||
_num_words = """nul
|
||||
en et to tre fire fem seks syv otte ni ti
|
||||
elleve tolv tretten fjorten femten seksten sytten atten nitten tyve
|
||||
enogtyve toogtyve treogtyve fireogtyve femogtyve seksogtyve syvogtyve otteogtyve niogtyve tredive
|
||||
enogtredive toogtredive treogtredive fireogtredive femogtredive seksogtredive syvogtredive otteogtredive niogtredive fyrre
|
||||
enogfyrre toogfyrre treogfyrre fireogfyrre femgogfyrre seksogfyrre syvogfyrre otteogfyrre niogfyrre halvtreds
|
||||
enoghalvtreds tooghalvtreds treoghalvtreds fireoghalvtreds femoghalvtreds seksoghalvtreds syvoghalvtreds otteoghalvtreds nioghalvtreds tres
|
||||
enogtres toogtres treogtres fireogtres femogtres seksogtres syvogtres otteogtres niogtres halvfjerds
|
||||
enoghalvfjerds tooghalvfjerds treoghalvfjerds fireoghalvfjerds femoghalvfjerds seksoghalvfjerds syvoghalvfjerds otteoghalvfjerds nioghalvfjerds firs
|
||||
enogfirs toogfirs treogfirs fireogfirs femogfirs seksogfirs syvogfirs otteogfirs niogfirs halvfems
|
||||
enoghalvfems tooghalvfems treoghalvfems fireoghalvfems femoghalvfems seksoghalvfems syvoghalvfems otteoghalvfems nioghalvfems hundrede
|
||||
million milliard billion billiard trillion trilliard
|
||||
""".split()
|
||||
|
||||
# source http://www.duda.dk/video/dansk/grammatik/talord/talord.html
|
||||
|
||||
_ordinal_words = """nulte
|
||||
første anden tredje fjerde femte sjette syvende ottende niende tiende
|
||||
elfte tolvte trettende fjortende femtende sekstende syttende attende nittende tyvende
|
||||
enogtyvende toogtyvende treogtyvende fireogtyvende femogtyvende seksogtyvende syvogtyvende otteogtyvende niogtyvende tredivte enogtredivte toogtredivte treogtredivte fireogtredivte femogtredivte seksogtredivte syvogtredivte otteogtredivte niogtredivte fyrretyvende
|
||||
enogfyrretyvende toogfyrretyvende treogfyrretyvende fireogfyrretyvende femogfyrretyvende seksogfyrretyvende syvogfyrretyvende otteogfyrretyvende niogfyrretyvende halvtredsindstyvende enoghalvtredsindstyvende
|
||||
tooghalvtredsindstyvende treoghalvtredsindstyvende fireoghalvtredsindstyvende femoghalvtredsindstyvende seksoghalvtredsindstyvende syvoghalvtredsindstyvende otteoghalvtredsindstyvende nioghalvtredsindstyvende
|
||||
tresindstyvende enogtresindstyvende toogtresindstyvende treogtresindstyvende fireogtresindstyvende femogtresindstyvende seksogtresindstyvende syvogtresindstyvende otteogtresindstyvende niogtresindstyvende halvfjerdsindstyvende
|
||||
enoghalvfjerdsindstyvende tooghalvfjerdsindstyvende treoghalvfjerdsindstyvende fireoghalvfjerdsindstyvende femoghalvfjerdsindstyvende seksoghalvfjerdsindstyvende syvoghalvfjerdsindstyvende otteoghalvfjerdsindstyvende nioghalvfjerdsindstyvende firsindstyvende
|
||||
enogfirsindstyvende toogfirsindstyvende treogfirsindstyvende fireogfirsindstyvende femogfirsindstyvende seksogfirsindstyvende syvogfirsindstyvende otteogfirsindstyvende niogfirsindstyvende halvfemsindstyvende
|
||||
enoghalvfemsindstyvende tooghalvfemsindstyvende treoghalvfemsindstyvende fireoghalvfemsindstyvende femoghalvfemsindstyvende seksoghalvfemsindstyvende syvoghalvfemsindstyvende otteoghalvfemsindstyvende nioghalvfemsindstyvende
|
||||
""".split()
|
||||
|
||||
def like_num(text):
|
||||
text = text.replace(',', '').replace('.', '')
|
||||
if text.isdigit():
|
||||
return True
|
||||
if text.count('/') == 1:
|
||||
num, denom = text.split('/')
|
||||
if num.isdigit() and denom.isdigit():
|
||||
return True
|
||||
if text in _num_words:
|
||||
return True
|
||||
if text in _ordinal_words:
|
||||
return True
|
||||
return False
|
||||
|
||||
LEX_ATTRS = {
|
||||
LIKE_NUM: like_num
|
||||
}
|
41
spacy/lang/da/morph_rules.py
Normal file
41
spacy/lang/da/morph_rules.py
Normal file
|
@ -0,0 +1,41 @@
|
|||
# coding: utf8
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from ...symbols import LEMMA
|
||||
from ...deprecated import PRON_LEMMA
|
||||
|
||||
MORPH_RULES = {
|
||||
"PRON": {
|
||||
"jeg": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "One", "Number": "Sing", "Case": "Nom"},
|
||||
"mig": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "One", "Number": "Sing", "Case": "Acc"},
|
||||
"du": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Two"},
|
||||
"han": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Sing", "Gender": "Masc", "Case": "Nom"},
|
||||
"ham": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Sing", "Gender": "Masc", "Case": "Acc"},
|
||||
"hun": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Sing", "Gender": "Fem", "Case": "Nom"},
|
||||
"hende": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Sing", "Gender": "Fem", "Case": "Acc"},
|
||||
"den": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Sing", "Gender": "Neut"},
|
||||
"det": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Sing", "Gender": "Neut"},
|
||||
"vi": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "One", "Number": "Plur", "Case": "Nom"},
|
||||
"os": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "One", "Number": "Plur", "Case": "Acc"},
|
||||
"de": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Plur", "Case": "Nom"},
|
||||
"dem": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Plur", "Case": "Acc"},
|
||||
|
||||
"min": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "One", "Number": "Sing", "Poss": "Yes", "Reflex": "Yes"},
|
||||
"din": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Two", "Number": "Sing", "Poss": "Yes", "Reflex": "Yes"},
|
||||
"hans": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Sing", "Gender": "Masc", "Poss": "Yes", "Reflex": "Yes"},
|
||||
"hendes": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Sing", "Gender": "Fem", "Poss": "Yes", "Reflex": "Yes"},
|
||||
"dens": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Sing", "Gender": "Neut", "Poss": "Yes", "Reflex": "Yes"},
|
||||
"dets": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Sing", "Gender": "Neut", "Poss": "Yes", "Reflex": "Yes"},
|
||||
"vores": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "One", "Number": "Plur", "Poss": "Yes", "Reflex": "Yes"},
|
||||
"deres": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Plur", "Poss": "Yes", "Reflex": "Yes"},
|
||||
},
|
||||
|
||||
"VERB": {
|
||||
"er": {LEMMA: "være", "VerbForm": "Fin", "Tense": "Pres"},
|
||||
"var": {LEMMA: "være", "VerbForm": "Fin", "Tense": "Past"}
|
||||
}
|
||||
}
|
||||
|
||||
for tag, rules in MORPH_RULES.items():
|
||||
for key, attrs in dict(rules).items():
|
||||
rules[key.title()] = attrs
|
|
@ -1,47 +1,46 @@
|
|||
# encoding: utf8
|
||||
from __future__ import unicode_literals
|
||||
|
||||
|
||||
# Source: https://github.com/stopwords-iso/stopwords-da
|
||||
# Source: Handpicked by Jens Dahl Møllerhøj.
|
||||
|
||||
STOP_WORDS = set("""
|
||||
ad af aldrig alle alt anden andet andre at
|
||||
af aldrig alene alle allerede alligevel alt altid anden andet andre at
|
||||
|
||||
bare begge blev blive bliver
|
||||
bag begge blandt blev blive bliver burde bør
|
||||
|
||||
da de dem den denne der deres det dette dig din dine disse dit dog du
|
||||
da de dem den denne dens der derefter deres derfor derfra deri dermed derpå derved det dette dig din dine disse dog du
|
||||
|
||||
efter ej eller en end ene eneste enhver er et
|
||||
efter egen eller ellers en end endnu ene eneste enhver ens enten er et
|
||||
|
||||
far fem fik fire flere fleste for fordi forrige fra få får før
|
||||
flere flest fleste for foran fordi forrige fra få før først
|
||||
|
||||
god godt
|
||||
gennem gjorde gjort god gør gøre gørende
|
||||
|
||||
ham han hans har havde have hej helt hende hendes her hos hun hvad hvem hver
|
||||
hvilken hvis hvor hvordan hvorfor hvornår
|
||||
ham han hans har havde have hel heller hen hende hendes henover her herefter heri hermed herpå hun hvad hvem hver hvilke hvilken hvilkes hvis hvor hvordan hvorefter hvorfor hvorfra hvorhen hvori hvorimod hvornår hvorved
|
||||
|
||||
i ikke ind ingen intet
|
||||
i igen igennem ikke imellem imens imod ind indtil ingen intet
|
||||
|
||||
ja jeg jer jeres jo
|
||||
jeg jer jeres jo
|
||||
|
||||
kan kom komme kommer kun kunne
|
||||
kan kom kommer kun kunne
|
||||
|
||||
lad lav lidt lige lille
|
||||
lad langs lav lave lavet lidt lige ligesom lille længere
|
||||
|
||||
man mand mange med meget men mens mere mig min mine mit mod må
|
||||
man mange med meget mellem men mens mere mest mig min mindre mindst mine mit må måske
|
||||
|
||||
ned nej ni nogen noget nogle nu ny nyt når nær næste næsten
|
||||
ned nemlig nogen nogensinde noget nogle nok nu ny nyt nær næste næsten
|
||||
|
||||
og også okay om op os otte over
|
||||
og også om omkring op os over overalt
|
||||
|
||||
på
|
||||
|
||||
se seks selv ser ses sig sige sin sine sit skal skulle som stor store syv så
|
||||
sådan
|
||||
samme sammen selv selvom senere ses siden sig sige skal skulle som stadig synes syntes så sådan således
|
||||
|
||||
tag tage thi ti til to tre
|
||||
temmelig tidligere til tilbage tit
|
||||
|
||||
ud under
|
||||
ud uden udover under undtagen
|
||||
|
||||
var ved vi vil ville vor vores være været
|
||||
var ved vi via vil ville vore vores vær være været
|
||||
|
||||
øvrigt
|
||||
""".split())
|
||||
|
|
|
@ -1,11 +1,27 @@
|
|||
# encoding: utf8
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from ...symbols import ORTH, LEMMA
|
||||
from ...symbols import ORTH, LEMMA, NORM
|
||||
|
||||
|
||||
_exc = {}
|
||||
|
||||
for exc_data in [
|
||||
{ORTH: "Kbh.", LEMMA: "København", NORM: "København"},
|
||||
|
||||
{ORTH: "Jan.", LEMMA: "januar", NORM: "januar"},
|
||||
{ORTH: "Feb.", LEMMA: "februar", NORM: "februar"},
|
||||
{ORTH: "Mar.", LEMMA: "marts", NORM: "marts"},
|
||||
{ORTH: "Apr.", LEMMA: "april", NORM: "april"},
|
||||
{ORTH: "Maj.", LEMMA: "maj", NORM: "maj"},
|
||||
{ORTH: "Jun.", LEMMA: "juni", NORM: "juni"},
|
||||
{ORTH: "Jul.", LEMMA: "juli", NORM: "juli"},
|
||||
{ORTH: "Aug.", LEMMA: "august", NORM: "august"},
|
||||
{ORTH: "Sep.", LEMMA: "september", NORM: "september"},
|
||||
{ORTH: "Okt.", LEMMA: "oktober", NORM: "oktober"},
|
||||
{ORTH: "Nov.", LEMMA: "november", NORM: "november"},
|
||||
{ORTH: "Dec.", LEMMA: "december", NORM: "december"}]:
|
||||
_exc[exc_data[ORTH]] = [dict(exc_data)]
|
||||
|
||||
for orth in [
|
||||
"A/S", "beg.", "bl.a.", "ca.", "d.s.s.", "dvs.", "f.eks.", "fr.", "hhv.",
|
||||
|
|
|
@ -16,7 +16,7 @@ call can cannot ca could
|
|||
|
||||
did do does doing done down due during
|
||||
|
||||
each eight either eleven else elsewhere empty enough etc even ever every
|
||||
each eight either eleven else elsewhere empty enough even ever every
|
||||
everyone everything everywhere except
|
||||
|
||||
few fifteen fifty first five for former formerly forty four from front full
|
||||
|
@ -27,7 +27,7 @@ get give go
|
|||
had has have he hence her here hereafter hereby herein hereupon hers herself
|
||||
him himself his how however hundred
|
||||
|
||||
i if in inc indeed into is it its itself
|
||||
i if in indeed into is it its itself
|
||||
|
||||
keep
|
||||
|
||||
|
|
|
@ -117,6 +117,9 @@ def he_tokenizer():
|
|||
def nb_tokenizer():
|
||||
return util.get_lang_class('nb').Defaults.create_tokenizer()
|
||||
|
||||
@pytest.fixture
|
||||
def da_tokenizer():
|
||||
return util.get_lang_class('da').Defaults.create_tokenizer()
|
||||
|
||||
@pytest.fixture
|
||||
def ja_tokenizer():
|
||||
|
|
0
spacy/tests/lang/da/__init__.py
Normal file
0
spacy/tests/lang/da/__init__.py
Normal file
15
spacy/tests/lang/da/test_exceptions.py
Normal file
15
spacy/tests/lang/da/test_exceptions.py
Normal file
|
@ -0,0 +1,15 @@
|
|||
# coding: utf-8
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import pytest
|
||||
|
||||
@pytest.mark.parametrize('text', ["ca.", "m.a.o.", "Jan.", "Dec."])
|
||||
def test_da_tokenizer_handles_abbr(da_tokenizer, text):
|
||||
tokens = da_tokenizer(text)
|
||||
assert len(tokens) == 1
|
||||
|
||||
def test_da_tokenizer_handles_exc_in_text(da_tokenizer):
|
||||
text = "Det er bl.a. ikke meningen"
|
||||
tokens = da_tokenizer(text)
|
||||
assert len(tokens) == 5
|
||||
assert tokens[2].text == "bl.a."
|
27
spacy/tests/lang/da/test_text.py
Normal file
27
spacy/tests/lang/da/test_text.py
Normal file
|
@ -0,0 +1,27 @@
|
|||
# coding: utf-8
|
||||
"""Test that longer and mixed texts are tokenized correctly."""
|
||||
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import pytest
|
||||
|
||||
def test_da_tokenizer_handles_long_text(da_tokenizer):
|
||||
text = """Der var så dejligt ude på landet. Det var sommer, kornet stod gult, havren grøn,
|
||||
høet var rejst i stakke nede i de grønne enge, og der gik storken på sine lange,
|
||||
røde ben og snakkede ægyptisk, for det sprog havde han lært af sin moder.
|
||||
|
||||
Rundt om ager og eng var der store skove, og midt i skovene dybe søer; jo, der var rigtignok dejligt derude på landet!"""
|
||||
tokens = da_tokenizer(text)
|
||||
assert len(tokens) == 84
|
||||
|
||||
@pytest.mark.parametrize('text,match', [
|
||||
('10', True), ('1', True), ('10.000', True), ('10.00', True),
|
||||
('999,0', True), ('en', True), ('treoghalvfemsindstyvende', True), ('hundrede', True),
|
||||
('hund', False), (',', False), ('1/2', True)])
|
||||
def test_lex_attrs_like_number(da_tokenizer, text, match):
|
||||
tokens = da_tokenizer(text)
|
||||
assert len(tokens) == 1
|
||||
print(tokens[0])
|
||||
assert tokens[0].like_num == match
|
||||
|
Loading…
Reference in New Issue
Block a user