diff --git a/spacy/lang/da/__init__.py b/spacy/lang/da/__init__.py index 45e5b89dd..b4e248cf6 100644 --- a/spacy/lang/da/__init__.py +++ b/spacy/lang/da/__init__.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS +from .norm_exceptions import NORM_EXCEPTIONS from .stop_words import STOP_WORDS from .lex_attrs import LEX_ATTRS from .morph_rules import MORPH_RULES @@ -18,7 +19,8 @@ class DanishDefaults(Language.Defaults): lex_attr_getters = dict(Language.Defaults.lex_attr_getters) lex_attr_getters.update(LEX_ATTRS) lex_attr_getters[LANG] = lambda text: 'da' - lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS) + lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], + BASE_NORMS, NORM_EXCEPTIONS) tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) # morph_rules = MORPH_RULES tag_map = TAG_MAP diff --git a/spacy/lang/da/norm_exceptions.py b/spacy/lang/da/norm_exceptions.py new file mode 100644 index 000000000..71e4b741c --- /dev/null +++ b/spacy/lang/da/norm_exceptions.py @@ -0,0 +1,527 @@ +# coding: utf8 +""" +Special-case rules for normalizing tokens to improve the model's predictions. +For example 'mysterium' vs 'mysterie' and similar. +""" +from __future__ import unicode_literals + + +# Sources: +# 1: https://dsn.dk/retskrivning/om-retskrivningsordbogen/mere-om-retskrivningsordbogen-2012/endrede-stave-og-ordformer/ +# 2: http://www.tjerry-korrektur.dk/ord-med-flere-stavemaader/ + +_exc = { + # Alternative spelling + "a-kraft-værk": "a-kraftværk", # 1 + "ålborg": "aalborg", # 2 + "århus": "aarhus", + "accessoirer": "accessoires", # 1 + "affektert": "affekteret", # 1 + "afrikander": "afrikaaner", # 1 + "aftabuere": "aftabuisere", # 1 + "aftabuering": "aftabuisering", # 1 + "akvarium": "akvarie", # 1 + "alenefader": "alenefar", # 1 + "alenemoder": "alenemor", # 1 + "alkoholambulatorium": "alkoholambulatorie", # 1 + "ambulatorium": "ambulatorie", # 1 + "ananassene": "ananasserne", # 2 + "anførelsestegn": "anførselstegn", # 1 + "anseelig": "anselig", # 2 + "antioxydant": "antioxidant", # 1 + "artrig": "artsrig", # 1 + "auditorium": "auditorie", # 1 + "avocado": "avokado", # 2 + "bagerst": "bagest", # 2 + "bagstræv": "bagstræb", # 1 + "bagstræver": "bagstræber", # 1 + "bagstræverisk": "bagstræberisk", # 1 + "balde": "balle", # 2 + "barselorlov": "barselsorlov", # 1 + "barselvikar": "barselsvikar", # 1 + "baskien": "baskerlandet", # 1 + "bayrisk": "bayersk", # 1 + "bedstefader": "bedstefar", # 1 + "bedstemoder": "bedstemor", # 1 + "behefte": "behæfte", # 1 + "beheftelse": "behæftelse", # 1 + "bidragydende": "bidragsydende", # 1 + "bidragyder": "bidragsyder", # 1 + "billiondel": "billiontedel", # 1 + "blaseret": "blasert", # 1 + "bleskifte": "bleskift", # 1 + "blodbroder": "blodsbroder", # 2 + "blyantspidser": "blyantsspidser", # 2 + "boligministerium": "boligministerie", # 1 + "borhul": "borehul", # 1 + "broder": "bror", # 2 + "buldog": "bulldog", # 2 + "bådhus": "bådehus", # 1 + "børnepleje": "barnepleje", # 1 + "børneseng": "barneseng", # 1 + "børnestol": "barnestol", # 1 + "cairo": "kairo", # 1 + "cambodia": "cambodja", # 1 + "cambodianer": "cambodjaner", # 1 + "cambodiansk": "cambodjansk", # 1 + "camouflage": "kamuflage", # 2 + "campylobacter": "kampylobakter", # 1 + "centeret": "centret", # 2 + "chefskahyt": "chefkahyt", # 1 + "chefspost": "chefpost", # 1 + "chefssekretær": "chefsekretær", # 1 + "chefsstol": "chefstol", # 1 + "cirkulærskrivelse": "cirkulæreskrivelse", # 1 + "cognacsglas": "cognacglas", # 1 + "columnist": "kolumnist", # 1 + "cricket": "kricket", # 2 + "dagplejemoder": "dagplejemor", # 1 + "damaskesdug": "damaskdug", # 1 + "damp-barn": "dampbarn", # 1 + "delfinarium": "delfinarie", # 1 + "dentallaboratorium": "dentallaboratorie", # 1 + "diaramme": "diasramme", # 1 + "diaré": "diarré", # 1 + "dioxyd": "dioxid", # 1 + "dommedagsprædiken": "dommedagspræken", # 1 + "donut": "doughnut", # 2 + "driftmæssig": "driftsmæssig", # 1 + "driftsikker": "driftssikker", # 1 + "driftsikring": "driftssikring", # 1 + "drikkejogurt": "drikkeyoghurt", # 1 + "drivein": "drive-in", # 1 + "driveinbiograf": "drive-in-biograf", # 1 + "drøvel": "drøbel", # 1 + "dødskriterium": "dødskriterie", # 1 + "e-mail-adresse": "e-mailadresse", # 1 + "e-post-adresse": "e-postadresse", # 1 + "egypten": "ægypten", # 2 + "ekskommunicere": "ekskommunikere", # 1 + "eksperimentarium": "eksperimentarie", # 1 + "elsass": "Alsace", # 1 + "elsasser": "alsacer", # 1 + "elsassisk": "alsacisk", # 1 + "elvetal": "ellevetal", # 1 + "elvetiden": "ellevetiden", # 1 + "elveårig": "elleveårig", # 1 + "elveårs": "elleveårs", # 1 + "elveårsbarn": "elleveårsbarn", # 1 + "elvte": "ellevte", # 1 + "elvtedel": "ellevtedel", # 1 + "energiministerium": "energiministerie", # 1 + "erhvervsministerium": "erhvervsministerie", # 1 + "espaliere": "spaliere", # 2 + "evangelium": "evangelie", # 1 + "fagministerium": "fagministerie", # 1 + "fakse": "faxe", # 1 + "fangstkvota": "fangstkvote", # 1 + "fader": "far", # 2 + "farbroder": "farbror", # 1 + "farfader": "farfar", # 1 + "farmoder": "farmor", # 1 + "federal": "føderal", # 1 + "federalisering": "føderalisering", # 1 + "federalisme": "føderalisme", # 1 + "federalist": "føderalist", # 1 + "federalistisk": "føderalistisk", # 1 + "federation": "føderation", # 1 + "federativ": "føderativ", # 1 + "fejlbeheftet": "fejlbehæftet", # 1 + "femetagers": "femetages", # 2 + "femhundredekroneseddel": "femhundredkroneseddel", # 2 + "filmpremiere": "filmpræmiere", # 2 + "finansimperium": "finansimperie", # 1 + "finansministerium": "finansministerie", # 1 + "firehjulstræk": "firhjulstræk", # 2 + "fjernstudium": "fjernstudie", # 1 + "formalier": "formalia", # 1 + "formandsskift": "formandsskifte", # 1 + "fornemst": "fornemmest", # 2 + "fornuftparti": "fornuftsparti", # 1 + "fornuftstridig": "fornuftsstridig", # 1 + "fornuftvæsen": "fornuftsvæsen", # 1 + "fornuftægteskab": "fornuftsægteskab", # 1 + "forretningsministerium": "forretningsministerie", # 1 + "forskningsministerium": "forskningsministerie", # 1 + "forstudium": "forstudie", # 1 + "forsvarsministerium": "forsvarsministerie", # 1 + "frilægge": "fritlægge", # 1 + "frilæggelse": "fritlæggelse", # 1 + "frilægning": "fritlægning", # 1 + "fristille": "fritstille", # 1 + "fristilling": "fritstilling", # 1 + "fuldttegnet": "fuldtegnet", # 1 + "fødestedskriterium": "fødestedskriterie", # 1 + "fødevareministerium": "fødevareministerie", # 1 + "følesløs": "følelsesløs", # 1 + "følgeligt": "følgelig", # 1 + "førne": "førn", # 1 + "gearskift": "gearskifte", # 2 + "gladeligt": "gladelig", # 1 + "glosehefte": "glosehæfte", # 1 + "glædeløs": "glædesløs", # 1 + "gonoré": "gonorré", # 1 + "grangiveligt": "grangivelig", # 1 + "grundliggende": "grundlæggende", # 2 + "grønsag": "grøntsag", # 2 + "gudbenådet": "gudsbenådet", # 1 + "gudfader": "gudfar", # 1 + "gudmoder": "gudmor", # 1 + "gulvmop": "gulvmoppe", # 1 + "gymnasium": "gymnasie", # 1 + "hackning": "hacking", # 1 + "halvbroder": "halvbror", # 1 + "halvelvetiden": "halvellevetiden", # 1 + "handelsgymnasium": "handelsgymnasie", # 1 + "hefte": "hæfte", # 1 + "hefteklamme": "hæfteklamme", # 1 + "heftelse": "hæftelse", # 1 + "heftemaskine": "hæftemaskine", # 1 + "heftepistol": "hæftepistol", # 1 + "hefteplaster": "hæfteplaster", # 1 + "heftestraf": "hæftestraf", # 1 + "heftning": "hæftning", # 1 + "helbroder": "helbror", # 1 + "hjemmeklasse": "hjemklasse", # 1 + "hjulspin": "hjulspind", # 1 + "huggevåben": "hugvåben", # 1 + "hulmurisolering": "hulmursisolering", # 1 + "hurtiggående": "hurtigtgående", # 2 + "hurtigttørrende": "hurtigtørrende", # 2 + "husmoder": "husmor", # 1 + "hydroxyd": "hydroxid", # 1 + "håndmikser": "håndmixer", # 1 + "højtaler": "højttaler", # 2 + "hønemoder": "hønemor", # 1 + "ide": "idé", # 2 + "imperium": "imperie", # 1 + "imponerthed": "imponerethed", # 1 + "inbox": "indboks", # 2 + "indenrigsministerium": "indenrigsministerie", # 1 + "indhefte": "indhæfte", # 1 + "indheftning": "indhæftning", # 1 + "indicium": "indicie", # 1 + "indkassere": "inkassere", # 2 + "iota": "jota", # 1 + "jobskift": "jobskifte", # 1 + "jogurt": "yoghurt", # 1 + "jukeboks": "jukebox", # 1 + "justitsministerium": "justitsministerie", # 1 + "kalorifere": "kalorifer", # 1 + "kandidatstipendium": "kandidatstipendie", # 1 + "kannevas": "kanvas", # 1 + "kaperssauce": "kaperssovs", # 1 + "kigge": "kikke", # 2 + "kirkeministerium": "kirkeministerie", # 1 + "klapmydse": "klapmyds", # 1 + "klimakterium": "klimakterie", # 1 + "klogeligt": "klogelig", # 1 + "knivblad": "knivsblad", # 1 + "kollegaer": "kolleger", # 2 + "kollegium": "kollegie", # 1 + "kollegiehefte": "kollegiehæfte", # 1 + "kollokviumx": "kollokvium", # 1 + "kommissorium": "kommissorie", # 1 + "kompendium": "kompendie", # 1 + "komplicerthed": "komplicerethed", # 1 + "konfederation": "konføderation", # 1 + "konfedereret": "konfødereret", # 1 + "konferensstudium": "konferensstudie", # 1 + "konservatorium": "konservatorie", # 1 + "konsulere": "konsultere", # 1 + "kradsbørstig": "krasbørstig", # 2 + "kravsspecifikation": "kravspecifikation", # 1 + "krematorium": "krematorie", # 1 + "krep": "crepe", # 1 + "krepnylon": "crepenylon", # 1 + "kreppapir": "crepepapir", # 1 + "kricket": "cricket", # 2 + "kriterium": "kriterie", # 1 + "kroat": "kroater", # 2 + "kroki": "croquis", # 1 + "kronprinsepar": "kronprinspar", # 2 + "kropdoven": "kropsdoven", # 1 + "kroplus": "kropslus", # 1 + "krøllefedt": "krølfedt", # 1 + "kulturministerium": "kulturministerie", # 1 + "kuponhefte": "kuponhæfte", # 1 + "kvota": "kvote", # 1 + "kvotaordning": "kvoteordning", # 1 + "laboratorium": "laboratorie", # 1 + "laksfarve": "laksefarve", # 1 + "laksfarvet": "laksefarvet", # 1 + "laksrød": "lakserød", # 1 + "laksyngel": "lakseyngel", # 1 + "laksørred": "lakseørred", # 1 + "landbrugsministerium": "landbrugsministerie", # 1 + "landskampstemning": "landskampsstemning", # 1 + "langust": "languster", # 1 + "lappegrejer": "lappegrej", # 1 + "lavløn": "lavtløn", # 1 + "lillebroder": "lillebror", # 1 + "linear": "lineær", # 1 + "loftlampe": "loftslampe", # 2 + "log-in": "login", # 1 + "login": "log-in", # 2 + "lovmedholdig": "lovmedholdelig", # 1 + "ludder": "luder", # 2 + "lysholder": "lyseholder", # 1 + "lægeskifte": "lægeskift", # 1 + "lærvillig": "lærevillig", # 1 + "løgsauce": "løgsovs", # 1 + "madmoder": "madmor", # 1 + "majonæse": "mayonnaise", # 1 + "mareridtagtig": "mareridtsagtig", # 1 + "margen": "margin", # 2 + "martyrium": "martyrie", # 1 + "mellemstatlig": "mellemstatslig", # 1 + "menneskene": "menneskerne", # 2 + "metropolis": "metropol", # 1 + "miks": "mix", # 1 + "mikse": "mixe", # 1 + "miksepult": "mixerpult", # 1 + "mikser": "mixer", # 1 + "mikserpult": "mixerpult", # 1 + "mikslån": "mixlån", # 1 + "miksning": "mixning", # 1 + "miljøministerium": "miljøministerie", # 1 + "milliarddel": "milliardtedel", # 1 + "milliondel": "milliontedel", # 1 + "ministerium": "ministerie", # 1 + "mop": "moppe", # 1 + "moder": "mor", # 2 + "moratorium": "moratorie", # 1 + "morbroder": "morbror", # 1 + "morfader": "morfar", # 1 + "mormoder": "mormor", # 1 + "musikkonservatorium": "musikkonservatorie", # 1 + "muslingskal": "muslingeskal", # 1 + "mysterium": "mysterie", # 1 + "naturalieydelse": "naturalydelse", # 1 + "naturalieøkonomi": "naturaløkonomi", # 1 + "navnebroder": "navnebror", # 1 + "nerium": "nerie", # 1 + "nådeløs": "nådesløs", # 1 + "nærforestående": "nærtforestående", # 1 + "nærstående": "nærtstående", # 1 + "observatorium": "observatorie", # 1 + "oldefader": "oldefar", # 1 + "oldemoder": "oldemor", # 1 + "opgraduere": "opgradere", # 1 + "opgraduering": "opgradering", # 1 + "oratorium": "oratorie", # 1 + "overbookning": "overbooking", # 1 + "overpræsidium": "overpræsidie", # 1 + "overstatlig": "overstatslig", # 1 + "oxyd": "oxid", # 1 + "oxydere": "oxidere", # 1 + "oxydering": "oxidering", # 1 + "pakkenellike": "pakkenelliker", # 1 + "papirtynd": "papirstynd", # 1 + "pastoralseminarium": "pastoralseminarie", # 1 + "peanutsene": "peanuttene", # 2 + "penalhus": "pennalhus", # 2 + "pensakrav": "pensumkrav", # 1 + "pepperoni": "peperoni", # 1 + "peruaner": "peruvianer", # 1 + "petrole": "petrol", # 1 + "piltast": "piletast", # 1 + "piltaste": "piletast", # 1 + "planetarium": "planetarie", # 1 + "plasteret": "plastret", # 2 + "plastic": "plastik", # 2 + "play-off-kamp": "playoffkamp", # 1 + "plejefader": "plejefar", # 1 + "plejemoder": "plejemor", # 1 + "podium": "podie", # 2 + "praha": "prag", # 2 + "preciøs": "pretiøs", # 2 + "privilegium": "privilegie", # 1 + "progredere": "progrediere", # 1 + "præsidium": "præsidie", # 1 + "psykodelisk": "psykedelisk", # 1 + "pudsegrejer": "pudsegrej", # 1 + "referensgruppe": "referencegruppe", # 1 + "referensramme": "referenceramme", # 1 + "refugium": "refugie", # 1 + "registeret": "registret", # 2 + "remedium": "remedie", # 1 + "remiks": "remix", # 1 + "reservert": "reserveret", # 1 + "ressortministerium": "ressortministerie", # 1 + "ressource": "resurse", # 2 + "resætte": "resette", # 1 + "rettelig": "retteligt", # 1 + "rettetaste": "rettetast", # 1 + "returtaste": "returtast", # 1 + "risici": "risikoer", # 2 + "roll-on": "rollon", # 1 + "rollehefte": "rollehæfte", # 1 + "rostbøf": "roastbeef", # 1 + "rygsæksturist": "rygsækturist", # 1 + "rødstjært": "rødstjert", # 1 + "saddel": "sadel", # 2 + "samaritan": "samaritaner", # 2 + "sanatorium": "sanatorie", # 1 + "sauce": "sovs", # 1 + "scanning": "skanning", # 2 + "sceneskifte": "sceneskift", # 1 + "scilla": "skilla", # 1 + "sejflydende": "sejtflydende", # 1 + "selvstudium": "selvstudie", # 1 + "seminarium": "seminarie", # 1 + "sennepssauce": "sennepssovs ", # 1 + "servitutbeheftet": "servitutbehæftet", # 1 + "sit-in": "sitin", # 1 + "skatteministerium": "skatteministerie", # 1 + "skifer": "skiffer", # 2 + "skyldsfølelse": "skyldfølelse", # 1 + "skysauce": "skysovs", # 1 + "sladdertaske": "sladretaske", # 2 + "sladdervorn": "sladrevorn", # 2 + "slagsbroder": "slagsbror", # 1 + "slettetaste": "slettetast", # 1 + "smørsauce": "smørsovs", # 1 + "snitsel": "schnitzel", # 1 + "snobbeeffekt": "snobeffekt", # 2 + "socialministerium": "socialministerie", # 1 + "solarium": "solarie", # 1 + "soldebroder": "soldebror", # 1 + "spagetti": "spaghetti", # 1 + "spagettistrop": "spaghettistrop", # 1 + "spagettiwestern": "spaghettiwestern", # 1 + "spin-off": "spinoff", # 1 + "spinnefiskeri": "spindefiskeri", # 1 + "spolorm": "spoleorm", # 1 + "sproglaboratorium": "sproglaboratorie", # 1 + "spækbræt": "spækkebræt", # 2 + "stand-in": "standin", # 1 + "stand-up-comedy": "standupcomedy", # 1 + "stand-up-komiker": "standupkomiker", # 1 + "statsministerium": "statsministerie", # 1 + "stedbroder": "stedbror", # 1 + "stedfader": "stedfar", # 1 + "stedmoder": "stedmor", # 1 + "stilehefte": "stilehæfte", # 1 + "stipendium": "stipendie", # 1 + "stjært": "stjert", # 1 + "stjærthage": "stjerthage", # 1 + "storebroder": "storebror", # 1 + "stortå": "storetå", # 1 + "strabads": "strabadser", # 1 + "strømlinjet": "strømlinet", # 1 + "studium": "studie", # 1 + "stænkelap": "stænklap", # 1 + "sundhedsministerium": "sundhedsministerie", # 1 + "suppositorium": "suppositorie", # 1 + "svejts": "schweiz", # 1 + "svejtser": "schweizer", # 1 + "svejtserfranc": "schweizerfranc", # 1 + "svejtserost": "schweizerost", # 1 + "svejtsisk": "schweizisk", # 1 + "svigerfader": "svigerfar", # 1 + "svigermoder": "svigermor", # 1 + "svirebroder": "svirebror", # 1 + "symposium": "symposie", # 1 + "sælarium": "sælarie", # 1 + "søreme": "sørme", # 2 + "søterritorium": "søterritorie", # 1 + "t-bone-steak": "t-bonesteak", # 1 + "tabgivende": "tabsgivende", # 1 + "tabuere": "tabuisere", # 1 + "tabuering": "tabuisering", # 1 + "tackle": "takle", # 2 + "tackling": "takling", # 2 + "taifun": "tyfon", # 1 + "take-off": "takeoff", # 1 + "taknemlig": "taknemmelig", # 2 + "talehørelærer": "tale-høre-lærer", # 1 + "talehøreundervisning": "tale-høre-undervisning", # 1 + "tandstik": "tandstikker", # 1 + "tao": "dao", # 1 + "taoisme": "daoisme", # 1 + "taoist": "daoist", # 1 + "taoistisk": "daoistisk", # 1 + "taverne": "taverna", # 1 + "teateret": "teatret", # 2 + "tekno": "techno", # 1 + "temposkifte": "temposkift", # 1 + "terrarium": "terrarie", # 1 + "territorium": "territorie", # 1 + "tesis": "tese", # 1 + "tidsstudium": "tidsstudie", # 1 + "tipoldefader": "tipoldefar", # 1 + "tipoldemoder": "tipoldemor", # 1 + "tomatsauce": "tomatsovs", # 1 + "tonart": "toneart", # 1 + "trafikministerium": "trafikministerie", # 1 + "tredve": "tredive", # 1 + "tredver": "trediver", # 1 + "tredveårig": "trediveårig", # 1 + "tredveårs": "trediveårs", # 1 + "tredveårsfødselsdag": "trediveårsfødselsdag", # 1 + "tredvte": "tredivte", # 1 + "tredvtedel": "tredivtedel", # 1 + "troldunge": "troldeunge", # 1 + "trommestikke": "trommestik", # 1 + "trubadur": "troubadour", # 2 + "trøstepræmie": "trøstpræmie", # 2 + "tummerum": "trummerum", # 1 + "tumultuarisk": "tumultarisk", # 1 + "tunghørighed": "tunghørhed", # 1 + "tus": "tusch", # 2 + "tusind": "tusinde", # 2 + "tvillingbroder": "tvillingebror", # 1 + "tvillingbror": "tvillingebror", # 1 + "tvillingebroder": "tvillingebror", # 1 + "ubeheftet": "ubehæftet", # 1 + "udenrigsministerium": "udenrigsministerie", # 1 + "udhulning": "udhuling", # 1 + "udslaggivende": "udslagsgivende", # 1 + "udspekulert": "udspekuleret", # 1 + "udviklingsministerium": "udviklingsministerie", # 1 + "uforpligtigende": "uforpligtende", # 1 + "uheldvarslende": "uheldsvarslende", # 1 + "uimponerthed": "uimponerethed", # 1 + "undervisningsministerium": "undervisningsministerie", # 1 + "unægtelig": "unægteligt", # 1 + "urinale": "urinal", # 1 + "uvederheftig": "uvederhæftig", # 1 + "vabel": "vable", # 2 + "vadi": "wadi", # 1 + "vaklevorn": "vakkelvorn", # 1 + "vanadin": "vanadium", # 1 + "vaselin": "vaseline", # 1 + "vederheftig": "vederhæftig", # 1 + "vedhefte": "vedhæfte", # 1 + "velar": "velær", # 1 + "videndeling": "vidensdeling", # 2 + "vinkelanførelsestegn": "vinkelanførselstegn", # 1 + "vipstjært": "vipstjert", # 1 + "vismut": "bismut", # 1 + "visvas": "vissevasse", # 1 + "voksværk": "vokseværk", # 1 + "værtdyr": "værtsdyr", # 1 + "værtplante": "værtsplante", # 1 + "wienersnitsel": "wienerschnitzel", # 1 + "yderliggående": "yderligtgående", # 2 + "zombi": "zombie", # 1 + "ægbakke": "æggebakke", # 1 + "ægformet": "æggeformet", # 1 + "ægleder": "æggeleder", # 1 + "ækvilibrist": "ekvilibrist", # 2 + "æselsøre": "æseløre", # 1 + "øjehule": "øjenhule", # 1 + "øjelåg": "øjenlåg", # 1 + "øjeåbner": "øjenåbner", # 1 + "økonomiministerium": "økonomiministerie", # 1 + "ørenring": "ørering", # 2 + "øvehefte": "øvehæfte" # 1 +} + + +NORM_EXCEPTIONS = {} + +for string, norm in _exc.items(): + NORM_EXCEPTIONS[string] = norm + NORM_EXCEPTIONS[string.title()] = norm diff --git a/spacy/tests/lang/da/test_exceptions.py b/spacy/tests/lang/da/test_exceptions.py index 71e34fc5c..e3ad6fcb4 100644 --- a/spacy/tests/lang/da/test_exceptions.py +++ b/spacy/tests/lang/da/test_exceptions.py @@ -31,3 +31,9 @@ def test_da_tokenizer_handles_custom_base_exc(da_tokenizer): assert len(tokens) == 8 assert tokens[6].text == "i" assert tokens[7].text == "." + +@pytest.mark.parametrize('text,norm', + [("akvarium", "akvarie"), ("bedstemoder", "bedstemor")]) +def test_da_tokenizer_norm_exceptions(da_tokenizer, text, norm): + tokens = da_tokenizer(text) + assert tokens[0].norm_ == norm