Improve Lithuanian tokenization (#5205)

* Improve Lithuanian tokenization

Modify Lithuanian tokenization to improve performance for
UD_Lithuanian-ALKSNIS.

* Update Lithuanian tokenizer tests
This commit is contained in:
adrianeboyd 2020-03-25 11:28:12 +01:00 committed by GitHub
parent 1a944e5976
commit 86c43e55fa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 296 additions and 260 deletions

View File

@ -1,6 +1,7 @@
# coding: utf8 # coding: utf8
from __future__ import unicode_literals from __future__ import unicode_literals
from .punctuation import TOKENIZER_INFIXES, TOKENIZER_SUFFIXES
from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS
from .stop_words import STOP_WORDS from .stop_words import STOP_WORDS
from .lex_attrs import LEX_ATTRS from .lex_attrs import LEX_ATTRS
@ -26,7 +27,11 @@ class LithuanianDefaults(Language.Defaults):
) )
lex_attr_getters.update(LEX_ATTRS) lex_attr_getters.update(LEX_ATTRS)
tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) infixes = TOKENIZER_INFIXES
suffixes = TOKENIZER_SUFFIXES
mod_base_exceptions = {exc: val for exc, val in BASE_EXCEPTIONS.items() if not exc.endswith(".")}
del mod_base_exceptions["8)"]
tokenizer_exceptions = update_exc(mod_base_exceptions, TOKENIZER_EXCEPTIONS)
stop_words = STOP_WORDS stop_words = STOP_WORDS
tag_map = TAG_MAP tag_map = TAG_MAP
morph_rules = MORPH_RULES morph_rules = MORPH_RULES

View File

@ -0,0 +1,29 @@
# coding: utf8
from __future__ import unicode_literals
from ..char_classes import LIST_ICONS, LIST_ELLIPSES
from ..char_classes import CONCAT_QUOTES, ALPHA_LOWER, ALPHA_UPPER, ALPHA
from ..char_classes import HYPHENS
from ..punctuation import TOKENIZER_SUFFIXES
_infixes = (
LIST_ELLIPSES
+ LIST_ICONS
+ [
r"(?<=[0-9])[+\*^](?=[0-9-])",
r"(?<=[{al}{q}])\.(?=[{au}{q}])".format(
al=ALPHA_LOWER, au=ALPHA_UPPER, q=CONCAT_QUOTES
),
r"(?<=[{a}]),(?=[{a}])".format(a=ALPHA),
r"(?<=[{a}])(?:{h})(?=[{a}])".format(a=ALPHA, h=HYPHENS),
r"(?<=[{a}0-9])[:<>=/](?=[{a}])".format(a=ALPHA),
]
)
_suffixes = ["\."] + list(TOKENIZER_SUFFIXES)
TOKENIZER_INFIXES = _infixes
TOKENIZER_SUFFIXES = _suffixes

View File

