regex Python空间自定义标记化器后缀和中缀问题

vohkndzv  于 2022-11-18  发布在  Python
关注(0)|答案(1)|浏览(138)

我正在向'en_core_web_sm' spaCy nlp模型的标记器添加规则,以正确标记下面的字符串:s = "This string M=20kg/H=200mm"转换为标记['This','string','M =','20','kg','/','H =','200','mm']但是使用'/'作为中缀,并在中缀之前使用'kg'作为后缀会使情况复杂化。如何制定正确的标记化规则?
这是我的代码:

import spacy
nlp = spacy.load('en_core_web_sm')
s = "This string M=20kg/H=200mm"
# Update suffix search 
from spacy.lang.char_classes import UNITS
unit_suffix_regex = r"(?<=[\d])({u})".format(u=UNITS)
suffixes = nlp.Defaults.suffixes
suffixes.append(unit_suffix_regex)
suffix_regex = spacy.util.compile_suffix_regex(suffixes)
nlp.tokenizer.suffix_search = suffix_regex.search

但它仍然给出错误的结果,并将上面的字符串标记为:

('TOKEN', 'This')
('TOKEN', 'string')
('TOKEN', 'M=20kg')
('INFIX', '/')
('TOKEN', 'H=200')
('SUFFIX', 'mm')

如果我将s修改为s = "This string M=20kg /H=200mm",则会得到以下输出:

('TOKEN', 'This')
('TOKEN', 'string')
('TOKEN', 'M=20')
('SUFFIX', 'kg')
('TOKEN', '/H=200')
('SUFFIX', 'mm')

“kg”被识别为后缀(我想这也会发生,即使我没有添加规则)
有什么问题吗?我该怎么做?

vu8f3i0k

vu8f3i0k1#

tokenizer算法不是递归的。它先查找前缀和后缀,然后查找中缀,然后停止。在拆分中缀后,它不再查找前缀和后缀。算法的完整描述:https://spacy.io/usage/linguistic-features#how-tokenizer-works
如果像kg这样的单位很容易根据上下文区分,一个选择是将它们添加为中缀,但需要注意与非单位用法的混淆,例如“ginkgo”与“3kg/x”。
另一个选择是编写一个自定义组件,使用retokenizer(https://spacy.io/usage/linguistic-features#retokenization)来后处理标记化,这样更灵活,可以处理标记化算法不支持的情况。

相关问题