我想使用此代码将n't
转换为not
:
doc = nlp(u"this. isn't ad-versere")
special_case = [{ORTH: u"not"}]
nlp.tokenizer.add_special_case(u"n't",specia_case)
print [text.orth_ for text in doc]
但我得到的输出为:
[u'this', u'.', u'is', u"n't", u'ad', u'-', u'versere']
n't
仍然是n't
如何解决问题?
您的逻辑不起作用的原因是因为spaCy使用非破坏性标记化。这意味着它将始终保留对原始输入文本的引用,并且您永远不会丢失任何信息。
使用tokenizer异常和特殊情况可以定义如何将一串文本拆分为一系列标记的规则 - 但它们不允许您修改原始字符串。标记加空格的ORTH
值始终需要与原始文本匹配。因此,标记器可以将"isn't"
拆分为["is", "n't"]
,但不能拆分为["is", "not"]
。
要定义字符串的“规范化”形式,spaCy使用NORM
属性,可用token.norm_
。您可以在tokenizer异常here的来源中看到这一点 - 令牌"n't"
的标准是"not"
。 NORM
属性也用作模型中的特征,以确保具有相同规范的令牌接收相似的表示(即使训练数据中的一个比另一个更频繁)。
因此,如果您对规范化表单感兴趣,则可以简单地使用norm_
属性:
>>> [t.norm_ for t in doc]
['this', '.', 'is', 'not', 'ad', '-', 'versere']