@ -6,262 +6,264 @@ from ...symbols import ORTH
_exc = {} _exc = {}
for orth in [ for orth in [
"G.", "n-tosios",
"J. E.", "?!",
"J. Em.", # "G.",
"J.E.", # "J. E.",
"J.Em.", # "J. Em.",
"K.", # "J.E.",
"N.", # "J.Em.",
"V.", # "K.",
"Vt.", # "N.",
"a.", # "V.",
"a.k.", # "Vt.",
"a.s.", # "a.",
"adv.", # "a.k.",
"akad.", # "a.s.",
"aklg.", # "adv.",
"akt.", # "akad.",
"al.", # "aklg.",
"ang.", # "akt.",
"angl.", # "al.",
"aps.", # "ang.",
"apskr.", # "angl.",
"apyg.", # "aps.",
"arbat.", # "apskr.",
"asist.", # "apyg.",
"asm.", # "arbat.",
"asm.k.", # "asist.",
"asmv.", # "asm.",
"atk.", # "asm.k.",
"atsak.", # "asmv.",
"atsisk.", # "atk.",
"atsisk.sąsk.", # "atsak.",
"atv.", # "atsisk.",
"aut.", # "atsisk.sąsk.",
"avd.", # "atv.",
"b.k.", # "aut.",
"baud.", # "avd.",
"biol.", # "b.k.",
"bkl.", # "baud.",
"bot.", # "biol.",
"bt.", # "bkl.",
"buv.", # "bot.",
"ch.", # "bt.",
"chem.", # "buv.",
"corp.", # "ch.",
"d.", # "chem.",
"dab.", # "corp.",
"dail.", # "d.",
"dek.", # "dab.",
"deš.", # "dail.",
"dir.", # "dek.",
"dirig.", # "deš.",
"doc.", # "dir.",
"dol.", # "dirig.",
"dr.", # "doc.",
"drp.", # "dol.",
"dvit.", # "dr.",
"dėst.", # "drp.",
"dš.", # "dvit.",
"dž.", # "dėst.",
"e.b.", # "dš.",
"e.bankas", # "dž.",
"e.p.", # "e.b.",
"e.parašas", # "e.bankas",
"e.paštas", # "e.p.",
"e.v.", # "e.parašas",
"e.valdžia", # "e.paštas",
"egz.", # "e.v.",
"eil.", # "e.valdžia",
"ekon.", # "egz.",
"el.", # "eil.",
"el.bankas", # "ekon.",
"el.p.", # "el.",
"el.parašas", # "el.bankas",
"el.paštas", # "el.p.",
"el.valdžia", # "el.parašas",
"etc.", # "el.paštas",
"ež.", # "el.valdžia",
"fak.", # "etc.",
"faks.", # "ež.",
"feat.", # "fak.",
"filol.", # "faks.",
"filos.", # "feat.",
"g.", # "filol.",
"gen.", # "filos.",
"geol.", # "g.",
"gerb.", # "gen.",
"gim.", # "geol.",
"gr.", # "gerb.",
"gv.", # "gim.",
"gyd.", # "gr.",
"gyv.", # "gv.",
"habil.", # "gyd.",
"inc.", # "gyv.",
"insp.", # "habil.",
"inž.", # "inc.",
"ir pan.", # "insp.",
"ir t. t.", # "inž.",
"isp.", # "ir pan.",
"istor.", # "ir t. t.",
"it.", # "isp.",
"just.", # "istor.",
"k.", # "it.",
"k. a.", # "just.",
"k.a.", # "k.",
"kab.", # "k. a.",
"kand.", # "k.a.",
"kart.", # "kab.",
"kat.", # "kand.",
"ketv.", # "kart.",
"kh.", # "kat.",
"kl.", # "ketv.",
"kln.", # "kh.",
"km.", # "kl.",
"kn.", # "kln.",
"koresp.", # "km.",
"kpt.", # "kn.",
"kr.", # "koresp.",
"kt.", # "kpt.",
"kub.", # "kr.",
"kun.", # "kt.",
"kv.", # "kub.",
"kyš.", # "kun.",
"l. e. p.", # "kv.",
"l.e.p.", # "kyš.",
"lenk.", # "l. e. p.",
"liet.", # "l.e.p.",
"lot.", # "lenk.",
"lt.", # "liet.",
"ltd.", # "lot.",
"ltn.", # "lt.",
"m.", # "ltd.",
"m.e..", # "ltn.",
"m.m.", # "m.",
"mat.", # "m.e..",
"med.", # "m.m.",
"mgnt.", # "mat.",
"mgr.", # "med.",
"min.", # "mgnt.",
"mjr.", # "mgr.",
"ml.", # "min.",
"mln.", # "mjr.",
"mlrd.", # "ml.",
"mob.", # "mln.",
"mok.", # "mlrd.",
"moksl.", # "mob.",
"mokyt.", # "mok.",
"mot.", # "moksl.",
"mr.", # "mokyt.",
"mst.", # "mot.",
"mstl.", # "mr.",
"mėn.", # "mst.",
"nkt.", # "mstl.",
"no.", # "mėn.",
"nr.", # "nkt.",
"ntk.", # "no.",
"nuotr.", # "nr.",
"op.", # "ntk.",
"org.", # "nuotr.",
"orig.", # "op.",
"p.", # "org.",
"p.d.", # "orig.",
"p.m.e.", # "p.",
"p.s.", # "p.d.",
"pab.", # "p.m.e.",
"pan.", # "p.s.",
"past.", # "pab.",
"pav.", # "pan.",
"pavad.", # "past.",
"per.", # "pav.",
"perd.", # "pavad.",
"pirm.", # "per.",
"pl.", # "perd.",
"plg.", # "pirm.",
"plk.", # "pl.",
"pr.", # "plg.",
"pr.Kr.", # "plk.",
"pranc.", # "pr.",
"proc.", # "pr.Kr.",
"prof.", # "pranc.",
"prom.", # "proc.",
"prot.", # "prof.",
"psl.", # "prom.",
"pss.", # "prot.",
"pvz.", # "psl.",
"pšt.", # "pss.",
"r.", # "pvz.",
"raj.", # "pšt.",
"red.", # "r.",
"rez.", # "raj.",
"rež.", # "red.",
"rus.", # "rez.",
"rš.", # "rež.",
"s.", # "rus.",
"sav.", # "rš.",
"saviv.", # "s.",
"sek.", # "sav.",
"sekr.", # "saviv.",
"sen.", # "sek.",
"sh.", # "sekr.",
"sk.", # "sen.",
"skg.", # "sh.",
"skv.", # "sk.",
"skyr.", # "skg.",
"sp.", # "skv.",
"spec.", # "skyr.",
"sr.", # "sp.",
"st.", # "spec.",
"str.", # "sr.",
"stud.", # "st.",
"sąs.", # "str.",
"t.", # "stud.",
"t. p.", # "sąs.",
"t. y.", # "t.",
"t.p.", # "t. p.",
"t.t.", # "t. y.",
"t.y.", # "t.p.",
"techn.", # "t.t.",
"tel.", # "t.y.",
"teol.", # "techn.",
"th.", # "tel.",
"tir.", # "teol.",
"trit.", # "th.",
"trln.", # "tir.",
"tšk.", # "trit.",
"tūks.", # "trln.",
"tūkst.", # "tšk.",
"up.", # "tūks.",
"upl.", # "tūkst.",
"v.s.", # "up.",
"vad.", # "upl.",
"val.", # "v.s.",
"valg.", # "vad.",
"ved.", # "val.",
"vert.", # "valg.",
"vet.", # "ved.",
"vid.", # "vert.",
"virš.", # "vet.",
"vlsč.", # "vid.",
"vnt.", # "virš.",
"vok.", # "vlsč.",
"vs.", # "vnt.",
"vtv.", # "vok.",
"vv.", # "vs.",
"vyr.", # "vtv.",
"vyresn.", # "vv.",
"zool.", # "vyr.",
"Įn", # "vyresn.",
"įl.", # "zool.",
"š.m.", # "Įn",
"šnek.", # "įl.",
"šv.", # "š.m.",
"švč.", # "šnek.",
"ž.ū.", # "šv.",
"žin.", # "švč.",
"žml.", # "ž.ū.",
"žr.", # "žin.",
# "žml.",
# "žr.",
]: ]:
_exc[orth] = [{ORTH: orth}] _exc[orth] = [{ORTH: orth}]

