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的新手,非常感谢。谢谢!
答案 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
。