mirror of
https://github.com/explosion/spaCy.git
synced 2025-05-02 23:03:41 +03:00
Improved Dutch language resources and Dutch lemmatization (#3409)
* Improved Dutch language resources and Dutch lemmatization * Fix conftest * Update punctuation.py * Auto-format * Format and fix tests * Remove unused test file * Re-add deleted test * removed redundant infix regex pattern for ','; note: brackets + simple hyphen remains * Cleaner lemmatization files
This commit is contained in:
parent
6a4575a56c
commit
951825532c
106
.github/contributors/nlptown.md
vendored
Normal file
106
.github/contributors/nlptown.md
vendored
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
# spaCy contributor agreement
|
||||||
|
|
||||||
|
This spaCy Contributor Agreement (**"SCA"**) is based on the
|
||||||
|
[Oracle Contributor Agreement](http://www.oracle.com/technetwork/oca-405177.pdf).
|
||||||
|
The SCA applies to any contribution that you make to any product or project
|
||||||
|
managed by us (the **"project"**), and sets out the intellectual property rights
|
||||||
|
you grant to us in the contributed materials. The term **"us"** shall mean
|
||||||
|
[ExplosionAI UG (haftungsbeschränkt)](https://explosion.ai/legal). The term
|
||||||
|
**"you"** shall mean the person or entity identified below.
|
||||||
|
|
||||||
|
If you agree to be bound by these terms, fill in the information requested
|
||||||
|
below and include the filled-in version with your first pull request, under the
|
||||||
|
folder [`.github/contributors/`](/.github/contributors/). The name of the file
|
||||||
|
should be your GitHub username, with the extension `.md`. For example, the user
|
||||||
|
example_user would create the file `.github/contributors/example_user.md`.
|
||||||
|
|
||||||
|
Read this agreement carefully before signing. These terms and conditions
|
||||||
|
constitute a binding legal agreement.
|
||||||
|
|
||||||
|
## Contributor Agreement
|
||||||
|
|
||||||
|
1. The term "contribution" or "contributed materials" means any source code,
|
||||||
|
object code, patch, tool, sample, graphic, specification, manual,
|
||||||
|
documentation, or any other material posted or submitted by you to the project.
|
||||||
|
|
||||||
|
2. With respect to any worldwide copyrights, or copyright applications and
|
||||||
|
registrations, in your contribution:
|
||||||
|
|
||||||
|
* you hereby assign to us joint ownership, and to the extent that such
|
||||||
|
assignment is or becomes invalid, ineffective or unenforceable, you hereby
|
||||||
|
grant to us a perpetual, irrevocable, non-exclusive, worldwide, no-charge,
|
||||||
|
royalty-free, unrestricted license to exercise all rights under those
|
||||||
|
copyrights. This includes, at our option, the right to sublicense these same
|
||||||
|
rights to third parties through multiple levels of sublicensees or other
|
||||||
|
licensing arrangements;
|
||||||
|
|
||||||
|
* you agree that each of us can do all things in relation to your
|
||||||
|
contribution as if each of us were the sole owners, and if one of us makes
|
||||||
|
a derivative work of your contribution, the one who makes the derivative
|
||||||
|
work (or has it made will be the sole owner of that derivative work;
|
||||||
|
|
||||||
|
* you agree that you will not assert any moral rights in your contribution
|
||||||
|
against us, our licensees or transferees;
|
||||||
|
|
||||||
|
* you agree that we may register a copyright in your contribution and
|
||||||
|
exercise all ownership rights associated with it; and
|
||||||
|
|
||||||
|
* you agree that neither of us has any duty to consult with, obtain the
|
||||||
|
consent of, pay or render an accounting to the other for any use or
|
||||||
|
distribution of your contribution.
|
||||||
|
|
||||||
|
3. With respect to any patents you own, or that you can license without payment
|
||||||
|
to any third party, you hereby grant to us a perpetual, irrevocable,
|
||||||
|
non-exclusive, worldwide, no-charge, royalty-free license to:
|
||||||
|
|
||||||
|
* make, have made, use, sell, offer to sell, import, and otherwise transfer
|
||||||
|
your contribution in whole or in part, alone or in combination with or
|
||||||
|
included in any product, work or materials arising out of the project to
|
||||||
|
which your contribution was submitted, and
|
||||||
|
|
||||||
|
* at our option, to sublicense these same rights to third parties through
|
||||||
|
multiple levels of sublicensees or other licensing arrangements.
|
||||||
|
|
||||||
|
4. Except as set out above, you keep all right, title, and interest in your
|
||||||
|
contribution. The rights that you grant to us under these terms are effective
|
||||||
|
on the date you first submitted a contribution to us, even if your submission
|
||||||
|
took place before the date you sign these terms.
|
||||||
|
|
||||||
|
5. You covenant, represent, warrant and agree that:
|
||||||
|
|
||||||
|
* Each contribution that you submit is and shall be an original work of
|
||||||
|
authorship and you can legally grant the rights set out in this SCA;
|
||||||
|
|
||||||
|
* to the best of your knowledge, each contribution will not violate any
|
||||||
|
third party's copyrights, trademarks, patents, or other intellectual
|
||||||
|
property rights; and
|
||||||
|
|
||||||
|
* each contribution shall be in compliance with U.S. export control laws and
|
||||||
|
other applicable export and import laws. You agree to notify us if you
|
||||||
|
become aware of any circumstance which would make any of the foregoing
|
||||||
|
representations inaccurate in any respect. We may publicly disclose your
|
||||||
|
participation in the project, including the fact that you have signed the SCA.
|
||||||
|
|
||||||
|
6. This SCA is governed by the laws of the State of California and applicable
|
||||||
|
U.S. Federal law. Any choice of law rules will not apply.
|
||||||
|
|
||||||
|
7. Please place an “x” on one of the applicable statement below. Please do NOT
|
||||||
|
mark both statements:
|
||||||
|
|
||||||
|
* [ ] I am signing on behalf of myself as an individual and no other person
|
||||||
|
or entity, including my employer, has or will have rights with respect to my
|
||||||
|
contributions.
|
||||||
|
|
||||||
|
* [x] I am signing on behalf of my employer or a legal entity and I have the
|
||||||
|
actual authority to contractually bind that entity.
|
||||||
|
|
||||||
|
## Contributor Details
|
||||||
|
|
||||||
|
| Field | Entry |
|
||||||
|
|------------------------------- | -------------------- |
|
||||||
|
| Name | Yves Peirsman |
|
||||||
|
| Company name (if applicable) | NLP Town (Island Constraints BVBA) |
|
||||||
|
| Title or role (if applicable) | Co-founder |
|
||||||
|
| Date | 14.03.2019 |
|
||||||
|
| GitHub username | nlptown |
|
||||||
|
| Website (optional) | http://www.nlp.town |
|
|
@ -4,6 +4,11 @@ from __future__ import unicode_literals
|
||||||
from .stop_words import STOP_WORDS
|
from .stop_words import STOP_WORDS
|
||||||
from .lex_attrs import LEX_ATTRS
|
from .lex_attrs import LEX_ATTRS
|
||||||
from .tag_map import TAG_MAP
|
from .tag_map import TAG_MAP
|
||||||
|
from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS
|
||||||
|
from .punctuation import TOKENIZER_INFIXES, TOKENIZER_SUFFIXES
|
||||||
|
|
||||||
|
from .lemmatizer import LOOKUP, LEMMA_EXC, LEMMA_INDEX, RULES
|
||||||
|
from .lemmatizer.lemmatizer import DutchLemmatizer
|
||||||
|
|
||||||
from ..tokenizer_exceptions import BASE_EXCEPTIONS
|
from ..tokenizer_exceptions import BASE_EXCEPTIONS
|
||||||
from ..norm_exceptions import BASE_NORMS
|
from ..norm_exceptions import BASE_NORMS
|
||||||
|
@ -13,20 +18,33 @@ from ...util import update_exc, add_lookups
|
||||||
|
|
||||||
|
|
||||||
class DutchDefaults(Language.Defaults):
|
class DutchDefaults(Language.Defaults):
|
||||||
|
|
||||||
lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
|
lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
|
||||||
lex_attr_getters.update(LEX_ATTRS)
|
lex_attr_getters.update(LEX_ATTRS)
|
||||||
lex_attr_getters[LANG] = lambda text: "nl"
|
lex_attr_getters[LANG] = lambda text: 'nl'
|
||||||
lex_attr_getters[NORM] = add_lookups(
|
lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM],
|
||||||
Language.Defaults.lex_attr_getters[NORM], BASE_NORMS
|
BASE_NORMS)
|
||||||
)
|
tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
|
||||||
tokenizer_exceptions = update_exc(BASE_EXCEPTIONS)
|
|
||||||
stop_words = STOP_WORDS
|
stop_words = STOP_WORDS
|
||||||
tag_map = TAG_MAP
|
tag_map = TAG_MAP
|
||||||
|
infixes = TOKENIZER_INFIXES
|
||||||
|
suffixes = TOKENIZER_SUFFIXES
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def create_lemmatizer(cls, nlp=None):
|
||||||
|
rules = RULES
|
||||||
|
lemma_index = LEMMA_INDEX
|
||||||
|
lemma_exc = LEMMA_EXC
|
||||||
|
lemma_lookup = LOOKUP
|
||||||
|
return DutchLemmatizer(index=lemma_index,
|
||||||
|
exceptions=lemma_exc,
|
||||||
|
lookup=lemma_lookup,
|
||||||
|
rules=rules)
|
||||||
|
|
||||||
|
|
||||||
class Dutch(Language):
|
class Dutch(Language):
|
||||||
lang = "nl"
|
lang = 'nl'
|
||||||
Defaults = DutchDefaults
|
Defaults = DutchDefaults
|
||||||
|
|
||||||
|
|
||||||
__all__ = ["Dutch"]
|
__all__ = ['Dutch']
|
||||||
|
|
|
@ -14,5 +14,5 @@ sentences = [
|
||||||
"Apple overweegt om voor 1 miljard een U.K. startup te kopen",
|
"Apple overweegt om voor 1 miljard een U.K. startup te kopen",
|
||||||
"Autonome auto's verschuiven de verzekeringverantwoordelijkheid naar producenten",
|
"Autonome auto's verschuiven de verzekeringverantwoordelijkheid naar producenten",
|
||||||
"San Francisco overweegt robots op voetpaden te verbieden",
|
"San Francisco overweegt robots op voetpaden te verbieden",
|
||||||
"Londen is een grote stad in het Verenigd Koninkrijk",
|
"Londen is een grote stad in het Verenigd Koninkrijk"
|
||||||
]
|
]
|
||||||
|
|
40
spacy/lang/nl/lemmatizer/__init__.py
Normal file
40
spacy/lang/nl/lemmatizer/__init__.py
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
# coding: utf8
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from ._verbs_irreg import VERBS_IRREG
|
||||||
|
from ._nouns_irreg import NOUNS_IRREG
|
||||||
|
from ._adjectives_irreg import ADJECTIVES_IRREG
|
||||||
|
from ._adverbs_irreg import ADVERBS_IRREG
|
||||||
|
|
||||||
|
from ._adpositions_irreg import ADPOSITIONS_IRREG
|
||||||
|
from ._determiners_irreg import DETERMINERS_IRREG
|
||||||
|
from ._pronouns_irreg import PRONOUNS_IRREG
|
||||||
|
|
||||||
|
from ._verbs import VERBS
|
||||||
|
from ._nouns import NOUNS
|
||||||
|
from ._adjectives import ADJECTIVES
|
||||||
|
|
||||||
|
from ._adpositions import ADPOSITIONS
|
||||||
|
from ._determiners import DETERMINERS
|
||||||
|
|
||||||
|
from .lookup import LOOKUP
|
||||||
|
|
||||||
|
from ._lemma_rules import RULES
|
||||||
|
|
||||||
|
from .lemmatizer import DutchLemmatizer
|
||||||
|
|
||||||
|
|
||||||
|
LEMMA_INDEX = {"adj": ADJECTIVES,
|
||||||
|
"noun": NOUNS,
|
||||||
|
"verb": VERBS,
|
||||||
|
"adp": ADPOSITIONS,
|
||||||
|
"det": DETERMINERS}
|
||||||
|
|
||||||
|
LEMMA_EXC = {"adj": ADJECTIVES_IRREG,
|
||||||
|
"adv": ADVERBS_IRREG,
|
||||||
|
"adp": ADPOSITIONS_IRREG,
|
||||||
|
"noun": NOUNS_IRREG,
|
||||||
|
"verb": VERBS_IRREG,
|
||||||
|
"det": DETERMINERS_IRREG,
|
||||||
|
"pron": PRONOUNS_IRREG}
|
||||||
|
|
3461
spacy/lang/nl/lemmatizer/_adjectives.py
Normal file
3461
spacy/lang/nl/lemmatizer/_adjectives.py
Normal file
File diff suppressed because it is too large
Load Diff
3033
spacy/lang/nl/lemmatizer/_adjectives_irreg.py
Normal file
3033
spacy/lang/nl/lemmatizer/_adjectives_irreg.py
Normal file
File diff suppressed because it is too large
Load Diff
24
spacy/lang/nl/lemmatizer/_adpositions.py
Normal file
24
spacy/lang/nl/lemmatizer/_adpositions.py
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# coding: utf8
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
|
||||||
|
ADPOSITIONS = set(
|
||||||
|
('aan aangaande aanwezig achter af afgezien al als an annex anno anti '
|
||||||
|
'behalve behoudens beneden benevens benoorden beoosten betreffende bewesten '
|
||||||
|
'bezijden bezuiden bij binnen binnenuit binst bladzij blijkens boven bovenop '
|
||||||
|
'buiten conform contra cq daaraan daarbij daarbuiten daarin daarnaar '
|
||||||
|
'daaronder daartegenover daarvan dankzij deure dichtbij door doordat doorheen '
|
||||||
|
'echter eraf erop erover errond eruit ervoor evenals exclusief gedaan '
|
||||||
|
'gedurende gegeven getuige gezien halfweg halverwege heen hierdoorheen hierop '
|
||||||
|
'houdende in inclusief indien ingaande ingevolge inzake jegens kortweg '
|
||||||
|
'krachtens kralj langs langsheen langst lastens linksom lopende luidens mede '
|
||||||
|
'mee met middels midden middenop mits na naan naar naartoe naast naat nabij '
|
||||||
|
'nadat namens neer neffe neffen neven nevenst niettegenstaande nopens '
|
||||||
|
'officieel om omheen omstreeks omtrent onafgezien ondanks onder onderaan '
|
||||||
|
'ondere ongeacht ooit op open over per plus pro qua rechtover rond rondom '
|
||||||
|
"sedert sinds spijts strekkende te tegen tegenaan tegenop tegenover telde "
|
||||||
|
'teneinde terug tijdens toe tot totdat trots tussen tégen uit uitgenomen '
|
||||||
|
'ultimo van vanaf vandaan vandoor vanop vanuit vanwege versus via vinnen '
|
||||||
|
'vlakbij volgens voor voor- voorbij voordat voort voren vòòr vóór waaraan '
|
||||||
|
'waarbij waardoor waaronder weg wegens weleens zijdens zoals zodat zonder '
|
||||||
|
'zónder à').split())
|
12
spacy/lang/nl/lemmatizer/_adpositions_irreg.py
Normal file
12
spacy/lang/nl/lemmatizer/_adpositions_irreg.py
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
# coding: utf8
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
|
||||||
|
ADPOSITIONS_IRREG = {
|
||||||
|
"'t": ('te',),
|
||||||
|
'me': ('mee',),
|
||||||
|
'meer': ('mee',),
|
||||||
|
'on': ('om',),
|
||||||
|
'ten': ('te',),
|
||||||
|
'ter': ('te',)
|
||||||
|
}
|
19
spacy/lang/nl/lemmatizer/_adverbs_irreg.py
Normal file
19
spacy/lang/nl/lemmatizer/_adverbs_irreg.py
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
# coding: utf8
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
|
||||||
|
ADVERBS_IRREG = {
|
||||||
|
"'ns": ('eens',),
|
||||||
|
"'s": ('eens',),
|
||||||
|
"'t": ('het',),
|
||||||
|
"d'r": ('er',),
|
||||||
|
"d'raf": ('eraf',),
|
||||||
|
"d'rbij": ('erbij',),
|
||||||
|
"d'rheen": ('erheen',),
|
||||||
|
"d'rin": ('erin',),
|
||||||
|
"d'rna": ('erna',),
|
||||||
|
"d'rnaar": ('ernaar',),
|
||||||
|
'hele': ('heel',),
|
||||||
|
'nevenst': ('nevens',),
|
||||||
|
'overend': ('overeind',)
|
||||||
|
}
|
17
spacy/lang/nl/lemmatizer/_determiners.py
Normal file
17
spacy/lang/nl/lemmatizer/_determiners.py
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
# coding: utf8
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
|
||||||
|
DETERMINERS = set(
|
||||||
|
("al allebei allerhande allerminst alletwee"
|
||||||
|
"beide clip-on d'n d'r dat datgeen datgene de dees degeen degene den dewelke "
|
||||||
|
'deze dezelfde die diegeen diegene diehien dien diene diens diezelfde dit '
|
||||||
|
'ditgene e een eene eigen elk elkens elkes enig enkel enne ettelijke eure '
|
||||||
|
'euren evenveel ewe ge geen ginds géén haar haaren halfelf het hetgeen '
|
||||||
|
'hetwelk hetzelfde heur heure hulder hulle hullen hullie hun hunder hunderen '
|
||||||
|
'ieder iederes ja je jen jouw jouwen jouwes jullie junder keiveel keiweinig '
|
||||||
|
"m'ne me meer meerder meerdere menen menig mijn mijnes minst méér niemendal "
|
||||||
|
'oe ons onse se sommig sommigeder superveel telken teveel titulair ulder '
|
||||||
|
'uldere ulderen ulle under une uw vaak veel veels véél wat weinig welk welken '
|
||||||
|
"welkene welksten z'nen ze zenen zijn zo'n zo'ne zoiet zoveel zovele zovelen "
|
||||||
|
'zuk zulk zulkdanig zulken zulks zullie zíjn àlle álle').split())
|
69
spacy/lang/nl/lemmatizer/_determiners_irreg.py
Normal file
69
spacy/lang/nl/lemmatizer/_determiners_irreg.py
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
# coding: utf8
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
|
||||||
|
DETERMINERS_IRREG = {
|
||||||
|
"'r": ('haar',),
|
||||||
|
"'s": ('de',),
|
||||||
|
"'t": ('het',),
|
||||||
|
"'tgene": ('hetgeen',),
|
||||||
|
'alle': ('al',),
|
||||||
|
'allen': ('al',),
|
||||||
|
'aller': ('al',),
|
||||||
|
'beiden': ('beide',),
|
||||||
|
'beider': ('beide',),
|
||||||
|
"d'": ('het',),
|
||||||
|
"d'r": ('haar',),
|
||||||
|
'der': ('de',),
|
||||||
|
'des': ('de',),
|
||||||
|
'dezer': ('deze',),
|
||||||
|
'dienen': ('die',),
|
||||||
|
'dier': ('die',),
|
||||||
|
'elke': ('elk',),
|
||||||
|
'ene': ('een',),
|
||||||
|
'enen': ('een',),
|
||||||
|
'ener': ('een',),
|
||||||
|
'enige': ('enig',),
|
||||||
|
'enigen': ('enig',),
|
||||||
|
'er': ('haar',),
|
||||||
|
'gene': ('geen',),
|
||||||
|
'genen': ('geen',),
|
||||||
|
'hare': ('haar',),
|
||||||
|
'haren': ('haar',),
|
||||||
|
'harer': ('haar',),
|
||||||
|
'hunne': ('hun',),
|
||||||
|
'hunnen': ('hun',),
|
||||||
|
'jou': ('jouw',),
|
||||||
|
'jouwe': ('jouw',),
|
||||||
|
'julliejen': ('jullie',),
|
||||||
|
"m'n": ('mijn',),
|
||||||
|
'mee': ('meer',),
|
||||||
|
'meer': ('veel',),
|
||||||
|
'meerderen': ('meerdere',),
|
||||||
|
'meest': ('veel',),
|
||||||
|
'meesten': ('veel',),
|
||||||
|
'meet': ('veel',),
|
||||||
|
'menige': ('menig',),
|
||||||
|
'mij': ('mijn',),
|
||||||
|
'mijnen': ('mijn',),
|
||||||
|
'minder': ('weinig',),
|
||||||
|
'mindere': ('weinig',),
|
||||||
|
'minst': ('weinig',),
|
||||||
|
'minste': ('minst',),
|
||||||
|
'ne': ('een',),
|
||||||
|
'onze': ('ons',),
|
||||||
|
'onzent': ('ons',),
|
||||||
|
'onzer': ('ons',),
|
||||||
|
'ouw': ('uw',),
|
||||||
|
'sommige': ('sommig',),
|
||||||
|
'sommigen': ('sommig',),
|
||||||
|
'u': ('uw',),
|
||||||
|
'vaker': ('vaak',),
|
||||||
|
'vele': ('veel',),
|
||||||
|
'velen': ('veel',),
|
||||||
|
'welke': ('welk',),
|
||||||
|
'zijne': ('zijn',),
|
||||||
|
'zijnen': ('zijn',),
|
||||||
|
'zijns': ('zijn',),
|
||||||
|
'één': ('een',)
|
||||||
|
}
|
79
spacy/lang/nl/lemmatizer/_lemma_rules.py
Normal file
79
spacy/lang/nl/lemmatizer/_lemma_rules.py
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
# coding: utf8
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
|
||||||
|
ADJECTIVE_SUFFIX_RULES = [
|
||||||
|
["sten", ""],
|
||||||
|
["ste", ""],
|
||||||
|
["st", ""],
|
||||||
|
["er", ""],
|
||||||
|
["en", ""],
|
||||||
|
["e", ""],
|
||||||
|
["ende", "end"]
|
||||||
|
]
|
||||||
|
|
||||||
|
VERB_SUFFIX_RULES = [
|
||||||
|
["dt", "den"],
|
||||||
|
["de", "en"],
|
||||||
|
["te", "en"],
|
||||||
|
["dde", "den"],
|
||||||
|
["tte", "ten"],
|
||||||
|
["dden", "den"],
|
||||||
|
["tten", "ten"],
|
||||||
|
["end", "en"],
|
||||||
|
]
|
||||||
|
|
||||||
|
NOUN_SUFFIX_RULES = [
|
||||||
|
["en", ""],
|
||||||
|
["ën", ""],
|
||||||
|
["'er", ""],
|
||||||
|
["s", ""],
|
||||||
|
["tje", ""],
|
||||||
|
["kje", ""],
|
||||||
|
["'s", ""],
|
||||||
|
["ici", "icus"],
|
||||||
|
["heden", "heid"],
|
||||||
|
["elen", "eel"],
|
||||||
|
["ezen", "ees"],
|
||||||
|
["even", "eef"],
|
||||||
|
["ssen", "s"],
|
||||||
|
["rren", "r"],
|
||||||
|
["kken", "k"],
|
||||||
|
["bben", "b"]
|
||||||
|
]
|
||||||
|
|
||||||
|
NUM_SUFFIX_RULES = [
|
||||||
|
["ste", ""],
|
||||||
|
["sten", ""],
|
||||||
|
["ën", ""],
|
||||||
|
["en", ""],
|
||||||
|
["de", ""],
|
||||||
|
["er", ""],
|
||||||
|
["ër", ""],
|
||||||
|
["tjes", ""]
|
||||||
|
]
|
||||||
|
|
||||||
|
PUNCT_SUFFIX_RULES = [
|
||||||
|
["“", "\""],
|
||||||
|
["”", "\""],
|
||||||
|
["\u2018", "'"],
|
||||||
|
["\u2019", "'"]
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
# In-place sort guaranteeing that longer -- more specific -- rules are
|
||||||
|
# applied first.
|
||||||
|
for rule_set in (ADJECTIVE_SUFFIX_RULES,
|
||||||
|
NOUN_SUFFIX_RULES,
|
||||||
|
NUM_SUFFIX_RULES,
|
||||||
|
VERB_SUFFIX_RULES):
|
||||||
|
rule_set.sort(key=lambda r: len(r[0]), reverse=True)
|
||||||
|
|
||||||
|
|
||||||
|
RULES = {
|
||||||
|
"adj": ADJECTIVE_SUFFIX_RULES,
|
||||||
|
"noun": NOUN_SUFFIX_RULES,
|
||||||
|
"verb": VERB_SUFFIX_RULES,
|
||||||
|
"num": NUM_SUFFIX_RULES,
|
||||||
|
"punct": PUNCT_SUFFIX_RULES
|
||||||
|
}
|
27890
spacy/lang/nl/lemmatizer/_nouns.py
Normal file
27890
spacy/lang/nl/lemmatizer/_nouns.py
Normal file
File diff suppressed because it is too large
Load Diff
3240
spacy/lang/nl/lemmatizer/_nouns_irreg.py
Normal file
3240
spacy/lang/nl/lemmatizer/_nouns_irreg.py
Normal file
File diff suppressed because it is too large
Load Diff
31
spacy/lang/nl/lemmatizer/_numbers_irreg.py
Normal file
31
spacy/lang/nl/lemmatizer/_numbers_irreg.py
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
# coding: utf8
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
|
||||||
|
NUMBERS_IRREG = {
|
||||||
|
'achten': ('acht',),
|
||||||
|
'biljoenen': ('biljoen',),
|
||||||
|
'drieën': ('drie',),
|
||||||
|
'duizenden': ('duizend',),
|
||||||
|
'eentjes': ('één',),
|
||||||
|
'elven': ('elf',),
|
||||||
|
'miljoenen': ('miljoen',),
|
||||||
|
'negenen': ('negen',),
|
||||||
|
'negentiger': ('negentig',),
|
||||||
|
'tienduizenden': ('tienduizend',),
|
||||||
|
'tienen': ('tien',),
|
||||||
|
'tientjes': ('tien',),
|
||||||
|
'twaalven': ('twaalf',),
|
||||||
|
'tweeën': ('twee',),
|
||||||
|
'twintiger': ('twintig',),
|
||||||
|
'twintigsten': ('twintig',),
|
||||||
|
'vieren': ('vier',),
|
||||||
|
'vijftiger': ('vijftig',),
|
||||||
|
'vijven': ('vijf',),
|
||||||
|
'zessen': ('zes',),
|
||||||
|
'zestiger': ('zestig',),
|
||||||
|
'zevenen': ('zeven',),
|
||||||
|
'zeventiger': ('zeventig',),
|
||||||
|
'zovele': ('zoveel',),
|
||||||
|
'zovelen': ('zoveel',)
|
||||||
|
}
|
35
spacy/lang/nl/lemmatizer/_pronouns_irreg.py
Normal file
35
spacy/lang/nl/lemmatizer/_pronouns_irreg.py
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
# coding: utf8
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
|
||||||
|
PRONOUNS_IRREG = {
|
||||||
|
"'r": ('haar',),
|
||||||
|
"'rzelf": ('haarzelf',),
|
||||||
|
"'t": ('het',),
|
||||||
|
"d'r": ('haar',),
|
||||||
|
'da': ('dat',),
|
||||||
|
'dienen': ('die',),
|
||||||
|
'diens': ('die',),
|
||||||
|
'dies': ('die',),
|
||||||
|
'elkaars': ('elkaar',),
|
||||||
|
'elkanders': ('elkander',),
|
||||||
|
'ene': ('een',),
|
||||||
|
'enen': ('een',),
|
||||||
|
'fik': ('ik',),
|
||||||
|
'gaat': ('gaan',),
|
||||||
|
'gene': ('geen',),
|
||||||
|
'harer': ('haar',),
|
||||||
|
'ieders': ('ieder',),
|
||||||
|
'iemands': ('iemand',),
|
||||||
|
'ikke': ('ik',),
|
||||||
|
'mijnen': ('mijn',),
|
||||||
|
'oe': ('je',),
|
||||||
|
'onzer': ('ons',),
|
||||||
|
'wa': ('wat',),
|
||||||
|
'watte': ('wat',),
|
||||||
|
'wier': ('wie',),
|
||||||
|
'zijns': ('zijn',),
|
||||||
|
'zoietsken': ('zoietske',),
|
||||||
|
'zulks': ('zulk',),
|
||||||
|
'één': ('een',)
|
||||||
|
}
|
2873
spacy/lang/nl/lemmatizer/_verbs.py
Normal file
2873
spacy/lang/nl/lemmatizer/_verbs.py
Normal file
File diff suppressed because it is too large
Load Diff
7201
spacy/lang/nl/lemmatizer/_verbs_irreg.py
Normal file
7201
spacy/lang/nl/lemmatizer/_verbs_irreg.py
Normal file
File diff suppressed because it is too large
Load Diff
130
spacy/lang/nl/lemmatizer/lemmatizer.py
Normal file
130
spacy/lang/nl/lemmatizer/lemmatizer.py
Normal file
|
@ -0,0 +1,130 @@
|
||||||
|
# coding: utf8
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from ....symbols import POS, NOUN, VERB, ADJ, NUM, DET, PRON, ADP, AUX, ADV
|
||||||
|
|
||||||
|
|
||||||
|
class DutchLemmatizer(object):
|
||||||
|
# Note: CGN does not distinguish AUX verbs, so we treat AUX as VERB.
|
||||||
|
univ_pos_name_variants = {
|
||||||
|
NOUN: "noun", "NOUN": "noun", "noun": "noun",
|
||||||
|
VERB: "verb", "VERB": "verb", "verb": "verb",
|
||||||
|
AUX: "verb", "AUX": "verb", "aux": "verb",
|
||||||
|
ADJ: "adj", "ADJ": "adj", "adj": "adj",
|
||||||
|
ADV: "adv", "ADV": "adv", "adv": "adv",
|
||||||
|
PRON: "pron", "PRON": "pron", "pron": "pron",
|
||||||
|
DET: "det", "DET": "det", "det": "det",
|
||||||
|
ADP: "adp", "ADP": "adp", "adp": "adp",
|
||||||
|
NUM: "num", "NUM": "num", "num": "num"
|
||||||
|
}
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def load(cls, path, index=None, exc=None, rules=None, lookup=None):
|
||||||
|
return cls(index, exc, rules, lookup)
|
||||||
|
|
||||||
|
def __init__(self, index=None, exceptions=None, rules=None, lookup=None):
|
||||||
|
self.index = index
|
||||||
|
self.exc = exceptions
|
||||||
|
self.rules = rules or {}
|
||||||
|
self.lookup_table = lookup if lookup is not None else {}
|
||||||
|
|
||||||
|
def __call__(self, string, univ_pos, morphology=None):
|
||||||
|
# Difference 1: self.rules is assumed to be non-None, so no
|
||||||
|
# 'is None' check required.
|
||||||
|
# String lowercased from the get-go. All lemmatization results in
|
||||||
|
# lowercased strings. For most applications, this shouldn't pose
|
||||||
|
# any problems, and it keeps the exceptions indexes small. If this
|
||||||
|
# creates problems for proper nouns, we can introduce a check for
|
||||||
|
# univ_pos == "PROPN".
|
||||||
|
string = string.lower()
|
||||||
|
try:
|
||||||
|
univ_pos = self.univ_pos_name_variants[univ_pos]
|
||||||
|
except KeyError:
|
||||||
|
# Because PROPN not in self.univ_pos_name_variants, proper names
|
||||||
|
# are not lemmatized. They are lowercased, however.
|
||||||
|
return [string]
|
||||||
|
# if string in self.lemma_index.get(univ_pos)
|
||||||
|
lemma_index = self.index.get(univ_pos, {})
|
||||||
|
# string is already lemma
|
||||||
|
if string in lemma_index:
|
||||||
|
return [string]
|
||||||
|
exceptions = self.exc.get(univ_pos, {})
|
||||||
|
# string is irregular token contained in exceptions index.
|
||||||
|
try:
|
||||||
|
lemma = exceptions[string]
|
||||||
|
return [lemma[0]]
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
# string corresponds to key in lookup table
|
||||||
|
lookup_table = self.lookup_table
|
||||||
|
looked_up_lemma = lookup_table.get(string)
|
||||||
|
if looked_up_lemma and looked_up_lemma in lemma_index:
|
||||||
|
return [looked_up_lemma]
|
||||||
|
|
||||||
|
forms, is_known = lemmatize(
|
||||||
|
string,
|
||||||
|
lemma_index,
|
||||||
|
exceptions,
|
||||||
|
self.rules.get(univ_pos, []))
|
||||||
|
|
||||||
|
# Back-off through remaining return value candidates.
|
||||||
|
if forms:
|
||||||
|
if is_known:
|
||||||
|
return forms
|
||||||
|
else:
|
||||||
|
for form in forms:
|
||||||
|
if form in exceptions:
|
||||||
|
return [form]
|
||||||
|
if looked_up_lemma:
|
||||||
|
return [looked_up_lemma]
|
||||||
|
else:
|
||||||
|
return forms
|
||||||
|
elif looked_up_lemma:
|
||||||
|
return [looked_up_lemma]
|
||||||
|
else:
|
||||||
|
return [string]
|
||||||
|
|
||||||
|
# Overrides parent method so that a lowercased version of the string is
|
||||||
|
# used to search the lookup table. This is necessary because our lookup
|
||||||
|
# table consists entirely of lowercase keys.
|
||||||
|
def lookup(self, string):
|
||||||
|
string = string.lower()
|
||||||
|
return self.lookup_table.get(string, string)
|
||||||
|
|
||||||
|
def noun(self, string, morphology=None):
|
||||||
|
return self(string, 'noun', morphology)
|
||||||
|
|
||||||
|
def verb(self, string, morphology=None):
|
||||||
|
return self(string, 'verb', morphology)
|
||||||
|
|
||||||
|
def adj(self, string, morphology=None):
|
||||||
|
return self(string, 'adj', morphology)
|
||||||
|
|
||||||
|
def det(self, string, morphology=None):
|
||||||
|
return self(string, 'det', morphology)
|
||||||
|
|
||||||
|
def pron(self, string, morphology=None):
|
||||||
|
return self(string, 'pron', morphology)
|
||||||
|
|
||||||
|
def adp(self, string, morphology=None):
|
||||||
|
return self(string, 'adp', morphology)
|
||||||
|
|
||||||
|
def punct(self, string, morphology=None):
|
||||||
|
return self(string, 'punct', morphology)
|
||||||
|
|
||||||
|
|
||||||
|
# Reimplemented to focus more on application of suffix rules and to return
|
||||||
|
# as early as possible.
|
||||||
|
def lemmatize(string, index, exceptions, rules):
|
||||||
|
# returns (forms, is_known: bool)
|
||||||
|
oov_forms = []
|
||||||
|
for old, new in rules:
|
||||||
|
if string.endswith(old):
|
||||||
|
form = string[:len(string) - len(old)] + new
|
||||||
|
if not form:
|
||||||
|
pass
|
||||||
|
elif form in index:
|
||||||
|
return [form], True # True = Is known (is lemma)
|
||||||
|
else:
|
||||||
|
oov_forms.append(form)
|
||||||
|
return list(set(oov_forms)), False
|
212951
spacy/lang/nl/lemmatizer/lookup.py
Normal file
212951
spacy/lang/nl/lemmatizer/lookup.py
Normal file
File diff suppressed because it is too large
Load Diff
|
@ -4,22 +4,18 @@ from __future__ import unicode_literals
|
||||||
from ...attrs import LIKE_NUM
|
from ...attrs import LIKE_NUM
|
||||||
|
|
||||||
|
|
||||||
_num_words = set(
|
_num_words = set("""
|
||||||
"""
|
|
||||||
nul een één twee drie vier vijf zes zeven acht negen tien elf twaalf dertien
|
nul een één twee drie vier vijf zes zeven acht negen tien elf twaalf dertien
|
||||||
veertien twintig dertig veertig vijftig zestig zeventig tachtig negentig honderd
|
veertien twintig dertig veertig vijftig zestig zeventig tachtig negentig honderd
|
||||||
duizend miljoen miljard biljoen biljard triljoen triljard
|
duizend miljoen miljard biljoen biljard triljoen triljard
|
||||||
""".split()
|
""".split())
|
||||||
)
|
|
||||||
|
|
||||||
_ordinal_words = set(
|
_ordinal_words = set("""
|
||||||
"""
|
|
||||||
eerste tweede derde vierde vijfde zesde zevende achtste negende tiende elfde
|
eerste tweede derde vierde vijfde zesde zevende achtste negende tiende elfde
|
||||||
twaalfde dertiende veertiende twintigste dertigste veertigste vijftigste
|
twaalfde dertiende veertiende twintigste dertigste veertigste vijftigste
|
||||||
zestigste zeventigste tachtigste negentigste honderdste duizendste miljoenste
|
zestigste zeventigste tachtigste negentigste honderdste duizendste miljoenste
|
||||||
miljardste biljoenste biljardste triljoenste triljardste
|
miljardste biljoenste biljardste triljoenste triljardste
|
||||||
""".split()
|
""".split())
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def like_num(text):
|
def like_num(text):
|
||||||
|
@ -27,13 +23,11 @@ def like_num(text):
|
||||||
# or matches one of the number words. In order to handle numbers like
|
# or matches one of the number words. In order to handle numbers like
|
||||||
# "drieëntwintig", more work is required.
|
# "drieëntwintig", more work is required.
|
||||||
# See this discussion: https://github.com/explosion/spaCy/pull/1177
|
# See this discussion: https://github.com/explosion/spaCy/pull/1177
|
||||||
if text.startswith(("+", "-", "±", "~")):
|
text = text.replace(',', '').replace('.', '')
|
||||||
text = text[1:]
|
|
||||||
text = text.replace(",", "").replace(".", "")
|
|
||||||
if text.isdigit():
|
if text.isdigit():
|
||||||
return True
|
return True
|
||||||
if text.count("/") == 1:
|
if text.count('/') == 1:
|
||||||
num, denom = text.split("/")
|
num, denom = text.split('/')
|
||||||
if num.isdigit() and denom.isdigit():
|
if num.isdigit() and denom.isdigit():
|
||||||
return True
|
return True
|
||||||
if text.lower() in _num_words:
|
if text.lower() in _num_words:
|
||||||
|
@ -43,4 +37,6 @@ def like_num(text):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
LEX_ATTRS = {LIKE_NUM: like_num}
|
LEX_ATTRS = {
|
||||||
|
LIKE_NUM: like_num
|
||||||
|
}
|
||||||
|
|
33
spacy/lang/nl/punctuation.py
Normal file
33
spacy/lang/nl/punctuation.py
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
# coding: utf8
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from ..char_classes import LIST_ELLIPSES, LIST_ICONS
|
||||||
|
from ..char_classes import CONCAT_QUOTES, ALPHA, ALPHA_LOWER, ALPHA_UPPER
|
||||||
|
|
||||||
|
from ..punctuation import TOKENIZER_SUFFIXES as DEFAULT_TOKENIZER_SUFFIXES
|
||||||
|
|
||||||
|
|
||||||
|
# Copied from `de` package. Main purpose is to ensure that hyphens are not
|
||||||
|
# split on.
|
||||||
|
|
||||||
|
_quotes = CONCAT_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),
|
||||||
|
r'(?<=[0-9])-(?=[0-9])'])
|
||||||
|
|
||||||
|
|
||||||
|
# Remove "'s" suffix from suffix list. In Dutch, "'s" is a plural ending when
|
||||||
|
# it occurs as a suffix and a clitic for "eens" in standalone use. To avoid
|
||||||
|
# ambiguity it's better to just leave it attached when it occurs as a suffix.
|
||||||
|
default_suffix_blacklist = ("'s", "'S", '’s', '’S')
|
||||||
|
_suffixes = [suffix for suffix in DEFAULT_TOKENIZER_SUFFIXES
|
||||||
|
if suffix not in default_suffix_blacklist]
|
||||||
|
|
||||||
|
TOKENIZER_INFIXES = _infixes
|
||||||
|
TOKENIZER_SUFFIXES = _suffixes
|
|
@ -1,45 +1,73 @@
|
||||||
# coding: utf8
|
# coding: utf8
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
# The original stop words list (added in f46ffe3) was taken from
|
||||||
|
# http://www.damienvanholten.com/downloads/dutch-stop-words.txt
|
||||||
|
# and consisted of about 100 tokens.
|
||||||
|
# In order to achieve parity with some of the better-supported
|
||||||
|
# languages, e.g., English, French, and German, this original list has been
|
||||||
|
# extended with 200 additional tokens. The main source of inspiration was
|
||||||
|
# https://raw.githubusercontent.com/stopwords-iso/stopwords-nl/master/stopwords-nl.txt.
|
||||||
|
# However, quite a bit of manual editing has taken place as well.
|
||||||
|
# Tokens whose status as a stop word is not entirely clear were admitted or
|
||||||
|
# rejected by deferring to their counterparts in the stop words lists for English
|
||||||
|
# and French. Similarly, those lists were used to identify and fill in gaps so
|
||||||
|
# that -- in principle -- each token contained in the English stop words list
|
||||||
|
# should have a Dutch counterpart here.
|
||||||
|
|
||||||
# Stop words are retrieved from http://www.damienvanholten.com/downloads/dutch-stop-words.txt
|
|
||||||
|
|
||||||
STOP_WORDS = set(
|
STOP_WORDS = set("""
|
||||||
"""
|
aan af al alle alles allebei alleen allen als altijd ander anders andere anderen aangaangde aangezien achter achterna
|
||||||
aan af al alles als altijd andere
|
afgelopen aldus alhoewel anderzijds
|
||||||
|
|
||||||
ben bij
|
ben bij bijna bijvoorbeeld behalve beide beiden beneden bent bepaald beter betere betreffende binnen binnenin boven
|
||||||
|
bovenal bovendien bovenstaand buiten
|
||||||
|
|
||||||
daar dan dat de der deze die dit doch doen door dus
|
daar dan dat de der den deze die dit doch doen door dus daarheen daarin daarna daarnet daarom daarop des dezelfde dezen
|
||||||
|
dien dikwijls doet doorgaand doorgaans
|
||||||
|
|
||||||
een eens en er
|
een eens en er echter enige eerder eerst eerste eersten effe eigen elk elke enkel enkele enz erdoor etc even eveneens
|
||||||
|
evenwel
|
||||||
|
|
||||||
ge geen geweest
|
ff
|
||||||
|
|
||||||
haar had heb hebben heeft hem het hier hij hoe hun
|
ge geen geweest gauw gedurende gegeven gehad geheel gekund geleden gelijk gemogen geven geweest gewoon gewoonweg
|
||||||
|
geworden gij
|
||||||
|
|
||||||
iemand iets ik in is
|
haar had heb hebben heeft hem het hier hij hoe hun hadden hare hebt hele hen hierbeneden hierboven hierin hoewel hun
|
||||||
|
|
||||||
ja je
|
iemand iets ik in is idd ieder ikke ikzelf indien inmiddels inz inzake
|
||||||
|
|
||||||
kan kon kunnen
|
ja je jou jouw jullie jezelf jij jijzelf jouwe juist
|
||||||
|
|
||||||
maar me meer men met mij mijn moet
|
kan kon kunnen klaar konden krachtens kunnen kunt
|
||||||
|
|
||||||
na naar niet niets nog nu
|
lang later liet liever
|
||||||
|
|
||||||
of om omdat ons ook op over
|
maar me meer men met mij mijn moet mag mede meer meesten mezelf mijzelf min minder misschien mocht mochten moest moesten
|
||||||
|
moet moeten mogelijk mogen
|
||||||
|
|
||||||
reeds
|
na naar niet niets nog nu nabij nadat net nogal nooit nr nu
|
||||||
|
|
||||||
te tegen toch toen tot
|
of om omdat ons ook op over omhoog omlaag omstreeks omtrent omver onder ondertussen ongeveer onszelf onze ooit opdat
|
||||||
|
opnieuw opzij over overigens
|
||||||
|
|
||||||
u uit uw
|
pas pp precies prof publ
|
||||||
|
|
||||||
van veel voor
|
reeds rond rondom
|
||||||
|
|
||||||
want waren was wat we wel werd wezen wie wij wil worden
|
sedert sinds sindsdien slechts sommige spoedig steeds
|
||||||
|
|
||||||
zal ze zei zelf zich zij zijn zo zonder zou
|
‘t 't te tegen toch toen tot tamelijk ten tenzij ter terwijl thans tijdens toe totdat tussen
|
||||||
""".split()
|
|
||||||
)
|
u uit uw uitgezonderd uwe uwen
|
||||||
|
|
||||||
|
van veel voor vaak vanaf vandaan vanuit vanwege veeleer verder verre vervolgens vgl volgens vooraf vooral vooralsnog
|
||||||
|
voorbij voordat voordien voorheen voorop voort voorts vooruit vrij vroeg
|
||||||
|
|
||||||
|
want waren was wat we wel werd wezen wie wij wil worden waar waarom wanneer want weer weg wegens weinig weinige weldra
|
||||||
|
welk welke welken werd werden wiens wier wilde wordt
|
||||||
|
|
||||||
|
zal ze zei zelf zich zij zijn zo zonder zou zeer zeker zekere zelfde zelfs zichzelf zijnde zijne zo’n zoals zodra zouden
|
||||||
|
zoveel zowat zulk zulke zulks zullen zult
|
||||||
|
""".split())
|
||||||
|
|
|
@ -5,7 +5,6 @@ from ...symbols import POS, PUNCT, ADJ, NUM, DET, ADV, ADP, X, VERB
|
||||||
from ...symbols import NOUN, PROPN, SPACE, PRON, CONJ
|
from ...symbols import NOUN, PROPN, SPACE, PRON, CONJ
|
||||||
|
|
||||||
|
|
||||||
# fmt: off
|
|
||||||
TAG_MAP = {
|
TAG_MAP = {
|
||||||
"ADJ__Number=Sing": {POS: ADJ},
|
"ADJ__Number=Sing": {POS: ADJ},
|
||||||
"ADJ___": {POS: ADJ},
|
"ADJ___": {POS: ADJ},
|
||||||
|
@ -811,4 +810,3 @@ TAG_MAP = {
|
||||||
"X___": {POS: X},
|
"X___": {POS: X},
|
||||||
"_SP": {POS: SPACE}
|
"_SP": {POS: SPACE}
|
||||||
}
|
}
|
||||||
# fmt: on
|
|
||||||
|
|
340
spacy/lang/nl/tokenizer_exceptions.py
Normal file
340
spacy/lang/nl/tokenizer_exceptions.py
Normal file
|
@ -0,0 +1,340 @@
|
||||||
|
# coding: utf8
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from ...symbols import ORTH, LEMMA, TAG, NORM, PRON_LEMMA
|
||||||
|
|
||||||
|
# Extensive list of both common and uncommon dutch abbreviations copied from
|
||||||
|
# github.com/diasks2/pragmatic_segmenter, a Ruby library for rule-based
|
||||||
|
# sentence boundary detection (MIT, Copyright 2015 Kevin S. Dias).
|
||||||
|
# Source file: https://github.com/diasks2/pragmatic_segmenter/blob/master/lib/pragmatic_segmenter/languages/dutch.rb
|
||||||
|
# (Last commit: 4d1477b)
|
||||||
|
|
||||||
|
# Main purpose of such an extensive list: considerably improved sentence
|
||||||
|
# segmentation.
|
||||||
|
|
||||||
|
# Note: This list has been copied over largely as-is. Some of the abbreviations
|
||||||
|
# are extremely domain-specific. Tokenizer performance may benefit from some
|
||||||
|
# slight pruning, although no performance regression has been observed so far.
|
||||||
|
|
||||||
|
|
||||||
|
abbrevs = ['a.2d.', 'a.a.', 'a.a.j.b.', 'a.f.t.', 'a.g.j.b.',
|
||||||
|
'a.h.v.', 'a.h.w.', 'a.hosp.', 'a.i.', 'a.j.b.', 'a.j.t.',
|
||||||
|
'a.m.', 'a.m.r.', 'a.p.m.', 'a.p.r.', 'a.p.t.', 'a.s.',
|
||||||
|
'a.t.d.f.', 'a.u.b.', 'a.v.a.', 'a.w.', 'aanbev.',
|
||||||
|
'aanbev.comm.', 'aant.', 'aanv.st.', 'aanw.', 'vnw.',
|
||||||
|
'aanw.vnw.', 'abd.', 'abm.', 'abs.', 'acc.act.',
|
||||||
|
'acc.bedr.m.', 'acc.bedr.t.', 'achterv.', 'act.dr.',
|
||||||
|
'act.dr.fam.', 'act.fisc.', 'act.soc.', 'adm.akk.',
|
||||||
|
'adm.besl.', 'adm.lex.', 'adm.onderr.', 'adm.ov.', 'adv.',
|
||||||
|
'adv.', 'gen.', 'adv.bl.', 'afd.', 'afl.', 'aggl.verord.',
|
||||||
|
'agr.', 'al.', 'alg.', 'alg.richts.', 'amén.', 'ann.dr.',
|
||||||
|
'ann.dr.lg.', 'ann.dr.sc.pol.', 'ann.ét.eur.',
|
||||||
|
'ann.fac.dr.lg.', 'ann.jur.créd.',
|
||||||
|
'ann.jur.créd.règl.coll.', 'ann.not.', 'ann.parl.',
|
||||||
|
'ann.prat.comm.', 'app.', 'arb.', 'aud.', 'arbbl.',
|
||||||
|
'arbh.', 'arbit.besl.', 'arbrb.', 'arr.', 'arr.cass.',
|
||||||
|
'arr.r.v.st.', 'arr.verbr.', 'arrondrb.', 'art.', 'artw.',
|
||||||
|
'aud.', 'b.', 'b.', 'b.&w.', 'b.a.', 'b.a.s.', 'b.b.o.',
|
||||||
|
'b.best.dep.', 'b.br.ex.', 'b.coll.fr.gem.comm.',
|
||||||
|
'b.coll.vl.gem.comm.', 'b.d.cult.r.', 'b.d.gem.ex.',
|
||||||
|
'b.d.gem.reg.', 'b.dep.', 'b.e.b.', 'b.f.r.',
|
||||||
|
'b.fr.gem.ex.', 'b.fr.gem.reg.', 'b.i.h.', 'b.inl.j.d.',
|
||||||
|
'b.inl.s.reg.', 'b.j.', 'b.l.', 'b.o.z.', 'b.prov.r.',
|
||||||
|
'b.r.h.', 'b.s.', 'b.sr.', 'b.stb.', 'b.t.i.r.',
|
||||||
|
'b.t.s.z.', 'b.t.w.rev.', 'b.v.',
|
||||||
|
'b.ver.coll.gem.gem.comm.', 'b.verg.r.b.', 'b.versl.',
|
||||||
|
'b.vl.ex.', 'b.voorl.reg.', 'b.w.', 'b.w.gew.ex.',
|
||||||
|
'b.z.d.g.', 'b.z.v.', 'bab.', 'bedr.org.', 'begins.',
|
||||||
|
'beheersov.', 'bekendm.comm.', 'bel.', 'bel.besch.',
|
||||||
|
'bel.w.p.', 'beleidsov.', 'belg.', 'grondw.', 'ber.',
|
||||||
|
'ber.w.', 'besch.', 'besl.', 'beslagr.', 'bestuurswet.',
|
||||||
|
'bet.', 'betr.', 'betr.', 'vnw.', 'bevest.', 'bew.',
|
||||||
|
'bijbl.', 'ind.', 'eig.', 'bijbl.n.bijdr.', 'bijl.',
|
||||||
|
'bijv.', 'bijw.', 'bijz.decr.', 'bin.b.', 'bkh.', 'bl.',
|
||||||
|
'blz.', 'bm.', 'bn.', 'rh.', 'bnw.', 'bouwr.', 'br.parl.',
|
||||||
|
'bs.', 'bull.', 'bull.adm.pénit.', 'bull.ass.',
|
||||||
|
'bull.b.m.m.', 'bull.bel.', 'bull.best.strafinr.',
|
||||||
|
'bull.bmm.', 'bull.c.b.n.', 'bull.c.n.c.', 'bull.cbn.',
|
||||||
|
'bull.centr.arb.', 'bull.cnc.', 'bull.contr.',
|
||||||
|
'bull.doc.min.fin.', 'bull.f.e.b.', 'bull.feb.',
|
||||||
|
'bull.fisc.fin.r.', 'bull.i.u.m.',
|
||||||
|
'bull.inf.ass.secr.soc.', 'bull.inf.i.e.c.',
|
||||||
|
'bull.inf.i.n.a.m.i.', 'bull.inf.i.r.e.', 'bull.inf.iec.',
|
||||||
|
'bull.inf.inami.', 'bull.inf.ire.', 'bull.inst.arb.',
|
||||||
|
'bull.ium.', 'bull.jur.imm.', 'bull.lég.b.', 'bull.off.',
|
||||||
|
'bull.trim.b.dr.comp.', 'bull.us.', 'bull.v.b.o.',
|
||||||
|
'bull.vbo.', 'bv.', 'bw.', 'bxh.', 'byz.', 'c.', 'c.a.',
|
||||||
|
'c.a.-a.', 'c.a.b.g.', 'c.c.', 'c.c.i.', 'c.c.s.',
|
||||||
|
'c.conc.jur.', 'c.d.e.', 'c.d.p.k.', 'c.e.', 'c.ex.',
|
||||||
|
'c.f.', 'c.h.a.', 'c.i.f.', 'c.i.f.i.c.', 'c.j.', 'c.l.',
|
||||||
|
'c.n.', 'c.o.d.', 'c.p.', 'c.pr.civ.', 'c.q.', 'c.r.',
|
||||||
|
'c.r.a.', 'c.s.', 'c.s.a.', 'c.s.q.n.', 'c.v.', 'c.v.a.',
|
||||||
|
'c.v.o.', 'ca.', 'cadeaust.', 'cah.const.',
|
||||||
|
'cah.dr.europ.', 'cah.dr.immo.', 'cah.dr.jud.', 'cal.',
|
||||||
|
'2d.', 'cal.', '3e.', 'cal.', 'rprt.', 'cap.', 'carg.',
|
||||||
|
'cass.', 'cass.', 'verw.', 'cert.', 'cf.', 'ch.', 'chron.',
|
||||||
|
'chron.d.s.', 'chron.dr.not.', 'cie.', 'cie.',
|
||||||
|
'verz.schr.', 'cir.', 'circ.', 'circ.z.', 'cit.',
|
||||||
|
'cit.loc.', 'civ.', 'cl.et.b.', 'cmt.', 'co.',
|
||||||
|
'cognoss.v.', 'coll.', 'v.', 'b.', 'colp.w.', 'com.',
|
||||||
|
'com.', 'cas.', 'com.v.min.', 'comm.', 'comm.', 'v.',
|
||||||
|
'comm.bijz.ov.', 'comm.erf.', 'comm.fin.', 'comm.ger.',
|
||||||
|
'comm.handel.', 'comm.pers.', 'comm.pub.', 'comm.straf.',
|
||||||
|
'comm.v.', 'comm.venn.', 'comm.verz.', 'comm.voor.',
|
||||||
|
'comp.', 'compt.w.', 'computerr.', 'con.m.', 'concl.',
|
||||||
|
'concr.', 'conf.', 'confl.w.', 'confl.w.huwbetr.', 'cons.',
|
||||||
|
'conv.', 'coöp.', 'ver.', 'corr.', 'corr.bl.',
|
||||||
|
'cour.fisc.', 'cour.immo.', 'cridon.', 'crim.', 'cur.',
|
||||||
|
'cur.', 'crt.', 'curs.', 'd.', 'd.-g.', 'd.a.', 'd.a.v.',
|
||||||
|
'd.b.f.', 'd.c.', 'd.c.c.r.', 'd.d.', 'd.d.p.', 'd.e.t.',
|
||||||
|
'd.gem.r.', 'd.h.', 'd.h.z.', 'd.i.', 'd.i.t.', 'd.j.',
|
||||||
|
'd.l.r.', 'd.m.', 'd.m.v.', 'd.o.v.', 'd.parl.', 'd.w.z.',
|
||||||
|
'dact.', 'dat.', 'dbesch.', 'dbesl.', 'decr.', 'decr.d.',
|
||||||
|
'decr.fr.', 'decr.vl.', 'decr.w.', 'def.', 'dep.opv.',
|
||||||
|
'dep.rtl.', 'derg.', 'desp.', 'det.mag.', 'deurw.regl.',
|
||||||
|
'dez.', 'dgl.', 'dhr.', 'disp.', 'diss.', 'div.',
|
||||||
|
'div.act.', 'div.bel.', 'dl.', 'dln.', 'dnotz.', 'doc.',
|
||||||
|
'hist.', 'doc.jur.b.', 'doc.min.fin.', 'doc.parl.',
|
||||||
|
'doctr.', 'dpl.', 'dpl.besl.', 'dr.', 'dr.banc.fin.',
|
||||||
|
'dr.circ.', 'dr.inform.', 'dr.mr.', 'dr.pén.entr.',
|
||||||
|
'dr.q.m.', 'drs.', 'dtp.', 'dwz.', 'dyn.', 'e.', 'e.a.',
|
||||||
|
'e.b.', 'tek.mod.', 'e.c.', 'e.c.a.', 'e.d.', 'e.e.',
|
||||||
|
'e.e.a.', 'e.e.g.', 'e.g.', 'e.g.a.', 'e.h.a.', 'e.i.',
|
||||||
|
'e.j.', 'e.m.a.', 'e.n.a.c.', 'e.o.', 'e.p.c.', 'e.r.c.',
|
||||||
|
'e.r.f.', 'e.r.h.', 'e.r.o.', 'e.r.p.', 'e.r.v.',
|
||||||
|
'e.s.r.a.', 'e.s.t.', 'e.v.', 'e.v.a.', 'e.w.', 'e&o.e.',
|
||||||
|
'ec.pol.r.', 'econ.', 'ed.', 'ed(s).', 'eff.', 'eig.',
|
||||||
|
'eig.mag.', 'eil.', 'elektr.', 'enmb.', 'enz.', 'err.',
|
||||||
|
'etc.', 'etq.', 'eur.', 'parl.', 'eur.t.s.', 'ev.', 'evt.',
|
||||||
|
'ex.', 'ex.crim.', 'exec.', 'f.', 'f.a.o.', 'f.a.q.',
|
||||||
|
'f.a.s.', 'f.i.b.', 'f.j.f.', 'f.o.b.', 'f.o.r.', 'f.o.s.',
|
||||||
|
'f.o.t.', 'f.r.', 'f.supp.', 'f.suppl.', 'fa.', 'facs.',
|
||||||
|
'fasc.', 'fg.', 'fid.ber.', 'fig.', 'fin.verh.w.', 'fisc.',
|
||||||
|
'fisc.', 'tijdschr.', 'fisc.act.', 'fisc.koer.', 'fl.',
|
||||||
|
'form.', 'foro.', 'it.', 'fr.', 'fr.cult.r.', 'fr.gem.r.',
|
||||||
|
'fr.parl.', 'fra.', 'ft.', 'g.', 'g.a.', 'g.a.v.',
|
||||||
|
'g.a.w.v.', 'g.g.d.', 'g.m.t.', 'g.o.', 'g.omt.e.', 'g.p.',
|
||||||
|
'g.s.', 'g.v.', 'g.w.w.', 'geb.', 'gebr.', 'gebrs.',
|
||||||
|
'gec.', 'gec.decr.', 'ged.', 'ged.st.', 'gedipl.',
|
||||||
|
'gedr.st.', 'geh.', 'gem.', 'gem.', 'gem.',
|
||||||
|
'gem.gem.comm.', 'gem.st.', 'gem.stem.', 'gem.w.',
|
||||||
|
'gemeensch.optr.', 'gemeensch.standp.', 'gemeensch.strat.',
|
||||||
|
'gemeent.', 'gemeent.b.', 'gemeent.regl.',
|
||||||
|
'gemeent.verord.', 'geol.', 'geopp.', 'gepubl.',
|
||||||
|
'ger.deurw.', 'ger.w.', 'gerekw.', 'gereq.', 'gesch.',
|
||||||
|
'get.', 'getr.', 'gev.m.', 'gev.maatr.', 'gew.', 'ghert.',
|
||||||
|
'gir.eff.verk.', 'gk.', 'gr.', 'gramm.', 'grat.w.',
|
||||||
|
'grootb.w.', 'grs.', 'grvm.', 'grw.', 'gst.', 'gw.',
|
||||||
|
'h.a.', 'h.a.v.o.', 'h.b.o.', 'h.e.a.o.', 'h.e.g.a.',
|
||||||
|
'h.e.geb.', 'h.e.gestr.', 'h.l.', 'h.m.', 'h.o.', 'h.r.',
|
||||||
|
'h.t.l.', 'h.t.m.', 'h.w.geb.', 'hand.', 'handelsn.w.',
|
||||||
|
'handelspr.', 'handelsr.w.', 'handelsreg.w.', 'handv.',
|
||||||
|
'harv.l.rev.', 'hc.', 'herald.', 'hert.', 'herz.',
|
||||||
|
'hfdst.', 'hfst.', 'hgrw.', 'hhr.', 'hist.', 'hooggel.',
|
||||||
|
'hoogl.', 'hosp.', 'hpw.', 'hr.', 'hr.', 'ms.', 'hr.ms.',
|
||||||
|
'hregw.', 'hrg.', 'hst.', 'huis.just.', 'huisv.w.',
|
||||||
|
'huurbl.', 'hv.vn.', 'hw.', 'hyp.w.', 'i.b.s.', 'i.c.',
|
||||||
|
'i.c.m.h.', 'i.e.', 'i.f.', 'i.f.p.', 'i.g.v.', 'i.h.',
|
||||||
|
'i.h.a.', 'i.h.b.', 'i.l.pr.', 'i.o.', 'i.p.o.', 'i.p.r.',
|
||||||
|
'i.p.v.', 'i.pl.v.', 'i.r.d.i.', 'i.s.m.', 'i.t.t.',
|
||||||
|
'i.v.', 'i.v.m.', 'i.v.s.', 'i.w.tr.', 'i.z.', 'ib.',
|
||||||
|
'ibid.', 'icip-ing.cons.', 'iem.', 'indic.soc.', 'indiv.',
|
||||||
|
'inf.', 'inf.i.d.a.c.', 'inf.idac.', 'inf.r.i.z.i.v.',
|
||||||
|
'inf.riziv.', 'inf.soc.secr.', 'ing.', 'ing.', 'cons.',
|
||||||
|
'ing.cons.', 'inst.', 'int.', 'int.', 'rechtsh.',
|
||||||
|
'strafz.', 'interm.', 'intern.fisc.act.',
|
||||||
|
'intern.vervoerr.', 'inv.', 'inv.', 'f.', 'inv.w.',
|
||||||
|
'inv.wet.', 'invord.w.', 'inz.', 'ir.', 'irspr.', 'iwtr.',
|
||||||
|
'j.', 'j.-cl.', 'j.c.b.', 'j.c.e.', 'j.c.fl.', 'j.c.j.',
|
||||||
|
'j.c.p.', 'j.d.e.', 'j.d.f.', 'j.d.s.c.', 'j.dr.jeun.',
|
||||||
|
'j.j.d.', 'j.j.p.', 'j.j.pol.', 'j.l.', 'j.l.m.b.',
|
||||||
|
'j.l.o.', 'j.p.a.', 'j.r.s.', 'j.t.', 'j.t.d.e.',
|
||||||
|
'j.t.dr.eur.', 'j.t.o.', 'j.t.t.', 'jaarl.', 'jb.hand.',
|
||||||
|
'jb.kred.', 'jb.kred.c.s.', 'jb.l.r.b.', 'jb.lrb.',
|
||||||
|
'jb.markt.', 'jb.mens.', 'jb.t.r.d.', 'jb.trd.',
|
||||||
|
'jeugdrb.', 'jeugdwerkg.w.', 'jg.', 'jis.', 'jl.',
|
||||||
|
'journ.jur.', 'journ.prat.dr.fisc.fin.', 'journ.proc.',
|
||||||
|
'jrg.', 'jur.', 'jur.comm.fl.', 'jur.dr.soc.b.l.n.',
|
||||||
|
'jur.f.p.e.', 'jur.fpe.', 'jur.niv.', 'jur.trav.brux.',
|
||||||
|
'jurambt.', 'jv.cass.', 'jv.h.r.j.', 'jv.hrj.', 'jw.',
|
||||||
|
'k.', 'k.', 'k.b.', 'k.g.', 'k.k.', 'k.m.b.o.', 'k.o.o.',
|
||||||
|
'k.v.k.', 'k.v.v.v.', 'kadasterw.', 'kaderb.', 'kador.',
|
||||||
|
'kbo-nr.', 'kg.', 'kh.', 'kiesw.', 'kind.bes.v.', 'kkr.',
|
||||||
|
'koopv.', 'kr.', 'krankz.w.', 'ksbel.', 'kt.', 'ktg.',
|
||||||
|
'ktr.', 'kvdm.', 'kw.r.', 'kymr.', 'kzr.', 'kzw.', 'l.',
|
||||||
|
'l.b.', 'l.b.o.', 'l.bas.', 'l.c.', 'l.gew.', 'l.j.',
|
||||||
|
'l.k.', 'l.l.', 'l.o.', 'l.r.b.', 'l.u.v.i.', 'l.v.r.',
|
||||||
|
'l.v.w.', 'l.w.', "l'exp.-compt.b..", 'l’exp.-compt.b.',
|
||||||
|
'landinr.w.', 'landscrt.', 'lat.', 'law.ed.', 'lett.',
|
||||||
|
'levensverz.', 'lgrs.', 'lidw.', 'limb.rechtsl.', 'lit.',
|
||||||
|
'litt.', 'liw.', 'liwet.', 'lk.', 'll.', 'll.(l.)l.r.',
|
||||||
|
'loonw.', 'losbl.', 'ltd.', 'luchtv.', 'luchtv.w.', 'm.',
|
||||||
|
'm.', 'not.', 'm.a.v.o.', 'm.a.w.', 'm.b.', 'm.b.o.',
|
||||||
|
'm.b.r.', 'm.b.t.', 'm.d.g.o.', 'm.e.a.o.', 'm.e.r.',
|
||||||
|
'm.h.', 'm.h.d.', 'm.i.v.', 'm.j.t.', 'm.k.', 'm.m.',
|
||||||
|
'm.m.a.', 'm.m.h.h.', 'm.m.v.', 'm.n.', 'm.not.fisc.',
|
||||||
|
'm.nt.', 'm.o.', 'm.r.', 'm.s.a.', 'm.u.p.', 'm.v.a.',
|
||||||
|
'm.v.h.n.', 'm.v.t.', 'm.z.', 'maatr.teboekgest.luchtv.',
|
||||||
|
'maced.', 'mand.', 'max.', 'mbl.not.', 'me.', 'med.',
|
||||||
|
'med.', 'v.b.o.', 'med.b.u.f.r.', 'med.bufr.', 'med.vbo.',
|
||||||
|
'meerv.', 'meetbr.w.', 'mém.adm.', 'mgr.', 'mgrs.', 'mhd.',
|
||||||
|
'mi.verantw.', 'mil.', 'mil.bed.', 'mil.ger.', 'min.',
|
||||||
|
'min.', 'aanbev.', 'min.', 'circ.', 'min.', 'fin.',
|
||||||
|
'min.j.omz.', 'min.just.circ.', 'mitt.', 'mnd.', 'mod.',
|
||||||
|
'mon.', 'mouv.comm.', 'mr.', 'ms.', 'muz.', 'mv.', 'n.',
|
||||||
|
'chr.', 'n.a.', 'n.a.g.', 'n.a.v.', 'n.b.', 'n.c.',
|
||||||
|
'n.chr.', 'n.d.', 'n.d.r.', 'n.e.a.', 'n.g.', 'n.h.b.c.',
|
||||||
|
'n.j.', 'n.j.b.', 'n.j.w.', 'n.l.', 'n.m.', 'n.m.m.',
|
||||||
|
'n.n.', 'n.n.b.', 'n.n.g.', 'n.n.k.', 'n.o.m.', 'n.o.t.k.',
|
||||||
|
'n.rapp.', 'n.tijd.pol.', 'n.v.', 'n.v.d.r.', 'n.v.d.v.',
|
||||||
|
'n.v.o.b.', 'n.v.t.', 'nat.besch.w.', 'nat.omb.',
|
||||||
|
'nat.pers.', 'ned.cult.r.', 'neg.verkl.', 'nhd.', 'wisk.',
|
||||||
|
'njcm-bull.', 'nl.', 'nnd.', 'no.', 'not.fisc.m.',
|
||||||
|
'not.w.', 'not.wet.', 'nr.', 'nrs.', 'nste.', 'nt.',
|
||||||
|
'numism.', 'o.', 'o.a.', 'o.b.', 'o.c.', 'o.g.', 'o.g.v.',
|
||||||
|
'o.i.', 'o.i.d.', 'o.m.', 'o.o.', 'o.o.d.', 'o.o.v.',
|
||||||
|
'o.p.', 'o.r.', 'o.regl.', 'o.s.', 'o.t.s.', 'o.t.t.',
|
||||||
|
'o.t.t.t.', 'o.t.t.z.', 'o.tk.t.', 'o.v.t.', 'o.v.t.t.',
|
||||||
|
'o.v.tk.t.', 'o.v.v.', 'ob.', 'obsv.', 'octr.',
|
||||||
|
'octr.gem.regl.', 'octr.regl.', 'oe.', 'off.pol.', 'ofra.',
|
||||||
|
'ohd.', 'omb.', 'omnil.', 'omz.', 'on.ww.', 'onderr.',
|
||||||
|
'onfrank.', 'onteig.w.', 'ontw.', 'b.w.', 'onuitg.',
|
||||||
|
'onz.', 'oorl.w.', 'op.cit.', 'opin.pa.', 'opm.', 'or.',
|
||||||
|
'ord.br.', 'ord.gem.', 'ors.', 'orth.', 'os.', 'osm.',
|
||||||
|
'ov.', 'ov.w.i.', 'ov.w.ii.', 'ov.ww.', 'overg.w.',
|
||||||
|
'overw.', 'ovkst.', 'oz.', 'p.', 'p.a.', 'p.a.o.',
|
||||||
|
'p.b.o.', 'p.e.', 'p.g.', 'p.j.', 'p.m.', 'p.m.a.', 'p.o.',
|
||||||
|
'p.o.j.t.', 'p.p.', 'p.v.', 'p.v.s.', 'pachtw.', 'pag.',
|
||||||
|
'pan.', 'pand.b.', 'pand.pér.', 'parl.gesch.',
|
||||||
|
'parl.gesch.', 'inv.', 'parl.st.', 'part.arb.', 'pas.',
|
||||||
|
'pasin.', 'pat.', 'pb.c.', 'pb.l.', 'pens.',
|
||||||
|
'pensioenverz.', 'per.ber.i.b.r.', 'per.ber.ibr.', 'pers.',
|
||||||
|
'st.', 'pft.', 'pk.', 'pktg.', 'plv.', 'po.', 'pol.',
|
||||||
|
'pol.off.', 'pol.r.', 'pol.w.', 'postbankw.', 'postw.',
|
||||||
|
'pp.', 'pr.', 'preadv.', 'pres.', 'prf.', 'prft.', 'prg.',
|
||||||
|
'prijz.w.', 'proc.', 'procesregl.', 'prof.', 'prot.',
|
||||||
|
'prov.', 'prov.b.', 'prov.instr.h.m.g.', 'prov.regl.',
|
||||||
|
'prov.verord.', 'prov.w.', 'publ.', 'pun.', 'pw.',
|
||||||
|
'q.b.d.', 'q.e.d.', 'q.q.', 'q.r.', 'r.', 'r.a.b.g.',
|
||||||
|
'r.a.c.e.', 'r.a.j.b.', 'r.b.d.c.', 'r.b.d.i.', 'r.b.s.s.',
|
||||||
|
'r.c.', 'r.c.b.', 'r.c.d.c.', 'r.c.j.b.', 'r.c.s.j.',
|
||||||
|
'r.cass.', 'r.d.c.', 'r.d.i.', 'r.d.i.d.c.', 'r.d.j.b.',
|
||||||
|
'r.d.j.p.', 'r.d.p.c.', 'r.d.s.', 'r.d.t.i.', 'r.e.',
|
||||||
|
'r.f.s.v.p.', 'r.g.a.r.', 'r.g.c.f.', 'r.g.d.c.', 'r.g.f.',
|
||||||
|
'r.g.z.', 'r.h.a.', 'r.i.c.', 'r.i.d.a.', 'r.i.e.j.',
|
||||||
|
'r.i.n.', 'r.i.s.a.', 'r.j.d.a.', 'r.j.i.', 'r.k.', 'r.l.',
|
||||||
|
'r.l.g.b.', 'r.med.', 'r.med.rechtspr.', 'r.n.b.', 'r.o.',
|
||||||
|
'r.ov.', 'r.p.', 'r.p.d.b.', 'r.p.o.t.', 'r.p.r.j.',
|
||||||
|
'r.p.s.', 'r.r.d.', 'r.r.s.', 'r.s.', 'r.s.v.p.',
|
||||||
|
'r.stvb.', 'r.t.d.f.', 'r.t.d.h.', 'r.t.l.',
|
||||||
|
'r.trim.dr.eur.', 'r.v.a.', 'r.verkb.', 'r.w.', 'r.w.d.',
|
||||||
|
'rap.ann.c.a.', 'rap.ann.c.c.', 'rap.ann.c.e.',
|
||||||
|
'rap.ann.c.s.j.', 'rap.ann.ca.', 'rap.ann.cass.',
|
||||||
|
'rap.ann.cc.', 'rap.ann.ce.', 'rap.ann.csj.', 'rapp.',
|
||||||
|
'rb.', 'rb.kh.', 'rdn.', 'rdnr.', 're.pers.', 'rec.',
|
||||||
|
'rec.c.i.j.', 'rec.c.j.c.e.', 'rec.cij.', 'rec.cjce.',
|
||||||
|
'rec.gén.enr.not.', 'rechtsk.t.', 'rechtspl.zeem.',
|
||||||
|
'rechtspr.arb.br.', 'rechtspr.b.f.e.', 'rechtspr.bfe.',
|
||||||
|
'rechtspr.soc.r.b.l.n.', 'recl.reg.', 'rect.', 'red.',
|
||||||
|
'reg.', 'reg.huiz.bew.', 'reg.w.', 'registr.w.', 'regl.',
|
||||||
|
'regl.', 'r.v.k.', 'regl.besl.', 'regl.onderr.',
|
||||||
|
'regl.r.t.', 'rep.', 'rép.fisc.', 'rép.not.', 'rep.r.j.',
|
||||||
|
'rep.rj.', 'req.', 'res.', 'resp.', 'rev.', 'rev.',
|
||||||
|
'comp.', 'rev.', 'trim.', 'civ.', 'rev.', 'trim.', 'comm.',
|
||||||
|
'rev.acc.trav.', 'rev.adm.', 'rev.b.compt.',
|
||||||
|
'rev.b.dr.const.', 'rev.b.dr.intern.', 'rev.b.séc.soc.',
|
||||||
|
'rev.banc.fin.', 'rev.comm.', 'rev.cons.prud.',
|
||||||
|
'rev.dr.b.', 'rev.dr.commun.', 'rev.dr.étr.',
|
||||||
|
'rev.dr.fam.', 'rev.dr.intern.comp.', 'rev.dr.mil.',
|
||||||
|
'rev.dr.min.', 'rev.dr.pén.', 'rev.dr.pén.mil.',
|
||||||
|
'rev.dr.rur.', 'rev.dr.u.l.b.', 'rev.dr.ulb.', 'rev.exp.',
|
||||||
|
'rev.faill.', 'rev.fisc.', 'rev.gd.', 'rev.hist.dr.',
|
||||||
|
'rev.i.p.c.', 'rev.ipc.', 'rev.not.b.',
|
||||||
|
'rev.prat.dr.comm.', 'rev.prat.not.b.', 'rev.prat.soc.',
|
||||||
|
'rev.rec.', 'rev.rw.', 'rev.trav.', 'rev.trim.d.h.',
|
||||||
|
'rev.trim.dr.fam.', 'rev.urb.', 'richtl.', 'riv.dir.int.',
|
||||||
|
'riv.dir.int.priv.proc.', 'rk.', 'rln.', 'roln.', 'rom.',
|
||||||
|
'rondz.', 'rov.', 'rtl.', 'rubr.', 'ruilv.wet.',
|
||||||
|
'rv.verdr.', 'rvkb.', 's.', 's.', 's.a.', 's.b.n.',
|
||||||
|
's.ct.', 's.d.', 's.e.c.', 's.e.et.o.', 's.e.w.',
|
||||||
|
's.exec.rept.', 's.hrg.', 's.j.b.', 's.l.', 's.l.e.a.',
|
||||||
|
's.l.n.d.', 's.p.a.', 's.s.', 's.t.', 's.t.b.', 's.v.',
|
||||||
|
's.v.p.', 'samenw.', 'sc.', 'sch.', 'scheidsr.uitspr.',
|
||||||
|
'schepel.besl.', 'secr.comm.', 'secr.gen.', 'sect.soc.',
|
||||||
|
'sess.', 'cas.', 'sir.', 'soc.', 'best.', 'soc.', 'handv.',
|
||||||
|
'soc.', 'verz.', 'soc.act.', 'soc.best.', 'soc.kron.',
|
||||||
|
'soc.r.', 'soc.sw.', 'soc.weg.', 'sofi-nr.', 'somm.',
|
||||||
|
'somm.ann.', 'sp.c.c.', 'sr.', 'ss.', 'st.doc.b.c.n.a.r.',
|
||||||
|
'st.doc.bcnar.', 'st.vw.', 'stagever.', 'stas.', 'stat.',
|
||||||
|
'stb.', 'stbl.', 'stcrt.', 'stud.dipl.', 'su.', 'subs.',
|
||||||
|
'subst.', 'succ.w.', 'suppl.', 'sv.', 'sw.', 't.', 't.a.',
|
||||||
|
't.a.a.', 't.a.n.', 't.a.p.', 't.a.s.n.', 't.a.v.',
|
||||||
|
't.a.v.w.', 't.aann.', 't.acc.', 't.agr.r.', 't.app.',
|
||||||
|
't.b.b.r.', 't.b.h.', 't.b.m.', 't.b.o.', 't.b.p.',
|
||||||
|
't.b.r.', 't.b.s.', 't.b.v.', 't.bankw.', 't.belg.not.',
|
||||||
|
't.desk.', 't.e.m.', 't.e.p.', 't.f.r.', 't.fam.',
|
||||||
|
't.fin.r.', 't.g.r.', 't.g.t.', 't.g.v.', 't.gem.',
|
||||||
|
't.gez.', 't.huur.', 't.i.n.', 't.j.k.', 't.l.l.',
|
||||||
|
't.l.v.', 't.m.', 't.m.r.', 't.m.w.', 't.mil.r.',
|
||||||
|
't.mil.strafr.', 't.not.', 't.o.', 't.o.r.b.', 't.o.v.',
|
||||||
|
't.ontv.', 't.p.r.', 't.pol.', 't.r.', 't.r.g.',
|
||||||
|
't.r.o.s.', 't.r.v.', 't.s.r.', 't.strafr.', 't.t.',
|
||||||
|
't.u.', 't.v.c.', 't.v.g.', 't.v.m.r.', 't.v.o.', 't.v.v.',
|
||||||
|
't.v.v.d.b.', 't.v.w.', 't.verz.', 't.vred.', 't.vreemd.',
|
||||||
|
't.w.', 't.w.k.', 't.w.v.', 't.w.v.r.', 't.wrr.', 't.z.',
|
||||||
|
't.z.t.', 't.z.v.', 'taalk.', 'tar.burg.z.', 'td.',
|
||||||
|
'techn.', 'telecomm.', 'toel.', 'toel.st.v.w.', 'toep.',
|
||||||
|
'toep.regl.', 'tom.', 'top.', 'trans.b.', 'transp.r.',
|
||||||
|
'trb.', 'trib.', 'trib.civ.', 'trib.gr.inst.', 'ts.',
|
||||||
|
'ts.', 'best.', 'ts.', 'verv.', 'turnh.rechtsl.', 'tvpol.',
|
||||||
|
'tvpr.', 'tvrechtsgesch.', 'tw.', 'u.', 'u.a.', 'u.a.r.',
|
||||||
|
'u.a.v.', 'u.c.', 'u.c.c.', 'u.g.', 'u.p.', 'u.s.',
|
||||||
|
'u.s.d.c.', 'uitdr.', 'uitl.w.', 'uitv.besch.div.b.',
|
||||||
|
'uitv.besl.', 'uitv.besl.', 'succ.w.', 'uitv.besl.bel.rv.',
|
||||||
|
'uitv.besl.l.b.', 'uitv.reg.', 'inv.w.', 'uitv.reg.bel.d.',
|
||||||
|
'uitv.reg.afd.verm.', 'uitv.reg.lb.', 'uitv.reg.succ.w.',
|
||||||
|
'univ.', 'univ.verkl.', 'v.', 'v.', 'chr.', 'v.a.',
|
||||||
|
'v.a.v.', 'v.c.', 'v.chr.', 'v.h.', 'v.huw.verm.', 'v.i.',
|
||||||
|
'v.i.o.', 'v.k.a.', 'v.m.', 'v.o.f.', 'v.o.n.',
|
||||||
|
'v.onderh.verpl.', 'v.p.', 'v.r.', 'v.s.o.', 'v.t.t.',
|
||||||
|
'v.t.t.t.', 'v.tk.t.', 'v.toep.r.vert.', 'v.v.b.',
|
||||||
|
'v.v.g.', 'v.v.t.', 'v.v.t.t.', 'v.v.tk.t.', 'v.w.b.',
|
||||||
|
'v.z.m.', 'vb.', 'vb.bo.', 'vbb.', 'vc.', 'vd.', 'veldw.',
|
||||||
|
'ver.k.', 'ver.verg.gem.', 'gem.comm.', 'verbr.', 'verd.',
|
||||||
|
'verdr.', 'verdr.v.', 'tek.mod.', 'verenw.', 'verg.',
|
||||||
|
'verg.fr.gem.', 'comm.', 'verkl.', 'verkl.herz.gw.',
|
||||||
|
'verl.', 'deelw.', 'vern.', 'verord.', 'vers.r.',
|
||||||
|
'versch.', 'versl.c.s.w.', 'versl.csw.', 'vert.', 'verw.',
|
||||||
|
'verz.', 'verz.w.', 'verz.wett.besl.',
|
||||||
|
'verz.wett.decr.besl.', 'vgl.', 'vid.', 'viss.w.',
|
||||||
|
'vl.parl.', 'vl.r.', 'vl.t.gez.', 'vl.w.reg.',
|
||||||
|
'vl.w.succ.', 'vlg.', 'vn.', 'vnl.', 'vnw.', 'vo.',
|
||||||
|
'vo.bl.', 'voegw.', 'vol.', 'volg.', 'volt.', 'deelw.',
|
||||||
|
'voorl.', 'voorz.', 'vord.w.', 'vorst.d.', 'vr.', 'vred.',
|
||||||
|
'vrg.', 'vnw.', 'vrijgrs.', 'vs.', 'vt.', 'vw.', 'vz.',
|
||||||
|
'vzngr.', 'vzr.', 'w.', 'w.a.', 'w.b.r.', 'w.c.h.',
|
||||||
|
'w.conf.huw.', 'w.conf.huwelijksb.', 'w.consum.kr.',
|
||||||
|
'w.f.r.', 'w.g.', 'w.gew.r.', 'w.ident.pl.', 'w.just.doc.',
|
||||||
|
'w.kh.', 'w.l.r.', 'w.l.v.', 'w.mil.straf.spr.', 'w.n.',
|
||||||
|
'w.not.ambt.', 'w.o.', 'w.o.d.huurcomm.', 'w.o.d.k.',
|
||||||
|
'w.openb.manif.', 'w.parl.', 'w.r.', 'w.reg.', 'w.succ.',
|
||||||
|
'w.u.b.', 'w.uitv.pl.verord.', 'w.v.', 'w.v.k.',
|
||||||
|
'w.v.m.s.', 'w.v.r.', 'w.v.w.', 'w.venn.', 'wac.', 'wd.',
|
||||||
|
'wetb.', 'n.v.h.', 'wgb.', 'winkelt.w.', 'wisk.',
|
||||||
|
'wka-verkl.', 'wnd.', 'won.w.', 'woningw.', 'woonr.w.',
|
||||||
|
'wrr.', 'wrr.ber.', 'wrsch.', 'ws.', 'wsch.', 'wsr.',
|
||||||
|
'wtvb.', 'ww.', 'x.d.', 'z.a.', 'z.g.', 'z.i.', 'z.j.',
|
||||||
|
'z.o.z.', 'z.p.', 'z.s.m.', 'zg.', 'zgn.', 'zn.', 'znw.',
|
||||||
|
'zr.', 'zr.', 'ms.', 'zr.ms.']
|
||||||
|
|
||||||
|
|
||||||
|
_exc = {}
|
||||||
|
for orth in abbrevs:
|
||||||
|
_exc[orth] = [{ORTH: orth}]
|
||||||
|
uppered = orth.upper()
|
||||||
|
capsed = orth.capitalize()
|
||||||
|
for i in [uppered, capsed]:
|
||||||
|
_exc[i] = [{ORTH: i}]
|
||||||
|
|
||||||
|
|
||||||
|
TOKENIZER_EXCEPTIONS = _exc
|
|
@ -134,6 +134,11 @@ def nl_tokenizer():
|
||||||
return get_lang_class("nl").Defaults.create_tokenizer()
|
return get_lang_class("nl").Defaults.create_tokenizer()
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def nl_lemmatizer(scope="session"):
|
||||||
|
return get_lang_class("nl").Defaults.create_lemmatizer()
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope="session")
|
@pytest.fixture(scope="session")
|
||||||
def pl_tokenizer():
|
def pl_tokenizer():
|
||||||
return get_lang_class("pl").Defaults.create_tokenizer()
|
return get_lang_class("pl").Defaults.create_tokenizer()
|
||||||
|
|
143
spacy/tests/lang/nl/test_lemmatizer.py
Normal file
143
spacy/tests/lang/nl/test_lemmatizer.py
Normal file
|
@ -0,0 +1,143 @@
|
||||||
|
# coding: utf-8
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
|
# Calling the Lemmatizer directly
|
||||||
|
# Imitates behavior of:
|
||||||
|
# Tagger.set_annotations()
|
||||||
|
# -> vocab.morphology.assign_tag_id()
|
||||||
|
# -> vocab.morphology.assign_tag_id()
|
||||||
|
# -> Token.tag.__set__
|
||||||
|
# -> vocab.morphology.assign_tag(...)
|
||||||
|
# -> ... -> Morphology.assign_tag(...)
|
||||||
|
# -> self.lemmatize(analysis.tag.pos, token.lex.orth,
|
||||||
|
|
||||||
|
|
||||||
|
noun_irreg_lemmatization_cases = [
|
||||||
|
("volkeren", "volk"),
|
||||||
|
("vaatje", "vat"),
|
||||||
|
("verboden", "verbod"),
|
||||||
|
("ijsje", "ijsje"),
|
||||||
|
("slagen", "slag"),
|
||||||
|
("verdragen", "verdrag"),
|
||||||
|
("verloven", "verlof"),
|
||||||
|
("gebeden", "gebed"),
|
||||||
|
("gaten", "gat"),
|
||||||
|
("staven", "staf"),
|
||||||
|
("aquariums", "aquarium"),
|
||||||
|
("podia", "podium"),
|
||||||
|
("holen", "hol"),
|
||||||
|
("lammeren", "lam"),
|
||||||
|
("bevelen", "bevel"),
|
||||||
|
("wegen", "weg"),
|
||||||
|
("moeilijkheden", "moeilijkheid"),
|
||||||
|
("aanwezigheden", "aanwezigheid"),
|
||||||
|
("goden", "god"),
|
||||||
|
("loten", "lot"),
|
||||||
|
("kaarsen", "kaars"),
|
||||||
|
("leden", "lid"),
|
||||||
|
("glaasje", "glas"),
|
||||||
|
("eieren", "ei"),
|
||||||
|
("vatten", "vat"),
|
||||||
|
("kalveren", "kalf"),
|
||||||
|
("padden", "pad"),
|
||||||
|
("smeden", "smid"),
|
||||||
|
("genen", "gen"),
|
||||||
|
("beenderen", "been"),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
verb_irreg_lemmatization_cases = [
|
||||||
|
("liep", "lopen"),
|
||||||
|
("hief", "heffen"),
|
||||||
|
("begon", "beginnen"),
|
||||||
|
("sla", "slaan"),
|
||||||
|
("aangekomen", "aankomen"),
|
||||||
|
("sproot", "spruiten"),
|
||||||
|
("waart", "zijn"),
|
||||||
|
("snoof", "snuiven"),
|
||||||
|
("spoot", "spuiten"),
|
||||||
|
("ontbeet", "ontbijten"),
|
||||||
|
("gehouwen", "houwen"),
|
||||||
|
("afgewassen", "afwassen"),
|
||||||
|
("deed", "doen"),
|
||||||
|
("schoven", "schuiven"),
|
||||||
|
("gelogen", "liegen"),
|
||||||
|
("woog", "wegen"),
|
||||||
|
("gebraden", "braden"),
|
||||||
|
("smolten", "smelten"),
|
||||||
|
("riep", "roepen"),
|
||||||
|
("aangedaan", "aandoen"),
|
||||||
|
("vermeden", "vermijden"),
|
||||||
|
("stootten", "stoten"),
|
||||||
|
("ging", "gaan"),
|
||||||
|
("geschoren", "scheren"),
|
||||||
|
("gesponnen", "spinnen"),
|
||||||
|
("reden", "rijden"),
|
||||||
|
("zochten", "zoeken"),
|
||||||
|
("leed", "lijden"),
|
||||||
|
("verzonnen", "verzinnen"),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("text,lemma", noun_irreg_lemmatization_cases)
|
||||||
|
def test_nl_lemmatizer_noun_lemmas_irreg(nl_lemmatizer, text, lemma):
|
||||||
|
pos = "noun"
|
||||||
|
lemmas_pred = nl_lemmatizer(text, pos)
|
||||||
|
assert lemma == sorted(lemmas_pred)[0]
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("text,lemma", verb_irreg_lemmatization_cases)
|
||||||
|
def test_nl_lemmatizer_verb_lemmas_irreg(nl_lemmatizer, text, lemma):
|
||||||
|
pos = "verb"
|
||||||
|
lemmas_pred = nl_lemmatizer(text, pos)
|
||||||
|
assert lemma == sorted(lemmas_pred)[0]
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skip
|
||||||
|
@pytest.mark.parametrize("text,lemma", [])
|
||||||
|
def test_nl_lemmatizer_verb_lemmas_reg(nl_lemmatizer, text, lemma):
|
||||||
|
# TODO: add test
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skip
|
||||||
|
@pytest.mark.parametrize("text,lemma", [])
|
||||||
|
def test_nl_lemmatizer_adjective_lemmas(nl_lemmatizer, text, lemma):
|
||||||
|
# TODO: add test
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skip
|
||||||
|
@pytest.mark.parametrize("text,lemma", [])
|
||||||
|
def test_nl_lemmatizer_determiner_lemmas(nl_lemmatizer, text, lemma):
|
||||||
|
# TODO: add test
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skip
|
||||||
|
@pytest.mark.parametrize("text,lemma", [])
|
||||||
|
def test_nl_lemmatizer_adverb_lemmas(nl_lemmatizer, text, lemma):
|
||||||
|
# TODO: add test
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("text,lemma", [])
|
||||||
|
def test_nl_lemmatizer_pronoun_lemmas(nl_lemmatizer, text, lemma):
|
||||||
|
# TODO: add test
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# Using the lemma lookup table only
|
||||||
|
@pytest.mark.parametrize("text,lemma", noun_irreg_lemmatization_cases)
|
||||||
|
def test_nl_lemmatizer_lookup_noun(nl_lemmatizer, text, lemma):
|
||||||
|
lemma_pred = nl_lemmatizer.lookup(text)
|
||||||
|
assert lemma_pred in (lemma, text)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("text,lemma", verb_irreg_lemmatization_cases)
|
||||||
|
def test_nl_lemmatizer_lookup_verb(nl_lemmatizer, text, lemma):
|
||||||
|
lemma_pred = nl_lemmatizer.lookup(text)
|
||||||
|
assert lemma_pred in (lemma, text)
|
|
@ -9,3 +9,19 @@ from spacy.lang.nl.lex_attrs import like_num
|
||||||
def test_nl_lex_attrs_capitals(word):
|
def test_nl_lex_attrs_capitals(word):
|
||||||
assert like_num(word)
|
assert like_num(word)
|
||||||
assert like_num(word.upper())
|
assert like_num(word.upper())
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"text,num_tokens",
|
||||||
|
[
|
||||||
|
(
|
||||||
|
"De aftredende minister-president benadrukte al dat zijn partij inhoudelijk weinig gemeen heeft met de groenen.",
|
||||||
|
16,
|
||||||
|
),
|
||||||
|
("Hij is sociaal-cultureel werker.", 5),
|
||||||
|
("Er staan een aantal dure auto's in de garage.", 10),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_tokenizer_doesnt_split_hyphens(nl_tokenizer, text, num_tokens):
|
||||||
|
tokens = nl_tokenizer(text)
|
||||||
|
assert len(tokens) == num_tokens
|
||||||
|
|
Loading…
Reference in New Issue
Block a user