我定制了带有其他规则和前缀的spaCy Tokenizer
,将w/
和f/
分别视为with
和for
。前缀正确地将它们分割开了,但是在这种情况下,没有应用引理和规范的自定义规则。
这是代码的摘录。
def create_tokenizer(nlp):
rules = dict(nlp.Defaults.tokenizer_exceptions)
rules.update({
'w/': [{ORTH: 'w/', LEMMA: 'with', NORM: 'with'}],
'W/': [{ORTH: 'W/', LEMMA: 'with', NORM: 'with'}],
'f/': [{ORTH: 'f/', LEMMA: 'for', NORM: 'for'}],
'F/': [{ORTH: 'F/', LEMMA: 'for', NORM: 'for'}],
})
custom_prefixes = (
r"[wW]/",
r"[fF]/",
)
prefix_re = spacy.util.compile_prefix_regex(nlp.Defaults.prefixes + custom_prefixes)
return Tokenizer(
nlp.vocab,
rules=rules,
prefix_search=prefix_re.search,
)
这是结果。
>>> doc = nlp("This w/ that")
>>> doc[1]
w/
>>> doc[1].norm_
'with'
>>> doc = nlp("This w/that")
>>> doc[1]
w/
>>> doc[1].norm_
'w/'
在This w/that
的情况下,w/
被拆分,但是没有应用自定义规则(即NORM
是w/
(with
)。我该怎么做才能将自定义规则应用于通过前缀/中缀/后缀分隔的令牌?
答案 0 :(得分:2)
不幸的是,无法将前缀和后缀也作为spacy v2中的异常进行分析。为了支持这种情况,在即将发布的spacy v3版本中将更一般地处理Tokenizer异常,但是我不知道何时发布该版本。
我认为您在spacy v2中可以做的最好的事情就是拥有一个快速的后处理组件,该组件可以将引理/范数分配给单个标记(如果它们与orth模式匹配)。