如何在spaCy的norm_exceptions.py模块中添加自定义俚语?

时间:2018-03-26 13:56:02

标签: nlp spacy

SpaCy的文档提供了有关添加新俚语here的一些信息。

但是,我想知道:

(1)我什么时候应该拨打以下功能?

lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], NORM_EXCEPTIONS, BASE_NORMS)

根据介绍指南here,spaCy的典型用法如下:

import spacy
nlp = spacy.load('en')
# Should I call the function add_lookups(...) here?
doc = nlp(u'Apple is looking at buying U.K. startup for $1 billion')

(2)在处理管道中处理规范异常时是什么?

我假设一个典型的管道:tokenizer - > tagger - >解析器 - > NER。

是否在令牌化器之前处理了范数异常?此外,规范异常组件如何组织其他预处理组件,如停用词,词形变换器(参见组件的完整列表here)?什么出现在什么之前?

是spaCy的新手,非常感谢。谢谢!

1 个答案:

答案 0 :(得分:0)

规范异常是语言数据的一部分,属性getter(接受文本并返回规范的函数)是用语言类初始化的,例如: English。您可以看到此here的示例。这一切都发生在之前甚至构造了管道。

这里的假设是规范异常通常是特定于语言的,因此应该在语言数据中定义,而与处理流程无关。规范也是词汇属性,因此它们的获取者依赖于词汇中的词汇上下文词条(与语句相反,这是上下文中的单词)。

然而,关于token.norm_的好处是它可写 - 所以您可以轻松添加custom pipeline component,在您自己的词典中查找令牌的文字,并在必要时覆盖规范:

def add_custom_norms(doc):
    for token in doc:
        if token.text in YOUR_NORM_DICT:
            token.norm_ = YOUR_NORM_DICT[token.text]
    return doc

nlp.add_pipe(add_custom_norms, last=True)

请注意,NORM属性也用作模型中的功能,因此根据您要添加或覆盖的规范,您可能只希望在<<>之后应用自定义组件 / em>调用标记器,解析器或实体识别器。

例如,默认情况下,spaCy会将所有货币符号规范化为"$",以确保它们都接收到类似的表示形式,即使其中一个在训练数据中较不频繁。如果您的自定义组件现在用"€"覆盖"Euro",这也会对模型的预测产生影响。因此,您可能会看到MONEY实体的预测不太准确。

如果您正在计划培训自己的模型,并考虑您的自定义规范,您可能需要考虑实现自定义语言子类。或者,如果您认为默认情况下您要添加的俚语术语应包含在spaCy中,则您始终可以提交pull request,例如英语norm_exceptions.py