View File

@ -15,11 +15,11 @@ def test_lt_tokenizer_handles_long_text(lt_tokenizer):
[ [
( (
"177R Parodų rūmaiOzo g. nuo vasario 18 d. bus skelbiamas interneto tinklalapyje.", "177R Parodų rūmaiOzo g. nuo vasario 18 d. bus skelbiamas interneto tinklalapyje.",
15, 17,
), ),
( (
"ISM universiteto doc. dr. Ieva Augutytė-Kvedaravičienė pastebi, kad tyrimais nustatyti elgesio pokyčiai.", "ISM universiteto doc. dr. Ieva Augutytė-Kvedaravičienė pastebi, kad tyrimais nustatyti elgesio pokyčiai.",
16, 18,
), ),
], ],
) )
@ -31,7 +31,7 @@ def test_lt_tokenizer_handles_punct_abbrev(lt_tokenizer, text, length):
@pytest.mark.parametrize("text", ["km.", "pvz.", "biol."]) @pytest.mark.parametrize("text", ["km.", "pvz.", "biol."])
def test_lt_tokenizer_abbrev_exceptions(lt_tokenizer, text): def test_lt_tokenizer_abbrev_exceptions(lt_tokenizer, text):
tokens = lt_tokenizer(text) tokens = lt_tokenizer(text)
assert len(tokens) == 1 assert len(tokens) == 2
@pytest.mark.parametrize( @pytest.mark.parametrize(