Spacy tokenizer不添加异常

问题描述 投票:1回答:1

我想使用此代码将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
1个回答
3
投票

您的逻辑不起作用的原因是因为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']
© www.soinside.com 2019 - 2024. All rights reserved.