我正在向'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”被识别为后缀(我想这也会发生,即使我没有添加规则)
有什么问题吗?我该怎么做?
1条答案
按热度按时间vu8f3i0k1#
tokenizer算法不是递归的。它先查找前缀和后缀,然后查找中缀,然后停止。在拆分中缀后,它不再查找前缀和后缀。算法的完整描述:https://spacy.io/usage/linguistic-features#how-tokenizer-works
如果像
kg
这样的单位很容易根据上下文区分,一个选择是将它们添加为中缀,但需要注意与非单位用法的混淆,例如“ginkgo”与“3kg/x”。另一个选择是编写一个自定义组件,使用retokenizer(https://spacy.io/usage/linguistic-features#retokenization)来后处理标记化,这样更灵活,可以处理标记化算法不支持的情况。