mirror of
				https://github.com/explosion/spaCy.git
				synced 2025-11-01 00:17:44 +03:00 
			
		
		
		
	Tune Danish tokenizer to more closely match tokenization in Universal Dependencies.
This commit is contained in:
		
							parent
							
								
									f920574f39
								
							
						
					
					
						commit
						15d13efafd
					
				|  | @ -3,6 +3,7 @@ from __future__ import unicode_literals | ||||||
| 
 | 
 | ||||||
| from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS | from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS | ||||||
| from .norm_exceptions import NORM_EXCEPTIONS | from .norm_exceptions import NORM_EXCEPTIONS | ||||||
|  | from .punctuation import TOKENIZER_INFIXES, TOKENIZER_SUFFIXES | ||||||
| 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 .morph_rules import MORPH_RULES | from .morph_rules import MORPH_RULES | ||||||
|  | @ -23,6 +24,8 @@ class DanishDefaults(Language.Defaults): | ||||||
|                                          BASE_NORMS, NORM_EXCEPTIONS) |                                          BASE_NORMS, NORM_EXCEPTIONS) | ||||||
|     tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) |     tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) | ||||||
|     morph_rules = MORPH_RULES |     morph_rules = MORPH_RULES | ||||||
|  |     infixes = TOKENIZER_INFIXES | ||||||
|  |     suffixes = TOKENIZER_SUFFIXES | ||||||
|     tag_map = TAG_MAP |     tag_map = TAG_MAP | ||||||
|     stop_words = STOP_WORDS |     stop_words = STOP_WORDS | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										24
									
								
								spacy/lang/da/punctuation.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								spacy/lang/da/punctuation.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,24 @@ | ||||||
