如何将自定义俚语添加到 spaCy 的 norm_exceptions.py 模块中?
How to add custom slangs into spaCy's norm_exceptions.py module?
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 billion')
(2) 在处理管道中什么时候处理规范异常?
我假设一个典型的管道是这样的:tokenizer -> tagger -> parser -> ner。
是否在分词器之前处理了规范异常?而且,规范异常组件相对于其他预处理组件(例如停用词、词形还原器(请参阅组件的完整列表 here)是如何组织的?什么先于什么?
我是 spaCy 的新手,非常感谢您的帮助。谢谢!
规范异常是语言数据的一部分,属性 getter(接受文本和 returns 规范的函数)用语言 class 初始化,例如English
。您可以查看此 here 的示例。这一切都发生在 之前 管道甚至已经建成。
这里的假设是规范异常通常是 language-specific,因此应该在语言数据中定义,独立于处理管道。规范也是词汇属性,因此它们的 getter 存在于潜在的词素上,即词汇表中的 context-insensitive 条目(与标记相反,标记是上下文中的词)。
然而,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
属性也用作模型中的一个特征,因此根据您要添加或覆盖的规范,您可能只想应用自定义组件 在之后调用标记器、解析器或实体识别器。
例如,默认情况下,spaCy 将所有货币符号标准化为 "$"
以确保它们都接收到相似的表示,即使其中一个在训练数据中出现频率较低。如果您的自定义组件现在用 "Euro"
覆盖 "€"
,这也会对模型的预测产生影响。因此,您可能会看到 MONEY
个实体的预测不太准确。
如果您计划训练自己的模型并考虑您的自定义规范,您可能需要考虑实施自定义语言子class。或者,如果您认为您要添加的俚语应该默认包含在 spaCy 中,您可以随时提交 pull request, for example to the English norm_exceptions.py
.
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 billion')
(2) 在处理管道中什么时候处理规范异常?
我假设一个典型的管道是这样的:tokenizer -> tagger -> parser -> ner。
是否在分词器之前处理了规范异常?而且,规范异常组件相对于其他预处理组件(例如停用词、词形还原器(请参阅组件的完整列表 here)是如何组织的?什么先于什么?
我是 spaCy 的新手,非常感谢您的帮助。谢谢!
规范异常是语言数据的一部分,属性 getter(接受文本和 returns 规范的函数)用语言 class 初始化,例如English
。您可以查看此 here 的示例。这一切都发生在 之前 管道甚至已经建成。
这里的假设是规范异常通常是 language-specific,因此应该在语言数据中定义,独立于处理管道。规范也是词汇属性,因此它们的 getter 存在于潜在的词素上,即词汇表中的 context-insensitive 条目(与标记相反,标记是上下文中的词)。
然而,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
属性也用作模型中的一个特征,因此根据您要添加或覆盖的规范,您可能只想应用自定义组件 在之后调用标记器、解析器或实体识别器。
例如,默认情况下,spaCy 将所有货币符号标准化为 "$"
以确保它们都接收到相似的表示,即使其中一个在训练数据中出现频率较低。如果您的自定义组件现在用 "Euro"
覆盖 "€"
,这也会对模型的预测产生影响。因此,您可能会看到 MONEY
个实体的预测不太准确。
如果您计划训练自己的模型并考虑您的自定义规范,您可能需要考虑实施自定义语言子class。或者,如果您认为您要添加的俚语应该默认包含在 spaCy 中,您可以随时提交 pull request, for example to the English norm_exceptions.py
.