Nlp 如何在spaCy';s norm_exceptions.py模块?

Nlp 如何在spaCy';s norm_exceptions.py模块?,nlp,spacy,Nlp,Spacy,SpaCy的文档中有一些关于添加新俚语的信息 但是,我想知道: (1)何时调用以下函数? lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], NORM_EXCEPTIONS, BASE_NORMS) 根据介绍指南,spaCy的典型用法如下: import spacy nlp = spacy.load('en') # Should I call the function add_lookup

SpaCy的文档中有一些关于添加新俚语的信息

但是,我想知道:

(1)何时调用以下函数?

lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], NORM_EXCEPTIONS, BASE_NORMS)
根据介绍指南,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)在处理管道中何时处理正常异常?

lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], NORM_EXCEPTIONS, BASE_NORMS)
我假设一个典型的管道是这样的:标记器->标记器->解析器->分析器

是否在标记器之前处理规范异常?另外,norm异常组件相对于其他预处理组件(如stop words、lemmatizer)是如何组织的(请参阅完整的组件列表)?什么先于什么



我是spaCy的新手,非常感谢您的帮助。谢谢

规范异常是语言数据的一部分,属性getter(获取文本并返回规范的函数)由语言类初始化,例如
English
。你可以看到一个例子。这一切都发生在管道建设之前

这里的假设是,规范异常通常是特定于语言的,因此应该在语言数据中定义,独立于处理管道。规范也是词汇属性,因此它们的getter依赖于底层的lexeme,即词汇表中不区分上下文的条目(与token相反,token是上下文中的单词)

但是,
token.norm
的优点在于它是可写的,因此您可以轻松添加一个在自己的字典中查找令牌文本的函数,并在必要时覆盖norm:

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
属性也用作模型中的功能,因此根据要添加或覆盖的规范,您可能只希望在调用标记器、解析器或实体识别器后应用自定义组件

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


如果你计划训练你自己的模型,考虑到你的自定义规范,你可能想考虑实现一个自定义语言子类。或者,如果您认为您想要添加的俚语术语在默认情况下应该包含在spaCy中,您可以始终提交一个,例如提交给英语。

Tks,以获得最佳答案和快速回复!实现自定义语言子类似乎是合适的,因为在我的例子中,语言的使用是特定于行业和国家的。我将按照以下步骤训练我自己的word2vec模型。在训练过程中,在训练单词向量之前,单词是否会首先被标准化(例如“cos”->“因为”)?我想按照您在货币符号上给出的示例,首先对一些单词进行规范化,使它们具有相同的向量/表示形式,尽管它们具有不同的
值.spacy(2.0.18):“spacy.tokens.token.token”对象的属性“norm”不可写