diff --git a/spacy/hu/__init__.py b/spacy/hu/__init__.py index 2343b4606..652ea379c 100644 --- a/spacy/hu/__init__.py +++ b/spacy/hu/__init__.py @@ -1,6 +1,7 @@ # encoding: utf8 from __future__ import unicode_literals, print_function +from spacy.hu.tokenizer_exceptions import TOKEN_MATCH from .language_data import * from ..attrs import LANG from ..language import Language @@ -21,3 +22,5 @@ class Hungarian(Language): infixes = tuple(TOKENIZER_INFIXES) stop_words = set(STOP_WORDS) + + token_match = TOKEN_MATCH diff --git a/spacy/hu/language_data.py b/spacy/hu/language_data.py index 49652c5ac..57b473527 100644 --- a/spacy/hu/language_data.py +++ b/spacy/hu/language_data.py @@ -1,8 +1,6 @@ # encoding: utf8 from __future__ import unicode_literals -import six - from spacy.language_data import strings_to_exc, update_exc from .punctuation import * from .stop_words import STOP_WORDS @@ -10,19 +8,15 @@ from .tokenizer_exceptions import ABBREVIATIONS from .tokenizer_exceptions import OTHER_EXC from .. import language_data as base - STOP_WORDS = set(STOP_WORDS) - TOKENIZER_EXCEPTIONS = strings_to_exc(base.EMOTICONS) update_exc(TOKENIZER_EXCEPTIONS, strings_to_exc(base.ABBREVIATIONS)) update_exc(TOKENIZER_EXCEPTIONS, strings_to_exc(OTHER_EXC)) update_exc(TOKENIZER_EXCEPTIONS, strings_to_exc(ABBREVIATIONS)) - -TOKENIZER_PREFIXES = base.TOKENIZER_PREFIXES -TOKENIZER_SUFFIXES = base.TOKENIZER_SUFFIXES + TOKENIZER_SUFFIXES +TOKENIZER_PREFIXES = TOKENIZER_PREFIXES +TOKENIZER_SUFFIXES = TOKENIZER_SUFFIXES TOKENIZER_INFIXES = TOKENIZER_INFIXES - __all__ = ["TOKENIZER_EXCEPTIONS", "STOP_WORDS", "TOKENIZER_PREFIXES", "TOKENIZER_SUFFIXES", "TOKENIZER_INFIXES"] diff --git a/spacy/hu/punctuation.py b/spacy/hu/punctuation.py index e28052fd3..945cc170e 100644 --- a/spacy/hu/punctuation.py +++ b/spacy/hu/punctuation.py @@ -1,25 +1,41 @@ # encoding: utf8 from __future__ import unicode_literals -from ..language_data.punctuation import ALPHA, ALPHA_LOWER, ALPHA_UPPER, LIST_ELLIPSES +from ..language_data.punctuation import ALPHA_LOWER, LIST_ELLIPSES, QUOTES, ALPHA_UPPER, LIST_QUOTES, UNITS, \ + CURRENCY, LIST_PUNCT, ALPHA, _QUOTES +CURRENCY_SYMBOLS = r"\$ ¢ £ € ¥ ฿" -TOKENIZER_SUFFIXES = [ - r'(?<=[{al})])-e'.format(al=ALPHA_LOWER) -] +TOKENIZER_PREFIXES = ( + [r'\+'] + + LIST_PUNCT + + LIST_ELLIPSES + + LIST_QUOTES +) -TOKENIZER_INFIXES = [ - r'(?<=[0-9])-(?=[0-9])', - r'(?<=[0-9])[+\-\*/^](?=[0-9])', - r'(?<=[{a}])--(?=[{a}])', - r'(?<=[{a}]),(?=[{a}])'.format(a=ALPHA), - r'(?<=[{al}])\.(?=[{au}])'.format(al=ALPHA_LOWER, au=ALPHA_UPPER), - r'(?<=[0-9{a}])"(?=[\-{a}])'.format(a=ALPHA), - r'(?<=[{a}"])[:<>=](?=[{a}])'.format(a=ALPHA) -] +TOKENIZER_SUFFIXES = ( + LIST_PUNCT + + LIST_ELLIPSES + + LIST_QUOTES + + [ + r'(?<=[0-9])\+', + 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) + ] +) - -TOKENIZER_INFIXES += LIST_ELLIPSES - - -__all__ = ["TOKENIZER_SUFFIXES", "TOKENIZER_INFIXES"] +TOKENIZER_INFIXES = ( + LIST_ELLIPSES + + [ + r'(?<=[{al}])\.(?=[{au}])'.format(al=ALPHA_LOWER, au=ALPHA_UPPER), + r'(?<=[{a}]),(?=[{a}])'.format(a=ALPHA), + 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"] diff --git a/spacy/hu/tokenizer_exceptions.py b/spacy/hu/tokenizer_exceptions.py index 46122564c..f1fb99469 100644 --- a/spacy/hu/tokenizer_exceptions.py +++ b/spacy/hu/tokenizer_exceptions.py @@ -1,9 +1,17 @@ # encoding: utf8 from __future__ import unicode_literals +import re + +from spacy.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. @@ -13,57 +21,103 @@ 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. @@ -71,45 +125,77 @@ 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. @@ -119,11 +205,13 @@ ag. agit. alez. alk. +all. altbgy. an. ang. arch. at. +atc. aug. b.a. b.s. @@ -161,6 +249,7 @@ dikt. dipl. dj. dk. +dl. dny. dolg. dr. @@ -184,6 +273,7 @@ eü. f.h. f.é. fam. +fb. febr. fej. felv. @@ -211,6 +301,7 @@ gazd. gimn. gk. gkv. +gmk. gondn. gr. grav. @@ -240,6 +331,7 @@ hőm. i.e. i.sz. id. +ie. ifj. ig. igh. @@ -254,6 +346,7 @@ io. ip. ir. irod. +irod. isk. ism. izr. @@ -261,6 +354,7 @@ iá. jan. jav. jegyz. +jgmk. jjv. jkv. jogh. @@ -271,6 +365,7 @@ júl. jún. karb. kat. +kath. kb. kcs. kd. @@ -285,6 +380,8 @@ kiv. kk. kkt. klin. +km. +korm. kp. krt. kt. @@ -318,6 +415,7 @@ m.s. m.sc. ma. mat. +max. mb. med. megh. @@ -353,6 +451,7 @@ nat. nb. neg. nk. +no. nov. nu. ny. @@ -362,6 +461,7 @@ nyug. obj. okl. okt. +old. olv. orsz. ort. @@ -372,6 +472,8 @@ pg. ph.d ph.d. phd. +phil. +pjt. pk. pl. plb. @@ -406,6 +508,7 @@ röv. s.b. s.k. sa. +sb. sel. sgt. sm. @@ -413,6 +516,7 @@ st. stat. stb. strat. +stud. sz. szakm. szaksz. @@ -467,6 +571,7 @@ vb. vegy. vh. vhol. +vhr. vill. vizsg. vk. @@ -478,13 +583,20 @@ vs. vsz. vv. vál. +várm. vízv. vö. zrt. zs. +Á. +Áe. +Áht. +É. +Épt. Ész. Új-Z. ÚjZ. +Ún. á. ált. ápr. @@ -500,6 +612,7 @@ zs. ötk. özv. ú. +ú.n. úm. ún. út. @@ -510,7 +623,6 @@ zs. ümk. ütk. üv. -ő. ű. őrgy. őrpk. @@ -520,3 +632,17 @@ zs. OTHER_EXC = """ -e """.strip().split() + +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 +) + +TOKEN_MATCH = re.compile("^({u})|({n})$".format(u=_URL_PATTERN, n=NUMS)).match diff --git a/spacy/language_data/punctuation.py b/spacy/language_data/punctuation.py index 8b92922f8..e08065e5a 100644 --- a/spacy/language_data/punctuation.py +++ b/spacy/language_data/punctuation.py @@ -57,14 +57,14 @@ LIST_PUNCT = list(_PUNCT.strip().split()) LIST_HYPHENS = list(_HYPHENS.strip().split()) -ALPHA_LOWER = _ALPHA_LOWER.strip().replace(' ', '') -ALPHA_UPPER = _ALPHA_UPPER.strip().replace(' ', '') +ALPHA_LOWER = _ALPHA_LOWER.strip().replace(' ', '').replace('\n', '') +ALPHA_UPPER = _ALPHA_UPPER.strip().replace(' ', '').replace('\n', '') ALPHA = ALPHA_LOWER + ALPHA_UPPER QUOTES = _QUOTES.strip().replace(' ', '|') CURRENCY = _CURRENCY.strip().replace(' ', '|') -UNITS = _UNITS.strip().replace(' ', '|') +UNITS = _UNITS.strip().replace(' ', '|').replace('\n', '|') HYPHENS = _HYPHENS.strip().replace(' ', '|') diff --git a/spacy/tests/hu/test_tokenizer.py b/spacy/tests/hu/test_tokenizer.py index 0b76da0c6..bfb80992b 100644 --- a/spacy/tests/hu/test_tokenizer.py +++ b/spacy/tests/hu/test_tokenizer.py @@ -3,7 +3,6 @@ from __future__ import unicode_literals import pytest - DEFAULT_TESTS = [ ('N. kormányzósági\nszékhely.', ['N.', 'kormányzósági', 'székhely', '.']), ('A .hu egy tld.', ['A', '.hu', 'egy', 'tld', '.']), @@ -24,23 +23,27 @@ DEFAULT_TESTS = [ HYPHEN_TESTS = [ ('Egy -nak, -jaiért, -magyar, bel- van.', ['Egy', '-nak', ',', '-jaiért', ',', '-magyar', ',', 'bel-', 'van', '.']), + ('Szabolcs-Szatmár-Bereg megye', ['Szabolcs-Szatmár-Bereg', 'megye']), ('Egy -nak.', ['Egy', '-nak', '.']), ('Egy bel-.', ['Egy', 'bel-', '.']), ('Dinnye-domb-.', ['Dinnye-domb-', '.']), ('Ezen -e elcsatangolt.', ['Ezen', '-e', 'elcsatangolt', '.']), ('Lakik-e', ['Lakik', '-e']), + ('A--B', ['A', '--', 'B']), ('Lakik-e?', ['Lakik', '-e', '?']), ('Lakik-e.', ['Lakik', '-e', '.']), ('Lakik-e...', ['Lakik', '-e', '...']), ('Lakik-e... van.', ['Lakik', '-e', '...', 'van', '.']), ('Lakik-e van?', ['Lakik', '-e', 'van', '?']), ('Lakik-elem van?', ['Lakik-elem', 'van', '?']), + ('Az életbiztosításáról- egy.', ['Az', 'életbiztosításáról-', 'egy', '.']), ('Van lakik-elem.', ['Van', 'lakik-elem', '.']), ('A 7-es busz?', ['A', '7-es', 'busz', '?']), ('A 7-es?', ['A', '7-es', '?']), ('A 7-es.', ['A', '7-es', '.']), ('Ez (lakik)-e?', ['Ez', '(', 'lakik', ')', '-e', '?']), ('A %-sal.', ['A', '%-sal', '.']), + ('A $-sal.', ['A', '$-sal', '.']), ('A CD-ROM-okrol.', ['A', 'CD-ROM-okrol', '.']) ] @@ -89,11 +92,15 @@ NUMBER_TESTS = [ ('A -23,12 van.', ['A', '-23,12', 'van', '.']), ('A -23,12-ben van.', ['A', '-23,12-ben', 'van', '.']), ('A -23,12-ben.', ['A', '-23,12-ben', '.']), - ('A 2+3 van.', ['A', '2', '+', '3', 'van', '.']), - ('A 2 +3 van.', ['A', '2', '+', '3', 'van', '.']), + ('A 2+3 van.', ['A', '2+3', 'van', '.']), + ('A 2<3 van.', ['A', '2<3', 'van', '.']), + ('A 2=3 van.', ['A', '2=3', 'van', '.']), + ('A 2÷3 van.', ['A', '2÷3', 'van', '.']), + ('A 1=(2÷3)-2/5 van.', ['A', '1=(2÷3)-2/5', 'van', '.']), + ('A 2 +3 van.', ['A', '2', '+3', 'van', '.']), ('A 2+ 3 van.', ['A', '2', '+', '3', 'van', '.']), ('A 2 + 3 van.', ['A', '2', '+', '3', 'van', '.']), - ('A 2*3 van.', ['A', '2', '*', '3', 'van', '.']), + ('A 2*3 van.', ['A', '2*3', 'van', '.']), ('A 2 *3 van.', ['A', '2', '*', '3', 'van', '.']), ('A 2* 3 van.', ['A', '2', '*', '3', 'van', '.']), ('A 2 * 3 van.', ['A', '2', '*', '3', 'van', '.']), @@ -141,7 +148,8 @@ NUMBER_TESTS = [ ('A 15.-ben.', ['A', '15.-ben', '.']), ('A 2002--2003. van.', ['A', '2002--2003.', 'van', '.']), ('A 2002--2003-ben van.', ['A', '2002--2003-ben', 'van', '.']), - ('A 2002--2003-ben.', ['A', '2002--2003-ben', '.']), + ('A 2002-2003-ben.', ['A', '2002-2003-ben', '.']), + ('A +0,99% van.', ['A', '+0,99%', 'van', '.']), ('A -0,99% van.', ['A', '-0,99%', 'van', '.']), ('A -0,99%-ben van.', ['A', '-0,99%-ben', 'van', '.']), ('A -0,99%.', ['A', '-0,99%', '.']), @@ -194,23 +202,33 @@ NUMBER_TESTS = [ ('A III/c-ben.', ['A', 'III/c-ben', '.']), ('A TU–154 van.', ['A', 'TU–154', 'van', '.']), ('A TU–154-ben van.', ['A', 'TU–154-ben', 'van', '.']), - ('A TU–154-ben.', ['A', 'TU–154-ben', '.']) + ('A TU–154-ben.', ['A', 'TU–154-ben', '.']), + ('A 5cm³', ['A', '5', 'cm³']), + ('A 5 $-ban', ['A', '5', '$-ban']), + ('A 5$-ban', ['A', '5$-ban']), + ('A 5$.', ['A', '5', '$', '.']), + ('A 5$', ['A', '5', '$']), + ('A $5', ['A', '$5']), + ('A 5km/h', ['A', '5', 'km/h']), + ('A 75%+1-100%-ig', ['A', '75%+1-100%-ig']), + ('A 5km/h.', ['A', '5', 'km/h', '.']), + ('3434/1992. évi elszámolás', ['3434/1992.', 'évi', 'elszámolás']), ] QUOTE_TESTS = [ ('Az "Ime, hat"-ban irja.', ['Az', '"', 'Ime', ',', 'hat', '"', '-ban', 'irja', '.']), ('"Ime, hat"-ban irja.', ['"', 'Ime', ',', 'hat', '"', '-ban', 'irja', '.']), ('Az "Ime, hat".', ['Az', '"', 'Ime', ',', 'hat', '"', '.']), - ('Egy 24"-os monitor.', ['Egy', '24', '"', '-os', 'monitor', '.']), - ("A don't van.", ['A', "don't", 'van', '.']) + ('Egy 24"-os monitor.', ['Egy', '24"-os', 'monitor', '.']), + ("A McDonald's van.", ['A', "McDonald's", 'van', '.']) ] DOT_TESTS = [ ('N. kormányzósági\nszékhely.', ['N.', 'kormányzósági', 'székhely', '.']), ('A .hu egy tld.', ['A', '.hu', 'egy', 'tld', '.']), ('Az egy.ketto pelda.', ['Az', 'egy.ketto', 'pelda', '.']), - ('A pl. rovidites.', ['A', 'pl.', 'rovidites', '.']), - ('A S.M.A.R.T. szo.', ['A', 'S.M.A.R.T.', 'szo', '.']), + ('A pl. rövidítés.', ['A', 'pl.', 'rövidítés', '.']), + ('A S.M.A.R.T. szó.', ['A', 'S.M.A.R.T.', 'szó', '.']), ('A .hu.', ['A', '.hu', '.']), ('Az egy.ketto.', ['Az', 'egy.ketto', '.']), ('A pl.', ['A', 'pl.']), @@ -223,8 +241,19 @@ DOT_TESTS = [ ('Valami ... más.', ['Valami', '...', 'más', '.']) ] +WIKI_TESTS = [ + ('!"', ['!', '"']), + ('lány"a', ['lány', '"', 'a']), + ('lány"a', ['lány', '"', 'a']), + ('!"-lel', ['!', '"', '-lel']), + ('""-sorozat ', ['"', '"', '-sorozat']), + ('"(Köszönöm', ['"', '(', 'Köszönöm']), + ('(törvénykönyv)-ben ', ['(', 'törvénykönyv', ')', '-ben']), + ('"(...)"–sokkal ', ['"', '(', '...', ')', '"', '–sokkal']), + ('cérium(IV)-oxid', ['cérium', '(', 'IV', ')', '-oxid']) +] -TESTCASES = DEFAULT_TESTS + DOT_TESTS + QUOTE_TESTS # + NUMBER_TESTS + HYPHEN_TESTS +TESTCASES = DEFAULT_TESTS + DOT_TESTS + QUOTE_TESTS + NUMBER_TESTS + HYPHEN_TESTS + WIKI_TESTS @pytest.mark.parametrize('text,expected_tokens', TESTCASES)