|  | # coding: utf8 | ||||||
|  | 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 | ||||||
|  | @ -54,81 +54,109 @@ for exc_data in [ | ||||||
|         {ORTH: "Lør.", LEMMA: "lørdag"}]: |         {ORTH: "Lør.", LEMMA: "lørdag"}]: | ||||||
|     _exc[exc_data[ORTH]] = [exc_data] |     _exc[exc_data[ORTH]] = [exc_data] | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | # Specified case only | ||||||
| for orth in [ | for orth in [ | ||||||
|         "A.D.", "A/S", "aarh.", "ac.", "adj.", "adr.", "adsk.", "adv.", "afb.", |         "diam.", "ib.", "mia.", "mik.", "pers.", "A.D.", "A/S", "B.C.", "BK.", | ||||||
|         "afd.", "afg.", "afk.", "afs.", "aht.", "alg.", "alk.", "alm.", "amer.", |         "Dr.", "Boul.", "Chr.", "Dronn.", "H.K.H.", "H.M.", "Hf.", "i/s", "I/S", | ||||||
|         "ang.", "ank.", "anl.", "anv.", "arb.", "arr.", "att.", "B.C.", "bd.", |         "Kprs.", "L.A.", "Ll.", "m/s", "M/S", "Mag.", "Mr.", "Ndr.", "Ph.d.", | ||||||
|         "bdt.", "beg.", "begr.", "beh.", "bet.", "bev.", "bhk.", "bib.", |         "Prs.", "Rcp.", "Sdr.", "Skt.", "Spl.", "Vg."]: | ||||||
|         "bibl.", "bidr.", "bildl.", "bill.", "bio.", "biol.", "bk.", "BK.", |     _exc[orth] = [{ORTH: orth}] | ||||||
|         "bl.", "bl.a.", "borgm.", "bot.", "Boul.", "br.", "brolægn.", "bto.", | 
 | ||||||
|         "bygn.", "ca.", "cand.", "Chr.", "d.", "d.d.", "d.m.", "d.s.", "d.s.s.", | 
 | ||||||
|         "d.y.", "d.å.", "d.æ.", "da.", "dagl.", "dat.", "dav.", "def.", "dek.", | for orth in [ | ||||||
|         "dep.", "desl.", "diam.", "dir.", "disp.", "distr.", "div.", "dkr.", |         "aarh.", "ac.", "adj.", "adr.", "adsk.", "adv.", "afb.", "afd.", "afg.", | ||||||
|         "dl.", "do.", "dobb.", "Dr.", "dr.h.c", "Dronn.", "ds.", "dvs.", "e.b.", |         "afk.", "afs.", "aht.", "alg.", "alk.", "alm.", "amer.", "ang.", "ank.", | ||||||
|         "e.l.", "e.o.", "e.v.t.", "eftf.", "eftm.", "eg.", "egl.", "eks.", |         "anl.", "anv.", "arb.", "arr.", "att.", "bd.", "bdt.", "beg.", "begr.", | ||||||
|         "eksam.", "ekskl.", "eksp.", "ekspl.", "el.", "el.lign.", "emer.", |         "beh.", "bet.", "bev.", "bhk.", "bib.", "bibl.", "bidr.", "bildl.", | ||||||
|         "endv.", "eng.", "enk.", "etc.", "etym.", "eur.", "evt.", "exam.", "f.", |         "bill.", "biol.", "bk.", "bl.", "bl.a.", "borgm.", "br.", "brolægn.", | ||||||
|         "f.eks.", "f.m.", "f.n.", "f.o.", "f.o.m.", "f.s.v.", "f.t.", "f.v.t.", |         "bto.", "bygn.", "ca.", "cand.", "d.d.", "d.m.", "d.s.", "d.s.s.", | ||||||
|         "f.å.", "fa.", "fakt.", "fam.", "fem.", "ff.", "fg.", "fhv.", "fig.", |         "d.y.", "d.å.", "d.æ.", "dagl.", "dat.", "dav.", "def.", "dek.", "dep.", | ||||||
|         "filol.", "filos.", "fl.", "flg.", "fm.", "fmd.", "fol.", "forb.", |         "desl.", "dir.", "disp.", "distr.", "div.", "dkr.", "dl.", "do.", | ||||||
|         "foreg.", "foren.", "forf.", "fork.", "form.", "forr.", "fors.", |         "dobb.", "dr.h.c", "dr.phil.", "ds.", "dvs.", "e.b.", "e.l.", "e.o.", | ||||||
|  |         "e.v.t.", "eftf.", "eftm.", "egl.", "eks.", "eksam.", "ekskl.", "eksp.", | ||||||
|  |         "ekspl.", "el.lign.", "emer.", "endv.", "eng.", "enk.", "etc.", "etym.", | ||||||
|  |         "eur.", "evt.", "exam.", "f.eks.", "f.m.", "f.n.", "f.o.", "f.o.m.", | ||||||
|  |         "f.s.v.", "f.t.", "f.v.t.", "f.å.", "fa.", "fakt.", "fam.", "ff.", | ||||||
|  |         "fg.", "fhv.", "fig.", "filol.", "filos.", "fl.", "flg.", "fm.", "fmd.", | ||||||
|  |         "fol.", "forb.", "foreg.", "foren.", "forf.", "fork.", "forr.", "fors.", | ||||||
|         "forsk.", "forts.", "fr.", "fr.u.", "frk.", "fsva.", "fuldm.", "fung.", |         "forsk.", "forts.", "fr.", "fr.u.", "frk.", "fsva.", "fuldm.", "fung.", | ||||||
|         "fx.", "fys.", "fær.", "g.d.", "g.m.", "gd.", "gdr.", "genuds.", "gl.", |         "fx.", "fys.", "fær.", "g.d.", "g.m.", "gd.", "gdr.", "genuds.", "gl.", | ||||||
|         "gn.", "gns.", "gr.", "grdl.", "gross.", "h.a.", "h.c.", "H.K.H.", |         "gn.", "gns.", "gr.", "grdl.", "gross.", "h.a.", "h.c.", "hdl.", | ||||||
|         "H.M.", "hdl.", "henv.", "Hf.", "hhv.", "hj.hj.", "hj.spl.", "hort.", |         "henv.", "hhv.", "hj.hj.", "hj.spl.", "hort.", "hosp.", "hpl.", "hr.", | ||||||
|         "hosp.", "hpl.", "Hr.", "hr.", "hrs.", "hum.", "hvp.", "i/s", "I/S", |         "hrs.", "hum.", "hvp.", "i.e.", "id.", "if.", "iflg.", "ifm.", "ift.", | ||||||
|         "i.e.", "ib.", "id.", "if.", "iflg.", "ifm.", "ift.", "iht.", "ill.", |         "iht.", "ill.", "indb.", "indreg.", "inf.", "ing.", "inh.", "inj.", | ||||||
|         "indb.", "indreg.", "inf.", "ing.", "inh.", "inj.", "inkl.", "insp.", |         "inkl.", "insp.", "instr.", "isl.", "istf.", "it.", "ital.", "iv.", | ||||||
|         "instr.", "isl.", "istf.", "it.", "ital.", "iv.", "jap.", "jf.", "jfr.", |         "jap.", "jf.", "jfr.", "jnr.", "j.nr.", "jr.", "jur.", "jvf.", "kap.", | ||||||
|         "jnr.", "j.nr.", "jr.", "jur.", "jvf.", "K.", "kap.", "kat.", "kbh.", |         "kbh.", "kem.", "kgl.", "kl.", "kld.", "knsp.", "komm.", "kons.", | ||||||
|         "kem.", "kgl.", "kl.", "kld.", "knsp.", "komm.", "kons.", "korr.", |         "korr.", "kp.", "kr.", "kst.", "kt.", "ktr.", "kv.", "kvt.", "l.c.", | ||||||
|         "kp.", "Kprs.", "kr.", "kst.", "kt.", "ktr.", "kv.", "kvt.", "l.", |         "lab.", "lat.", "lb.m.", "lb.nr.", "lejl.", "lgd.", "lic.", "lign.", | ||||||
|         "L.A.", "l.c.", "lab.", "lat.", "lb.m.", "lb.nr.", "lejl.", "lgd.", |         "lin.", "ling.merc.", "litt.", "loc.cit.", "lok.", "lrs.", "ltr.", | ||||||
|         "lic.", "lign.", "lin.", "ling.merc.", "litt.", "Ll.", "loc.cit.", |         "m.a.o.", "m.fl.", "m.m.", "m.v.", "m.v.h.", "maks.", "md.", "mdr.", | ||||||
|         "lok.", "lrs.", "ltr.", "m/s", "M/S", "m.a.o.", "m.fl.", "m.m.", "m.v.", |         "mdtl.", "mezz.", "mfl.", "m.h.p.", "m.h.t", "mht.", "mill.", "mio.", | ||||||
|         "m.v.h.", "Mag.", "maks.", "md.", "mdr.", "mdtl.", "mezz.", "mfl.", |         "modt.", "mrk.", "mul.", "mv.", "n.br.", "n.f.", "nb.", "nedenst.", | ||||||
|         "m.h.p.", "m.h.t", "mht.", "mik.", "min.", "mio.", "modt.", "Mr.", |         "nl.", "nr.", "nto.", "nuv.", "o/m", "o.a.", "o.fl.", "o.h.", "o.l.", | ||||||
|         "mrk.", "mul.", "mv.", "n.br.", "n.f.", "nat.", "nb.", "Ndr.", |         "o.lign.", "o.m.a.", "o.s.fr.", "obl.", "obs.", "odont.", "oecon.", | ||||||
|         "nedenst.", "nl.", "nr.", "Nr.", "nto.", "nuv.", "o/m", "o.a.", "o.fl.", |         "off.", "ofl.", "omg.", "omkr.", "omr.", "omtr.", "opg.", "opl.", | ||||||
|         "o.h.", "o.l.", "o.lign.", "o.m.a.", "o.s.fr.", "obl.", "obs.", |         "opr.", "org.", "orig.", "osv.", "ovenst.", "overs.", "ovf.", "p.a.", | ||||||
|         "odont.", "oecon.", "off.", "ofl.", "omg.", "omkr.", "omr.", "omtr.", |         "p.b.a", "p.b.v", "p.c.", "p.m.", "p.m.v.", "p.n.", "p.p.", "p.p.s.", | ||||||
|         "opg.", "opl.", "opr.", "org.", "orig.", "osv.", "ovenst.", "overs.", |         "p.s.", "p.t.", "p.v.a.", "p.v.c.", "pag.", "pass.", "pcs.", "pct.", | ||||||
|         "ovf.", "p.", "p.a.", "p.b.a", "p.b.v", "p.c.", "p.m.", "p.m.v.", |         "pd.", "pens.", "pft.", "pg.", "pga.", "pgl.", "pinx.", "pk.", "pkt.", | ||||||
|         "p.n.", "p.p.", "p.p.s.", "p.s.", "p.t.", "p.v.a.", "p.v.c.", "pag.", |  | ||||||
|         "par.", "Pas.", "pass.", "pcs.", "pct.", "pd.", "pens.", "pers.", |  | ||||||
|         "pft.", "pg.", "pga.", "pgl.", "Ph.d.", "pinx.", "pk.", "pkt.", |  | ||||||
|         "polit.", "polyt.", "pos.", "pp.", "ppm.", "pr.", "prc.", "priv.", |         "polit.", "polyt.", "pos.", "pp.", "ppm.", "pr.", "prc.", "priv.", | ||||||
|         "prod.", "prof.", "pron.", "Prs.", "præd.", "præf.", "præt.", "psych.", |         "prod.", "prof.", "pron.", "præd.", "præf.", "præt.", "psych.", "pt.", | ||||||
|         "pt.", "pæd.", "q.e.d.", "rad.", "Rcp.", "red.", "ref.", "reg.", |         "pæd.", "q.e.d.", "rad.", "red.", "ref.", "reg.", "regn.", "rel.", | ||||||
|         "regn.", "rel.", "rep.", "repr.", "resp.", "rest.", "rm.", "rtg.", |         "rep.", "repr.", "resp.", "rest.", "rm.", "rtg.", "russ.", "s.br.", | ||||||
|         "russ.", "s.", "s.br.", "s.d.", "s.f.", "s.m.b.a.", "s.u.", "s.å.", |         "s.d.", "s.f.", "s.m.b.a.", "s.u.", "s.å.", "sa.", "sb.", "sc.", | ||||||
|         "sa.", "sb.", "sc.", "scient.", "scil.", "Sdr.", "sek.", "sekr.", |         "scient.", "scil.", "sek.", "sekr.", "self.", "sem.", "shj.", "sign.", | ||||||
|         "self.", "sem.", "sen.", "shj.", "sign.", "sing.", "sj.", "skr.", |         "sing.", "sj.", "skr.", "slutn.", "sml.", "smp.", "snr.", "soc.", | ||||||
|         "Skt.", "slutn.", "sml.", "smp.", "sms.", "snr.", "soc.", "soc.dem.", |         "soc.dem.", "sp.", "spec.", "spm.", "spr.", "spsk.", "statsaut.", "st.", | ||||||
|         "sort.", "sp.", "spec.", "Spl.", "spm.", "spr.", "spsk.", "statsaut.", |         "stk.", "str.", "stud.", "subj.", "subst.", "suff.", "sup.", "suppl.", | ||||||
|         "st.", "stk.", "str.", "stud.", "subj.", "subst.", "suff.", "sup.", |         "sv.", "såk.", "sædv.", "t/r", "t.h.", "t.o.", "t.o.m.", "t.v.", "tbl.", | ||||||
|         "suppl.", "sv.", "såk.", "sædv.", "sø.", "t/r", "t.", "t.h.", "t.o.", |         "tcp/ip", "td.", "tdl.", "tdr.", "techn.", "tekn.", "temp.", "th.", | ||||||
|         "t.o.m.", "t.v.", "tab.", "tbl.", "tcp/ip", "td.", "tdl.", "tdr.", |         "theol.", "tidl.", "tilf.", "tilh.", "till.", "tilsv.", "tjg.", "tkr.", | ||||||
|         "techn.", "tekn.", "temp.", "th.", "theol.", "ti.", "tidl.", "tilf.", |         "tlf.", "tlgr.", "tr.", "trp.", "tsk.", "tv.", "ty.", "u/b", "udb.", | ||||||
|         "tilh.", "till.", "tilsv.", "tjg.", "tkr.", "tlf.", "tlgr.", "to.", |         "udbet.", "ugtl.", "undt.", "v.f.", "vb.", "vedk.", "vedl.", "vedr.", | ||||||
|         "tr.", "trp.", "tsk.", "tv.", "ty.", "u/b", "udb.", "udbet.", "ugtl.", |         "vejl.", "vh.", "vha.", "vs.", "vsa.", "vær.", "zool.", "ø.lgd.", | ||||||
|         "undt.", "v.", "v.f.", "var.", "vb.", "vedk.", "vedl.", "vedr.", |         "øvr.", "årg.", "årh."]: | ||||||
|         "vejl.", "Vg.", "vh.", "vha.", "vs.", "vsa.", "vær.", "zool.", "ø.lgd.", |  | ||||||
|         "øv.", "øvr.", "årg.", "årh.", ""]: |  | ||||||
|     _exc[orth] = [{ORTH: orth}] |     _exc[orth] = [{ORTH: orth}] | ||||||
|  |     capitalized = orth.capitalize() | ||||||
|  |     _exc[capitalized] = [{ORTH: capitalized}] | ||||||
|  | 
 | ||||||
