From e47eef5e034b645a868a812b64874547cf267a76 Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 3 Jun 2017 21:07:44 +0200 Subject: [PATCH] Update German tokenizer exceptions and tests --- spacy/lang/de/tokenizer_exceptions.py | 170 ++++++++++++------------- spacy/tests/lang/de/test_exceptions.py | 19 ++- 2 files changed, 101 insertions(+), 88 deletions(-) diff --git a/spacy/lang/de/tokenizer_exceptions.py b/spacy/lang/de/tokenizer_exceptions.py index 080311f4e..184d88104 100644 --- a/spacy/lang/de/tokenizer_exceptions.py +++ b/spacy/lang/de/tokenizer_exceptions.py @@ -8,7 +8,7 @@ from ...deprecated import PRON_LEMMA _exc = { "auf'm": [ {ORTH: "auf", LEMMA: "auf"}, - {ORTH: "'m", LEMMA: "der", NORM: "dem" }], + {ORTH: "'m", LEMMA: "der", NORM: "dem"}], "du's": [ {ORTH: "du", LEMMA: PRON_LEMMA, TAG: "PPER"}, @@ -53,97 +53,97 @@ _exc = { for exc_data in [ - {ORTH: "'S", LEMMA: PRON_LEMMA, TAG: "PPER"}, - {ORTH: "'s", LEMMA: PRON_LEMMA, TAG: "PPER"}, - {ORTH: "S'", LEMMA: PRON_LEMMA, TAG: "PPER"}, - {ORTH: "s'", LEMMA: PRON_LEMMA, TAG: "PPER"}, + {ORTH: "'S", LEMMA: PRON_LEMMA, NORM: "'s", TAG: "PPER"}, + {ORTH: "'s", LEMMA: PRON_LEMMA, NORM: "'s", TAG: "PPER"}, + {ORTH: "S'", LEMMA: PRON_LEMMA, NORM: "'s", TAG: "PPER"}, + {ORTH: "s'", LEMMA: PRON_LEMMA, NORM: "'s", TAG: "PPER"}, {ORTH: "'n", LEMMA: "ein", NORM: "ein"}, {ORTH: "'ne", LEMMA: "eine", NORM: "eine"}, {ORTH: "'nen", LEMMA: "ein", NORM: "einen"}, {ORTH: "'nem", LEMMA: "ein", NORM: "einem"}, - {ORTH: "Abb.", LEMMA: "Abbildung"}, - {ORTH: "Abk.", LEMMA: "Abkürzung"}, - {ORTH: "Abt.", LEMMA: "Abteilung"}, - {ORTH: "Apr.", LEMMA: "April"}, - {ORTH: "Aug.", LEMMA: "August"}, - {ORTH: "Bd.", LEMMA: "Band"}, - {ORTH: "Betr.", LEMMA: "Betreff"}, - {ORTH: "Bf.", LEMMA: "Bahnhof"}, - {ORTH: "Bhf.", LEMMA: "Bahnhof"}, - {ORTH: "Bsp.", LEMMA: "Beispiel"}, - {ORTH: "Dez.", LEMMA: "Dezember"}, - {ORTH: "Di.", LEMMA: "Dienstag"}, - {ORTH: "Do.", LEMMA: "Donnerstag"}, - {ORTH: "Fa.", LEMMA: "Firma"}, - {ORTH: "Fam.", LEMMA: "Familie"}, - {ORTH: "Feb.", LEMMA: "Februar"}, - {ORTH: "Fr.", LEMMA: "Frau"}, - {ORTH: "Frl.", LEMMA: "Fräulein"}, - {ORTH: "Hbf.", LEMMA: "Hauptbahnhof"}, - {ORTH: "Hr.", LEMMA: "Herr"}, - {ORTH: "Hrn.", LEMMA: "Herr"}, - {ORTH: "Jan.", LEMMA: "Januar"}, - {ORTH: "Jh.", LEMMA: "Jahrhundert"}, - {ORTH: "Jhd.", LEMMA: "Jahrhundert"}, - {ORTH: "Jul.", LEMMA: "Juli"}, - {ORTH: "Jun.", LEMMA: "Juni"}, - {ORTH: "Mi.", LEMMA: "Mittwoch"}, - {ORTH: "Mio.", LEMMA: "Million"}, - {ORTH: "Mo.", LEMMA: "Montag"}, - {ORTH: "Mrd.", LEMMA: "Milliarde"}, - {ORTH: "Mrz.", LEMMA: "März"}, - {ORTH: "MwSt.", LEMMA: "Mehrwertsteuer"}, - {ORTH: "Mär.", LEMMA: "März"}, - {ORTH: "Nov.", LEMMA: "November"}, - {ORTH: "Nr.", LEMMA: "Nummer"}, - {ORTH: "Okt.", LEMMA: "Oktober"}, - {ORTH: "Orig.", LEMMA: "Original"}, - {ORTH: "Pkt.", LEMMA: "Punkt"}, - {ORTH: "Prof.", LEMMA: "Professor"}, - {ORTH: "Red.", LEMMA: "Redaktion"}, - {ORTH: "Sa.", LEMMA: "Samstag"}, - {ORTH: "Sep.", LEMMA: "September"}, - {ORTH: "Sept.", LEMMA: "September"}, - {ORTH: "So.", LEMMA: "Sonntag"}, - {ORTH: "Std.", LEMMA: "Stunde"}, - {ORTH: "Str.", LEMMA: "Straße"}, - {ORTH: "Tel.", LEMMA: "Telefon"}, - {ORTH: "Tsd.", LEMMA: "Tausend"}, - {ORTH: "Univ.", LEMMA: "Universität"}, - {ORTH: "abzgl.", LEMMA: "abzüglich"}, - {ORTH: "allg.", LEMMA: "allgemein"}, - {ORTH: "bspw.", LEMMA: "beispielsweise"}, - {ORTH: "bzgl.", LEMMA: "bezüglich"}, - {ORTH: "bzw.", LEMMA: "beziehungsweise"}, + {ORTH: "Abb.", LEMMA: "Abbildung", NORM: "Abbildung"}, + {ORTH: "Abk.", LEMMA: "Abkürzung", NORM: "Abkürzung"}, + {ORTH: "Abt.", LEMMA: "Abteilung", NORM: "Abteilung"}, + {ORTH: "Apr.", LEMMA: "April", NORM: "April"}, + {ORTH: "Aug.", LEMMA: "August", NORM: "August"}, + {ORTH: "Bd.", LEMMA: "Band", NORM: "Band"}, + {ORTH: "Betr.", LEMMA: "Betreff", NORM: "Betreff"}, + {ORTH: "Bf.", LEMMA: "Bahnhof", NORM: "Bahnhof"}, + {ORTH: "Bhf.", LEMMA: "Bahnhof", NORM: "Bahnhof"}, + {ORTH: "Bsp.", LEMMA: "Beispiel", NORM: "Beispiel"}, + {ORTH: "Dez.", LEMMA: "Dezember", NORM: "Dezember"}, + {ORTH: "Di.", LEMMA: "Dienstag", NORM: "Dienstag"}, + {ORTH: "Do.", LEMMA: "Donnerstag", NORM: "Donnerstag"}, + {ORTH: "Fa.", LEMMA: "Firma", NORM: "Firma"}, + {ORTH: "Fam.", LEMMA: "Familie", NORM: "Familie"}, + {ORTH: "Feb.", LEMMA: "Februar", NORM: "Februar"}, + {ORTH: "Fr.", LEMMA: "Frau", NORM: "Frau"}, + {ORTH: "Frl.", LEMMA: "Fräulein", NORM: "Fräulein"}, + {ORTH: "Hbf.", LEMMA: "Hauptbahnhof", NORM: "Hauptbahnhof"}, + {ORTH: "Hr.", LEMMA: "Herr", NORM: "Herr"}, + {ORTH: "Hrn.", LEMMA: "Herr", NORM: "Herrn"}, + {ORTH: "Jan.", LEMMA: "Januar", NORM: "Januar"}, + {ORTH: "Jh.", LEMMA: "Jahrhundert", NORM: "Jahrhundert"}, + {ORTH: "Jhd.", LEMMA: "Jahrhundert", NORM: "Jahrhundert"}, + {ORTH: "Jul.", LEMMA: "Juli", NORM: "Juli"}, + {ORTH: "Jun.", LEMMA: "Juni", NORM: "Juni"}, + {ORTH: "Mi.", LEMMA: "Mittwoch", NORM: "Mittwoch"}, + {ORTH: "Mio.", LEMMA: "Million", NORM: "Million"}, + {ORTH: "Mo.", LEMMA: "Montag", NORM: "Montag"}, + {ORTH: "Mrd.", LEMMA: "Milliarde", NORM: "Milliarde"}, + {ORTH: "Mrz.", LEMMA: "März", NORM: "März"}, + {ORTH: "MwSt.", LEMMA: "Mehrwertsteuer", NORM: "Mehrwertsteuer"}, + {ORTH: "Mär.", LEMMA: "März", NORM: "März"}, + {ORTH: "Nov.", LEMMA: "November", NORM: "November"}, + {ORTH: "Nr.", LEMMA: "Nummer", NORM: "Nummer"}, + {ORTH: "Okt.", LEMMA: "Oktober", NORM: "Oktober"}, + {ORTH: "Orig.", LEMMA: "Original", NORM: "Original"}, + {ORTH: "Pkt.", LEMMA: "Punkt", NORM: "Punkt"}, + {ORTH: "Prof.", LEMMA: "Professor", NORM: "Professor"}, + {ORTH: "Red.", LEMMA: "Redaktion", NORM: "Redaktion"}, + {ORTH: "Sa.", LEMMA: "Samstag", NORM: "Samstag"}, + {ORTH: "Sep.", LEMMA: "September", NORM: "September"}, + {ORTH: "Sept.", LEMMA: "September", NORM: "September"}, + {ORTH: "So.", LEMMA: "Sonntag", NORM: "Sonntag"}, + {ORTH: "Std.", LEMMA: "Stunde", NORM: "Stunde"}, + {ORTH: "Str.", LEMMA: "Straße", NORM: "Straße"}, + {ORTH: "Tel.", LEMMA: "Telefon", NORM: "Telefon"}, + {ORTH: "Tsd.", LEMMA: "Tausend", NORM: "Tausend"}, + {ORTH: "Univ.", LEMMA: "Universität", NORM: "Universität"}, + {ORTH: "abzgl.", LEMMA: "abzüglich", NORM: "abzüglich"}, + {ORTH: "allg.", LEMMA: "allgemein", NORM: "allgemein"}, + {ORTH: "bspw.", LEMMA: "beispielsweise", NORM: "beispielsweise"}, + {ORTH: "bzgl.", LEMMA: "bezüglich", NORM: "bezüglich"}, + {ORTH: "bzw.", LEMMA: "beziehungsweise", NORM: "beziehungsweise"}, {ORTH: "d.h.", LEMMA: "das heißt"}, - {ORTH: "dgl.", LEMMA: "dergleichen"}, - {ORTH: "ebd.", LEMMA: "ebenda"}, - {ORTH: "eigtl.", LEMMA: "eigentlich"}, - {ORTH: "engl.", LEMMA: "englisch"}, - {ORTH: "evtl.", LEMMA: "eventuell"}, - {ORTH: "frz.", LEMMA: "französisch"}, - {ORTH: "gegr.", LEMMA: "gegründet"}, - {ORTH: "ggf.", LEMMA: "gegebenenfalls"}, - {ORTH: "ggfs.", LEMMA: "gegebenenfalls"}, - {ORTH: "ggü.", LEMMA: "gegenüber"}, + {ORTH: "dgl.", LEMMA: "dergleichen", NORM: "dergleichen"}, + {ORTH: "ebd.", LEMMA: "ebenda", NORM: "ebenda"}, + {ORTH: "eigtl.", LEMMA: "eigentlich", NORM: "eigentlich"}, + {ORTH: "engl.", LEMMA: "englisch", NORM: "englisch"}, + {ORTH: "evtl.", LEMMA: "eventuell", NORM: "eventuell"}, + {ORTH: "frz.", LEMMA: "französisch", NORM: "französisch"}, + {ORTH: "gegr.", LEMMA: "gegründet", NORM: "gegründet"}, + {ORTH: "ggf.", LEMMA: "gegebenenfalls", NORM: "gegebenenfalls"}, + {ORTH: "ggfs.", LEMMA: "gegebenenfalls", NORM: "gegebenenfalls"}, + {ORTH: "ggü.", LEMMA: "gegenüber", NORM: "gegenüber"}, {ORTH: "i.O.", LEMMA: "in Ordnung"}, {ORTH: "i.d.R.", LEMMA: "in der Regel"}, - {ORTH: "incl.", LEMMA: "inklusive"}, - {ORTH: "inkl.", LEMMA: "inklusive"}, - {ORTH: "insb.", LEMMA: "insbesondere"}, - {ORTH: "kath.", LEMMA: "katholisch"}, - {ORTH: "lt.", LEMMA: "laut"}, - {ORTH: "max.", LEMMA: "maximal"}, - {ORTH: "min.", LEMMA: "minimal"}, - {ORTH: "mind.", LEMMA: "mindestens"}, - {ORTH: "mtl.", LEMMA: "monatlich"}, + {ORTH: "incl.", LEMMA: "inklusive", NORM: "inklusive"}, + {ORTH: "inkl.", LEMMA: "inklusive", NORM: "inklusive"}, + {ORTH: "insb.", LEMMA: "insbesondere", NORM: "insbesondere"}, + {ORTH: "kath.", LEMMA: "katholisch", NORM: "katholisch"}, + {ORTH: "lt.", LEMMA: "laut", NORM: "laut"}, + {ORTH: "max.", LEMMA: "maximal", NORM: "maximal"}, + {ORTH: "min.", LEMMA: "minimal", NORM: "minimal"}, + {ORTH: "mind.", LEMMA: "mindestens", NORM: "mindestens"}, + {ORTH: "mtl.", LEMMA: "monatlich", NORM: "monatlich"}, {ORTH: "n.Chr.", LEMMA: "nach Christus"}, - {ORTH: "orig.", LEMMA: "original"}, - {ORTH: "röm.", LEMMA: "römisch"}, + {ORTH: "orig.", LEMMA: "original", NORM: "original"}, + {ORTH: "röm.", LEMMA: "römisch", NORM: "römisch"}, {ORTH: "s.o.", LEMMA: "siehe oben"}, {ORTH: "sog.", LEMMA: "so genannt"}, {ORTH: "stellv.", LEMMA: "stellvertretend"}, - {ORTH: "tägl.", LEMMA: "täglich"}, + {ORTH: "tägl.", LEMMA: "täglich", NORM: "täglich"}, {ORTH: "u.U.", LEMMA: "unter Umständen"}, {ORTH: "u.s.w.", LEMMA: "und so weiter"}, {ORTH: "u.v.m.", LEMMA: "und vieles mehr"}, @@ -153,9 +153,9 @@ for exc_data in [ {ORTH: "v.Chr.", LEMMA: "vor Christus"}, {ORTH: "v.a.", LEMMA: "vor allem"}, {ORTH: "v.l.n.r.", LEMMA: "von links nach rechts"}, - {ORTH: "vgl.", LEMMA: "vergleiche"}, - {ORTH: "vllt.", LEMMA: "vielleicht"}, - {ORTH: "vlt.", LEMMA: "vielleicht"}, + {ORTH: "vgl.", LEMMA: "vergleiche", NORM: "vergleiche"}, + {ORTH: "vllt.", LEMMA: "vielleicht", NORM: "vielleicht"}, + {ORTH: "vlt.", LEMMA: "vielleicht", NORM: "vielleicht"}, {ORTH: "z.B.", LEMMA: "zum Beispiel"}, {ORTH: "z.Bsp.", LEMMA: "zum Beispiel"}, {ORTH: "z.T.", LEMMA: "zum Teil"}, @@ -163,7 +163,7 @@ for exc_data in [ {ORTH: "z.Zt.", LEMMA: "zur Zeit"}, {ORTH: "z.b.", LEMMA: "zum Beispiel"}, {ORTH: "zzgl.", LEMMA: "zuzüglich"}, - {ORTH: "österr.", LEMMA: "österreichisch"}]: + {ORTH: "österr.", LEMMA: "österreichisch", NORM: "österreichisch"}]: _exc[exc_data[ORTH]] = [dict(exc_data)] diff --git a/spacy/tests/lang/de/test_exceptions.py b/spacy/tests/lang/de/test_exceptions.py index 13da3dc33..f7db648c9 100644 --- a/spacy/tests/lang/de/test_exceptions.py +++ b/spacy/tests/lang/de/test_exceptions.py @@ -8,20 +8,33 @@ import pytest @pytest.mark.parametrize('text', ["auf'm", "du's", "über'm", "wir's"]) -def test_tokenizer_splits_contractions(de_tokenizer, text): +def test_de_tokenizer_splits_contractions(de_tokenizer, text): tokens = de_tokenizer(text) assert len(tokens) == 2 @pytest.mark.parametrize('text', ["z.B.", "d.h.", "Jan.", "Dez.", "Chr."]) -def test_tokenizer_handles_abbr(de_tokenizer, text): +def test_de_tokenizer_handles_abbr(de_tokenizer, text): tokens = de_tokenizer(text) assert len(tokens) == 1 -def test_tokenizer_handles_exc_in_text(de_tokenizer): +def test_de_tokenizer_handles_exc_in_text(de_tokenizer): text = "Ich bin z.Zt. im Urlaub." tokens = de_tokenizer(text) assert len(tokens) == 6 assert tokens[2].text == "z.Zt." assert tokens[2].lemma_ == "zur Zeit" + + +@pytest.mark.parametrize('text,norms', [("vor'm", ["vor", "dem"]), ("du's", ["du", "es"])]) +def test_de_tokenizer_norm_exceptions(de_tokenizer, text, norms): + tokens = de_tokenizer(text) + assert [token.norm_ for token in tokens] == norms + + +@pytest.mark.xfail +@pytest.mark.parametrize('text,norm', [("daß", "dass")]) +def test_de_lex_attrs_norm_exceptions(de_tokenizer, text, norm): + tokens = de_tokenizer(text) + assert tokens[0].norm_ == norm