spaCy:tokenizer_exceptions的NORM部分是什么?

时间:2017-09-23 07:13:17

标签: python nlp tokenize spacy

我为我的语言添加tokenizer_exceptions。我正在查看'gonna'英语语言的示例,因此编写规则如下:

'т.п.': [
    {ORTH: "т.", NORM: "тому", LEMMA: "тот"},
    {ORTH: "п.", NORM: "подобное", LEMMA: "подобный"}
],

然后,当我进行标记时,我希望NORM - 部分规则将在token.norm_中(尽管没有关于Token.norm_的任何文档)。但相反,我看到ORTH - 部分在token.norm_而在token - 实例中没有任何地方我可以看到NORM - 规则的一部分。

那么什么是Token.norm_ - 成员和什么是NORM - tokenizer_exceptions的一部分 - 规则?

2 个答案:

答案 0 :(得分:2)

更一般地回答这个问题:在spaCy v1.x中,NORM主要用于提供"标准化"令牌的形式,例如,如果令牌文本是"则不完整" (例如在gonna示例中)或替代拼写。 v1.x中规范的主要目的是使其可以作为.norm_属性访问,以供将来参考。

但是,在v2.x currently in alpha中,NORM属性变得更具相关性,因为它也用作模型中的一项功能。这使您可以将具有不同拼写的单词标准化为一个常见拼写,并确保这些单词接收相似的表示 - 即使其中一个单词在训练数据中较不频繁。这方面的例子是美式英语和英式英语拼写,或货币符号,它们都被标准化为$。为了简化这一过程,v2.0引入了一个新的语言数据组件norm exceptions

如果您正在使用自己的语言模型,我绝对建议您查看v2.0 alpha(现在非常接近第一个候选版本)。

答案 1 :(得分:1)

您可以绑定nlp.vocab.lex_attr_getters中的任何函数,并为该词条表项计算它。每个标记都包含一个指向其词汇表项的指针,因此它们都将引用此计算值。

import spacy
from spacy.attrs import NORM

nlp = spacy.blank('ru') # In spacy 1, just spacy.load() here.

doc = nlp(u'a a b c b')

[(w.norm_, w.text) for w in doc]
# (a, a), (a, a), (b, b), (c, c), (b, b)

nlp.vocab.lex_attr_getters[NORM] = lambda string: string.upper()
# This part should be done automatically, but isn't yet.
for lexeme in nlp.vocab:
    lexeme.norm_ = nlp.vocab.lex_attr_getters[NORM](lexeme.orth_)
[(w.norm_, w.text) for w in doc]
# (a, A), (a, A), (b, B), (c, C), (b, B)

您可以将这些词法属性绑定到您想要的任何内容。我不确定绑定对俄语是如何工作的,但您可以在源代码中更改它,或者只是在运行时通过重置词法属性函数来更改它。