|  | for exc_data in [ | ||||||
|  |         {ORTH: "s'gu", LEMMA: "s'gu", NORM: "s'gu"}, | ||||||
|  |         {ORTH: "S'gu", LEMMA: "s'gu", NORM: "s'gu"}, | ||||||
|  |         {ORTH: "sgu'", LEMMA: "s'gu", NORM: "s'gu"}, | ||||||
|  |         {ORTH: "Sgu'", LEMMA: "s'gu", NORM: "s'gu"}, | ||||||
|  |         {ORTH: "sku'", LEMMA: "skal", NORM: "skulle"}, | ||||||
|  |         {ORTH: "ku'", LEMMA: "kan", NORM: "kunne"}, | ||||||
|  |         {ORTH: "Ku'", LEMMA: "kan", NORM: "kunne"}, | ||||||
|  |         {ORTH: "ka'", LEMMA: "kan", NORM: "kan"}, | ||||||
|  |         {ORTH: "Ka'", LEMMA: "kan", NORM: "kan"}, | ||||||
|  |         {ORTH: "gi'", LEMMA: "give", NORM: "giv"}, | ||||||
|  |         {ORTH: "Gi'", LEMMA: "give", NORM: "giv"}, | ||||||
|  |         {ORTH: "li'", LEMMA: "lide", NORM: "lide"}, | ||||||
|  |         {ORTH: "ha'", LEMMA: "have", NORM: "have"}, | ||||||
|  |         {ORTH: "Ha'", LEMMA: "have", NORM: "have"}, | ||||||
|  |         {ORTH: "ik'", LEMMA: "ikke", NORM: "ikke"}, | ||||||
|  |         {ORTH: "Ik'", LEMMA: "ikke", NORM: "ikke"}]: | ||||||
|  |     _exc[exc_data[ORTH]] = [exc_data] | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| # Dates | # Dates | ||||||
| for h in range(1, 31 + 1): | for h in range(1, 31 + 1): | ||||||
|     for period in ["."]: |     for period in ["."]: | ||||||
|         _exc["%d%s" % (h, period)] = [ |         _exc["%d%s" % (h, period)] = [{ORTH: "%d." % h}] | ||||||
|             {ORTH: "%d." % h}] |  | ||||||
| 
 | 
 | ||||||
