From 1bbfa14436f4cf0f31a653147454e85afbd6901e Mon Sep 17 00:00:00 2001 From: ines Date: Mon, 8 May 2017 15:49:56 +0200 Subject: [PATCH] Reorganise Hungarian language data --- spacy/hu/__init__.py | 31 +- spacy/hu/{lemmatization.py => lemmatizer.py} | 4 +- spacy/hu/punctuation.py | 25 +- spacy/hu/tokenizer_exceptions.py | 724 +++---------------- 4 files changed, 117 insertions(+), 667 deletions(-) rename spacy/hu/{lemmatization.py => lemmatizer.py} (99%) diff --git a/spacy/hu/__init__.py b/spacy/hu/__init__.py index 10c429c44..016f51d6f 100644 --- a/spacy/hu/__init__.py +++ b/spacy/hu/__init__.py @@ -1,34 +1,35 @@ # coding: utf8 -from __future__ import unicode_literals, print_function +from __future__ import unicode_literals -from .tokenizer_exceptions import TOKEN_MATCH -from .language_data import * -from ..attrs import LANG +from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS, TOKEN_MATCH +from .punctuation import TOKENIZER_PREFIXES, TOKENIZER_SUFFIXES, TOKENIZER_INFIXES +from .stop_words import STOP_WORDS +from .lemmatizer import LOOKUP + +from ..language_data import BASE_EXCEPTIONS from ..language import Language from ..lemmatizerlookup import Lemmatizer -from .lemmatization import LOOK_UP +from ..attrs import LANG +from ..util import update_exc + class Hungarian(Language): lang = 'hu' class Defaults(Language.Defaults): - tokenizer_exceptions = dict(TOKENIZER_EXCEPTIONS) lex_attr_getters = dict(Language.Defaults.lex_attr_getters) lex_attr_getters[LANG] = lambda text: 'hu' - prefixes = tuple(TOKENIZER_PREFIXES) - - suffixes = tuple(TOKENIZER_SUFFIXES) - - infixes = tuple(TOKENIZER_INFIXES) - + tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) stop_words = set(STOP_WORDS) - + prefixes = tuple(TOKENIZER_PREFIXES) + suffixes = tuple(TOKENIZER_SUFFIXES) + infixes = tuple(TOKENIZER_INFIXES) token_match = TOKEN_MATCH @classmethod def create_lemmatizer(cls, nlp=None): - return Lemmatizer(LOOK_UP) + return Lemmatizer(LOOKUP) -EXPORT = Hungarian \ No newline at end of file +__all__ = ['Hungarian'] diff --git a/spacy/hu/lemmatization.py b/spacy/hu/lemmatizer.py similarity index 99% rename from spacy/hu/lemmatization.py rename to spacy/hu/lemmatizer.py index ad0d530e2..faeaf5e6c 100644 --- a/spacy/hu/lemmatization.py +++ b/spacy/hu/lemmatizer.py @@ -1,7 +1,7 @@ # coding: utf8 from __future__ import unicode_literals -LOOK_UP = { +LOOKUP = { "Aaronsonnak": "Aaronson", "Aaronsont": "Aaronson", "Abbáziában": "Abbázia", @@ -37733,4 +37733,4 @@ LOOK_UP = { "űzzön": "űz", "űzött": "űz", "űzöttek": "űzött" -} \ No newline at end of file +} diff --git a/spacy/hu/punctuation.py b/spacy/hu/punctuation.py index 69f3eb4f2..b14767e92 100644 --- a/spacy/hu/punctuation.py +++ b/spacy/hu/punctuation.py @@ -1,17 +1,20 @@ # coding: utf8 from __future__ import unicode_literals -from ..language_data.punctuation import ALPHA_LOWER, LIST_ELLIPSES, QUOTES, ALPHA_UPPER, LIST_QUOTES, UNITS, \ - CURRENCY, LIST_PUNCT, ALPHA, _QUOTES +from ..language_data.punctuation import ALPHA_LOWER, LIST_ELLIPSES, QUOTES +from ..language_data.punctuation import ALPHA_UPPER, LIST_QUOTES, UNITS +from ..language_data.punctuation import CURRENCY, LIST_PUNCT, ALPHA, _QUOTES + + +_currency_symbols = r"\$ ¢ £ € ¥ ฿" -CURRENCY_SYMBOLS = r"\$ ¢ £ € ¥ ฿" TOKENIZER_PREFIXES = ( [r'\+'] + LIST_PUNCT + LIST_ELLIPSES + - LIST_QUOTES -) + LIST_QUOTES) + TOKENIZER_SUFFIXES = ( LIST_PUNCT + @@ -22,10 +25,9 @@ TOKENIZER_SUFFIXES = ( r'(?<=°[FfCcKk])\.', r'(?<=[0-9])(?:{c})'.format(c=CURRENCY), r'(?<=[0-9])(?:{u})'.format(u=UNITS), - r'(?<=[{al}{p}{c}(?:{q})])\.'.format(al=ALPHA_LOWER, p=r'%²\-\)\]\+', q=QUOTES, c=CURRENCY_SYMBOLS), - r'(?<=[{al})])-e'.format(al=ALPHA_LOWER) - ] -) + r'(?<=[{al}{p}{c}(?:{q})])\.'.format(al=ALPHA_LOWER, p=r'%²\-\)\]\+', q=QUOTES, c=_currency_symbols), + r'(?<=[{al})])-e'.format(al=ALPHA_LOWER)]) + TOKENIZER_INFIXES = ( LIST_ELLIPSES + @@ -35,7 +37,4 @@ TOKENIZER_INFIXES = ( 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.replace("'", "").strip().replace(" ", "")), - ] -) -__all__ = ["TOKENIZER_PREFIXES", "TOKENIZER_SUFFIXES", "TOKENIZER_INFIXES"] + r'(?<=[{a}])([{q}\)\]\(\[])(?=[\-{a}])'.format(a=ALPHA, q=_QUOTES.replace("'", "").strip().replace(" ", ""))]) diff --git a/spacy/hu/tokenizer_exceptions.py b/spacy/hu/tokenizer_exceptions.py index a6dc47511..87b10a3ad 100644 --- a/spacy/hu/tokenizer_exceptions.py +++ b/spacy/hu/tokenizer_exceptions.py @@ -3,646 +3,96 @@ from __future__ import unicode_literals import regex as re -from spacy.language_data.punctuation import ALPHA_LOWER, CURRENCY +from ..symbols import ORTH +from ..language_data.punctuation import ALPHA_LOWER, CURRENCY from ..language_data.tokenizer_exceptions import _URL_PATTERN -ABBREVIATIONS = """ -A. -AG. -AkH. -Aö. -B. -B.CS. -B.S. -B.Sc. -B.ú.é.k. -BE. -BEK. -BSC. -BSc. -BTK. -Bat. -Be. -Bek. -Bfok. -Bk. -Bp. -Bros. -Bt. -Btk. -Btke. -Btét. -C. -CSC. -Cal. -Cg. -Cgf. -Cgt. -Cia. -Co. -Colo. -Comp. -Copr. -Corp. -Cos. -Cs. -Csc. -Csop. -Cstv. -Ctv. -Ctvr. -D. -DR. -Dipl. -Dr. -Dsz. -Dzs. -E. -EK. -EU. -F. -Fla. -Folyt. -Fpk. -Főszerk. -G. -GK. -GM. -Gfv. -Gmk. -Gr. -Group. -Gt. -Gy. -H. -HKsz. -Hmvh. -I. -Ifj. -Inc. -Inform. -Int. -J. -Jr. -Jv. -K. -K.m.f. -KB. -KER. -KFT. -KRT. -Kb. -Ker. -Kft. -Kg. -Kht. -Kkt. -Kong. -Korm. -Kr. -Kr.e. -Kr.u. -Krt. -L. -LB. -Llc. -Ltd. -M. -M.A. -M.S. -M.SC. -M.Sc. -MA. -MH. -MSC. -MSc. -Mass. -Max. -Mlle. -Mme. -Mo. -Mr. -Mrs. -Ms. -Mt. -N. -N.N. -NB. -NBr. -Nat. -No. -Nr. -Ny. -Nyh. -Nyr. -Nyrt. -O. -OJ. -Op. -P. -P.H. -P.S. -PH.D. -PHD. -PROF. -Pf. -Ph.D -PhD. -Pk. -Pl. -Plc. -Pp. -Proc. -Prof. -Ptk. -R. -RT. -Rer. -Rt. -S. -S.B. -SZOLG. -Salg. -Sch. -Spa. -St. -Sz. -SzRt. -Szerk. -Szfv. -Szjt. -Szolg. -Szt. -Sztv. -Szvt. -Számv. -T. -TEL. -Tel. -Ty. -Tyr. -U. -Ui. -Ut. -V. -VB. -Vcs. -Vhr. -Vht. -Várm. -W. -X. -X.Y. -Y. -Z. -Zrt. -Zs. -a.C. -ac. -adj. -adm. -ag. -agit. -alez. -alk. -all. -altbgy. -an. -ang. -arch. -at. -atc. -aug. -b.a. -b.s. -b.sc. -bek. -belker. -berend. -biz. -bizt. -bo. -bp. -br. -bsc. -bt. -btk. -ca. -cc. -cca. -cf. -cif. -co. -corp. -cos. -cs. -csc. -csüt. -cső. -ctv. -dbj. -dd. -ddr. -de. -dec. -dikt. -dipl. -dj. -dk. -dl. -dny. -dolg. -dr. -du. -dzs. -ea. -ed. -eff. -egyh. -ell. -elv. -elvt. -em. -eng. -eny. -et. -etc. -ev. -ezr. -eü. -f.h. -f.é. -fam. -fb. -febr. -fej. -felv. -felügy. -ff. -ffi. -fhdgy. -fil. -fiz. -fm. -foglalk. -ford. -fp. -fr. -frsz. -fszla. -fszt. -ft. -fuv. -főig. -főisk. -főtörm. -főv. -gazd. -gimn. -gk. -gkv. -gmk. -gondn. -gr. -grav. -gy. -gyak. -gyártm. -gör. -hads. -hallg. -hdm. -hdp. -hds. -hg. -hiv. -hk. -hm. -ho. -honv. -hp. -hr. -hrsz. -hsz. -ht. -htb. -hv. -hőm. -i.e. -i.sz. -id. -ie. -ifj. -ig. -igh. -ill. -imp. -inc. -ind. -inform. -inic. -int. -io. -ip. -ir. -irod. -irod. -isk. -ism. -izr. -iá. -jan. -jav. -jegyz. -jgmk. -jjv. -jkv. -jogh. -jogt. -jr. -jvb. -júl. -jún. -karb. -kat. -kath. -kb. -kcs. -kd. -ker. -kf. -kft. -kht. -kir. -kirend. -kisip. -kiv. -kk. -kkt. -klin. -km. -korm. -kp. -krt. -kt. -ktsg. -kult. -kv. -kve. -képv. -kísérl. -kóth. -könyvt. -körz. -köv. -közj. -közl. -közp. -közt. -kü. -lat. -ld. -legs. -lg. -lgv. -loc. -lt. -ltd. -ltp. -luth. -m.a. -m.s. -m.sc. -ma. -mat. -max. -mb. -med. -megh. -met. -mf. -mfszt. -min. -miss. -mjr. -mjv. -mk. -mlle. -mme. -mn. -mozg. -mr. -mrs. -ms. -msc. -má. -máj. -márc. -mé. -mélt. -mü. -műh. -műsz. -műv. -művez. -nagyker. -nagys. -nat. -nb. -neg. -nk. -no. -nov. -nu. -ny. -nyilv. -nyrt. -nyug. -obj. -okl. -okt. -old. -olv. -orsz. -ort. -ov. -ovh. -pf. -pg. -ph.d -ph.d. -phd. -phil. -pjt. -pk. -pl. -plb. -plc. -pld. -plur. -pol. -polg. -poz. -pp. -proc. -prof. -prot. -pság. -ptk. -pu. -pü. -r.k. -rac. -rad. -red. -ref. -reg. -rer. -rev. -rf. -rkp. -rkt. -rt. -rtg. -röv. -s.b. -s.k. -sa. -sb. -sel. -sgt. -sm. -st. -stat. -stb. -strat. -stud. -sz. -szakm. -szaksz. -szakszerv. -szd. -szds. -szept. -szerk. -szf. -szimf. -szjt. -szkv. -szla. -szn. -szolg. -szt. -szubj. -szöv. -szül. -tanm. -tb. -tbk. -tc. -techn. -tek. -tel. -tf. -tgk. -ti. -tip. -tisztv. -titks. -tk. -tkp. -tny. -tp. -tszf. -tszk. -tszkv. -tv. -tvr. -ty. -törv. -tü. -ua. -ui. -unit. -uo. -uv. -vas. -vb. -vegy. -vh. -vhol. -vhr. -vill. -vizsg. -vk. -vkf. -vkny. -vm. -vol. -vs. -vsz. -vv. -vál. -várm. -vízv. -vö. -zrt. -zs. -Á. -Áe. -Áht. -É. -Épt. -Ész. -Új-Z. -ÚjZ. -Ún. -á. -ált. -ápr. -ásv. -é. -ék. -ény. -érk. -évf. -í. -ó. -össz. -ötk. -özv. -ú. -ú.n. -úm. -ún. -út. -üag. -üd. -üdv. -üe. -ümk. -ütk. -üv. -ű. -őrgy. -őrpk. -őrv. -""".strip().split() -OTHER_EXC = """ --e -""".strip().split() +_exc = {} -ORD_NUM_OR_DATE = "([A-Z0-9]+[./-])*(\d+\.?)" -_NUM = "[+\-]?\d+([,.]\d+)*" -_OPS = "[=<>+\-\*/^()÷%²]" -_SUFFIXES = "-[{a}]+".format(a=ALPHA_LOWER) -NUMERIC_EXP = "({n})(({o})({n}))*[%]?".format(n=_NUM, o=_OPS) -TIME_EXP = "\d+(:\d+)*(\.\d+)?" +for orth in [ + "-e", "A.", "AG.", "AkH.", "Aö.", "B.", "B.CS.", "B.S.", "B.Sc.", "B.ú.é.k.", + "BE.", "BEK.", "BSC.", "BSc.", "BTK.", "Bat.", "Be.", "Bek.", "Bfok.", + "Bk.", "Bp.", "Bros.", "Bt.", "Btk.", "Btke.", "Btét.", "C.", "CSC.", + "Cal.", "Cg.", "Cgf.", "Cgt.", "Cia.", "Co.", "Colo.", "Comp.", "Copr.", + "Corp.", "Cos.", "Cs.", "Csc.", "Csop.", "Cstv.", "Ctv.", "Ctvr.", "D.", + "DR.", "Dipl.", "Dr.", "Dsz.", "Dzs.", "E.", "EK.", "EU.", "F.", "Fla.", + "Folyt.", "Fpk.", "Főszerk.", "G.", "GK.", "GM.", "Gfv.", "Gmk.", "Gr.", + "Group.", "Gt.", "Gy.", "H.", "HKsz.", "Hmvh.", "I.", "Ifj.", "Inc.", + "Inform.", "Int.", "J.", "Jr.", "Jv.", "K.", "K.m.f.", "KB.", "KER.", + "KFT.", "KRT.", "Kb.", "Ker.", "Kft.", "Kg.", "Kht.", "Kkt.", "Kong.", + "Korm.", "Kr.", "Kr.e.", "Kr.u.", "Krt.", "L.", "LB.", "Llc.", "Ltd.", "M.", + "M.A.", "M.S.", "M.SC.", "M.Sc.", "MA.", "MH.", "MSC.", "MSc.", "Mass.", + "Max.", "Mlle.", "Mme.", "Mo.", "Mr.", "Mrs.", "Ms.", "Mt.", "N.", "N.N.", + "NB.", "NBr.", "Nat.", "No.", "Nr.", "Ny.", "Nyh.", "Nyr.", "Nyrt.", "O.", + "OJ.", "Op.", "P.", "P.H.", "P.S.", "PH.D.", "PHD.", "PROF.", "Pf.", "Ph.D", + "PhD.", "Pk.", "Pl.", "Plc.", "Pp.", "Proc.", "Prof.", "Ptk.", "R.", "RT.", + "Rer.", "Rt.", "S.", "S.B.", "SZOLG.", "Salg.", "Sch.", "Spa.", "St.", + "Sz.", "SzRt.", "Szerk.", "Szfv.", "Szjt.", "Szolg.", "Szt.", "Sztv.", + "Szvt.", "Számv.", "T.", "TEL.", "Tel.", "Ty.", "Tyr.", "U.", "Ui.", "Ut.", + "V.", "VB.", "Vcs.", "Vhr.", "Vht.", "Várm.", "W.", "X.", "X.Y.", "Y.", + "Z.", "Zrt.", "Zs.", "a.C.", "ac.", "adj.", "adm.", "ag.", "agit.", + "alez.", "alk.", "all.", "altbgy.", "an.", "ang.", "arch.", "at.", "atc.", + "aug.", "b.a.", "b.s.", "b.sc.", "bek.", "belker.", "berend.", "biz.", + "bizt.", "bo.", "bp.", "br.", "bsc.", "bt.", "btk.", "ca.", "cc.", "cca.", + "cf.", "cif.", "co.", "corp.", "cos.", "cs.", "csc.", "csüt.", "cső.", + "ctv.", "dbj.", "dd.", "ddr.", "de.", "dec.", "dikt.", "dipl.", "dj.", + "dk.", "dl.", "dny.", "dolg.", "dr.", "du.", "dzs.", "ea.", "ed.", "eff.", + "egyh.", "ell.", "elv.", "elvt.", "em.", "eng.", "eny.", "et.", "etc.", + "ev.", "ezr.", "eü.", "f.h.", "f.é.", "fam.", "fb.", "febr.", "fej.", + "felv.", "felügy.", "ff.", "ffi.", "fhdgy.", "fil.", "fiz.", "fm.", + "foglalk.", "ford.", "fp.", "fr.", "frsz.", "fszla.", "fszt.", "ft.", + "fuv.", "főig.", "főisk.", "főtörm.", "főv.", "gazd.", "gimn.", "gk.", + "gkv.", "gmk.", "gondn.", "gr.", "grav.", "gy.", "gyak.", "gyártm.", "gör.", + "hads.", "hallg.", "hdm.", "hdp.", "hds.", "hg.", "hiv.", "hk.", "hm.", + "ho.", "honv.", "hp.", "hr.", "hrsz.", "hsz.", "ht.", "htb.", "hv.", "hőm.", + "i.e.", "i.sz.", "id.", "ie.", "ifj.", "ig.", "igh.", "ill.", "imp.", + "inc.", "ind.", "inform.", "inic.", "int.", "io.", "ip.", "ir.", "irod.", + "irod.", "isk.", "ism.", "izr.", "iá.", "jan.", "jav.", "jegyz.", "jgmk.", + "jjv.", "jkv.", "jogh.", "jogt.", "jr.", "jvb.", "júl.", "jún.", "karb.", + "kat.", "kath.", "kb.", "kcs.", "kd.", "ker.", "kf.", "kft.", "kht.", + "kir.", "kirend.", "kisip.", "kiv.", "kk.", "kkt.", "klin.", "km.", "korm.", + "kp.", "krt.", "kt.", "ktsg.", "kult.", "kv.", "kve.", "képv.", "kísérl.", + "kóth.", "könyvt.", "körz.", "köv.", "közj.", "közl.", "közp.", "közt.", + "kü.", "lat.", "ld.", "legs.", "lg.", "lgv.", "loc.", "lt.", "ltd.", "ltp.", + "luth.", "m.a.", "m.s.", "m.sc.", "ma.", "mat.", "max.", "mb.", "med.", + "megh.", "met.", "mf.", "mfszt.", "min.", "miss.", "mjr.", "mjv.", "mk.", + "mlle.", "mme.", "mn.", "mozg.", "mr.", "mrs.", "ms.", "msc.", "má.", + "máj.", "márc.", "mé.", "mélt.", "mü.", "műh.", "műsz.", "műv.", "művez.", + "nagyker.", "nagys.", "nat.", "nb.", "neg.", "nk.", "no.", "nov.", "nu.", + "ny.", "nyilv.", "nyrt.", "nyug.", "obj.", "okl.", "okt.", "old.", "olv.", + "orsz.", "ort.", "ov.", "ovh.", "pf.", "pg.", "ph.d", "ph.d.", "phd.", + "phil.", "pjt.", "pk.", "pl.", "plb.", "plc.", "pld.", "plur.", "pol.", + "polg.", "poz.", "pp.", "proc.", "prof.", "prot.", "pság.", "ptk.", "pu.", + "pü.", "r.k.", "rac.", "rad.", "red.", "ref.", "reg.", "rer.", "rev.", + "rf.", "rkp.", "rkt.", "rt.", "rtg.", "röv.", "s.b.", "s.k.", "sa.", "sb.", + "sel.", "sgt.", "sm.", "st.", "stat.", "stb.", "strat.", "stud.", "sz.", + "szakm.", "szaksz.", "szakszerv.", "szd.", "szds.", "szept.", "szerk.", + "szf.", "szimf.", "szjt.", "szkv.", "szla.", "szn.", "szolg.", "szt.", + "szubj.", "szöv.", "szül.", "tanm.", "tb.", "tbk.", "tc.", "techn.", + "tek.", "tel.", "tf.", "tgk.", "ti.", "tip.", "tisztv.", "titks.", "tk.", + "tkp.", "tny.", "tp.", "tszf.", "tszk.", "tszkv.", "tv.", "tvr.", "ty.", + "törv.", "tü.", "ua.", "ui.", "unit.", "uo.", "uv.", "vas.", "vb.", "vegy.", + "vh.", "vhol.", "vhr.", "vill.", "vizsg.", "vk.", "vkf.", "vkny.", "vm.", + "vol.", "vs.", "vsz.", "vv.", "vál.", "várm.", "vízv.", "vö.", "zrt.", + "zs.", "Á.", "Áe.", "Áht.", "É.", "Épt.", "Ész.", "Új-Z.", "ÚjZ.", "Ún.", + "á.", "ált.", "ápr.", "ásv.", "é.", "ék.", "ény.", "érk.", "évf.", "í.", + "ó.", "össz.", "ötk.", "özv.", "ú.", "ú.n.", "úm.", "ún.", "út.", "üag.", + "üd.", "üdv.", "üe.", "ümk.", "ütk.", "üv.", "ű.", "őrgy.", "őrpk.", "őrv."]: + _exc[orth] = [{ORTH: orth}] -NUMS = "(({ne})|({t})|({on})|({c}))({s})?".format( - ne=NUMERIC_EXP, t=TIME_EXP, on=ORD_NUM_OR_DATE, - c=CURRENCY, s=_SUFFIXES -) -TOKEN_MATCH = re.compile("^({u})|({n})$".format(u=_URL_PATTERN, n=NUMS)).match +_ord_num_or_date = "([A-Z0-9]+[./-])*(\d+\.?)" +_num = "[+\-]?\d+([,.]\d+)*" +_ops = "[=<>+\-\*/^()÷%²]" +_suffixes = "-[{a}]+".format(a=ALPHA_LOWER) +_numeric_exp = "({n})(({o})({n}))*[%]?".format(n=_num, o=_ops) +_time_exp = "\d+(:\d+)*(\.\d+)?" + +_nums = "(({ne})|({t})|({on})|({c}))({s})?".format( + ne=_numeric_exp, t=_time_exp, on=_ord_num_or_date, + c=CURRENCY, s=_suffixes) + + +TOKENIZER_EXCEPTIONS = dict(_exc) +TOKEN_MATCH = re.compile("^({u})|({n})$".format(u=_URL_PATTERN, n=_nums)).match