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