| _custom_base_exc = { | _custom_base_exc = { | ||||||
|     "i.": [ |     "i.": [{ | ||||||
|         {ORTH: "i", LEMMA: "i", NORM: "i"}, |         ORTH: "i", | ||||||
|         {ORTH: ".", TAG: PUNCT}] |         LEMMA: "i", | ||||||
|  |         NORM: "i" | ||||||
|  |     }, { | ||||||
|  |         ORTH: ".", | ||||||
|  |         TAG: PUNCT | ||||||
|  |     }] | ||||||
| } | } | ||||||
| _exc.update(_custom_base_exc) | _exc.update(_custom_base_exc) | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| TOKENIZER_EXCEPTIONS = _exc | TOKENIZER_EXCEPTIONS = _exc | ||||||
|  |  | ||||||
							
								
								
									
										160
									
								
								spacy/tests/lang/da/test_prefix_suffix_infix.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								spacy/tests/lang/da/test_prefix_suffix_infix.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,160 @@ | ||||||
|  | # coding: utf-8 | ||||||
|  | """Test that tokenizer prefixes, suffixes and infixes are handled correctly.""" | ||||||
|  | from __future__ import unicode_literals | ||||||
|  | 
 | ||||||
|  | import pytest | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @pytest.mark.parametrize('text', ["(under)"]) | ||||||
|  | def test_tokenizer_splits_no_special(da_tokenizer, text): | ||||||
|  |     tokens = da_tokenizer(text) | ||||||
|  |     assert len(tokens) == 3 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @pytest.mark.parametrize('text', ["ta'r", "Søren's", "Lars'"]) | ||||||
|  | def test_tokenizer_handles_no_punct(da_tokenizer, text): | ||||||
|  |     tokens = da_tokenizer(text) | ||||||
|  |     assert len(tokens) == 1 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @pytest.mark.parametrize('text', ["(ta'r"]) | ||||||
|  | def test_tokenizer_splits_prefix_punct(da_tokenizer, text): | ||||||
|  |     tokens = da_tokenizer(text) | ||||||
|  |     assert len(tokens) == 2 | ||||||
|  |     assert tokens[0].text == "(" | ||||||
|  |     assert tokens[1].text == "ta'r" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @pytest.mark.parametrize('text', ["ta'r)"]) | ||||||
|  | def test_tokenizer_splits_suffix_punct(da_tokenizer, text): | ||||||
|  |     tokens = da_tokenizer(text) | ||||||
|  |     assert len(tokens) == 2 | ||||||
|  |     assert tokens[0].text == "ta'r" | ||||||
|  |     assert tokens[1].text == ")" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @pytest.mark.parametrize('text,expected', [("(ta'r)", ["(", "ta'r", ")"]), ("'ta'r'", ["'", "ta'r", "'"])]) | ||||||
|  | def test_tokenizer_splits_even_wrap(da_tokenizer, text, expected): | ||||||
|  |     tokens = da_tokenizer(text) | ||||||
|  |     assert len(tokens) == len(expected) | ||||||
|  |     assert [t.text for t in tokens] == expected | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @pytest.mark.parametrize('text', ["(ta'r?)"]) | ||||||
|  | def test_tokenizer_splits_uneven_wrap(da_tokenizer, text): | ||||||
|  |     tokens = da_tokenizer(text) | ||||||
|  |     assert len(tokens) == 4 | ||||||
|  |     assert tokens[0].text == "(" | ||||||
|  |     assert tokens[1].text == "ta'r" | ||||||
|  |     assert tokens[2].text == "?" | ||||||
|  |     assert tokens[3].text == ")" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @pytest.mark.parametrize('text,expected', [("f.eks.", ["f.eks."]), ("fe.", ["fe", "."]), ("(f.eks.", ["(", "f.eks."])]) | ||||||
|  | def test_tokenizer_splits_prefix_interact(da_tokenizer, text, expected): | ||||||
|  |     tokens = da_tokenizer(text) | ||||||
|  |     assert len(tokens) == len(expected) | ||||||
|  |     assert [t.text for t in tokens] == expected | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @pytest.mark.parametrize('text', ["f.eks.)"]) | ||||||
|  | def test_tokenizer_splits_suffix_interact(da_tokenizer, text): | ||||||
|  |     tokens = da_tokenizer(text) | ||||||
|  |     assert len(tokens) == 2 | ||||||
|  |     assert tokens[0].text == "f.eks." | ||||||
|  |     assert tokens[1].text == ")" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @pytest.mark.parametrize('text', ["(f.eks.)"]) | ||||||
|  | def test_tokenizer_splits_even_wrap_interact(da_tokenizer, text): | ||||||
|  |     tokens = da_tokenizer(text) | ||||||
|  |     assert len(tokens) == 3 | ||||||
|  |     assert tokens[0].text == "(" | ||||||
|  |     assert tokens[1].text == "f.eks." | ||||||
|  |     assert tokens[2].text == ")" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @pytest.mark.parametrize('text', ["(f.eks.?)"]) | ||||||
|  | def test_tokenizer_splits_uneven_wrap_interact(da_tokenizer, text): | ||||||
|  |     tokens = da_tokenizer(text) | ||||||
|  |     assert len(tokens) == 4 | ||||||
|  |     assert tokens[0].text == "(" | ||||||
|  |     assert tokens[1].text == "f.eks." | ||||||
|  |     assert tokens[2].text == "?" | ||||||
|  |     assert tokens[3].text == ")" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @pytest.mark.parametrize('text', ["0,1-13,5", "0,0-0,1", "103,27-300", "1/2-3/4"]) | ||||||
|  | def test_tokenizer_handles_numeric_range(da_tokenizer, text): | ||||||
|  |     tokens = da_tokenizer(text) | ||||||
|  |     assert len(tokens) == 1 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @pytest.mark.parametrize('text', ["sort.Gul", "Hej.Verden"]) | ||||||
|  | def test_tokenizer_splits_period_infix(da_tokenizer, text): | ||||||
|  |     tokens = da_tokenizer(text) | ||||||
|  |     assert len(tokens) == 3 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @pytest.mark.parametrize('text', ["Hej,Verden", "en,to"]) | ||||||
|  | def test_tokenizer_splits_comma_infix(da_tokenizer, text): | ||||||
|  |     tokens = da_tokenizer(text) | ||||||
|  |     assert len(tokens) == 3 | ||||||
|  |     assert tokens[0].text == text.split(",")[0] | ||||||
|  |     assert tokens[1].text == "," | ||||||
|  |     assert tokens[2].text == text.split(",")[1] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @pytest.mark.parametrize('text', ["sort...Gul", "sort...gul"]) | ||||||
|  | def test_tokenizer_splits_ellipsis_infix(da_tokenizer, text): | ||||||
|  |     tokens = da_tokenizer(text) | ||||||
|  |     assert len(tokens) == 3 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @pytest.mark.parametrize('text', ['gå-på-mod', '4-hjulstræk', '100-Pfennig-frimærke', 'TV-2-spots', 'trofæ-vaeggen']) | ||||||
|  | def test_tokenizer_keeps_hyphens(da_tokenizer, text): | ||||||
|  |     tokens = da_tokenizer(text) | ||||||
|  |     assert len(tokens) == 1 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def test_tokenizer_splits_double_hyphen_infix(da_tokenizer): | ||||||
|  |     tokens = da_tokenizer("Mange regler--eksempelvis bindestregs-reglerne--er komplicerede.") | ||||||
|  |     assert len(tokens) == 9 | ||||||
|  |     assert tokens[0].text == "Mange" | ||||||
|  |     assert tokens[1].text == "regler" | ||||||
|  |     assert tokens[2].text == "--" | ||||||
|  |     assert tokens[3].text == "eksempelvis" | ||||||
|  |     assert tokens[4].text == "bindestregs-reglerne" | ||||||
|  |     assert tokens[5].text == "--" | ||||||
|  |     assert tokens[6].text == "er" | ||||||
|  |     assert tokens[7].text == "komplicerede" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def test_tokenizer_handles_posessives_and_contractions(da_tokenizer): | ||||||
|  |     tokens = da_tokenizer("'DBA's, Lars' og Liz' bil sku' sgu' ik' ha' en bule, det ka' han ik' li' mere', sagde hun.") | ||||||
|  |     assert len(tokens) == 25 | ||||||
|  |     assert tokens[0].text == "'" | ||||||
|  |     assert tokens[1].text == "DBA's" | ||||||
|  |     assert tokens[2].text == "," | ||||||
|  |     assert tokens[3].text == "Lars'" | ||||||
|  |     assert tokens[4].text == "og" | ||||||
|  |     assert tokens[5].text == "Liz'" | ||||||
|  |     assert tokens[6].text == "bil" | ||||||
|  |     assert tokens[7].text == "sku'" | ||||||
|  |     assert tokens[8].text == "sgu'" | ||||||
|  |     assert tokens[9].text == "ik'" | ||||||
|  |     assert tokens[10].text == "ha'" | ||||||
|  |     assert tokens[11].text == "en" | ||||||
|  |     assert tokens[12].text == "bule" | ||||||
|  |     assert tokens[13].text == "," | ||||||
|  |     assert tokens[14].text == "det" | ||||||
|  |     assert tokens[15].text == "ka'" | ||||||
|  |     assert tokens[16].text == "han" | ||||||
|  |     assert tokens[17].text == "ik'" | ||||||
|  |     assert tokens[18].text == "li'" | ||||||
|  |     assert tokens[19].text == "mere" | ||||||
|  |     assert tokens[20].text == "'" | ||||||
|  |     assert tokens[21].text == "," | ||||||
|  |     assert tokens[22].text == "sagde" | ||||||
|  |     assert tokens[23].text == "hun" | ||||||
|  |     assert tokens[24].text == "." | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user