spacy 中空白模型和预训练模型之间的区别
Difference between blank and pretrained models in spacy
我目前正在尝试使用 spacy
训练文本分类器,但我遇到了以下问题:使用 spacy.blank('en')
创建空白模型与使用预训练模型 spacy.load('en_core_web_sm')
。只是为了看看我写这段代码的区别:
text = "hello everyone, it's a wonderful day today"
nlp1 = spacy.load('en_core_web_sm')
for token in nlp1(text):
print(token.text, token.lemma_, token.is_stop, token.pos_)
它给了我以下结果:
hello hello False INTJ
everyone everyone True PRON
, , False PUNCT
it -PRON- True PRON
's be True AUX
a a True DET
wonderful wonderful False ADJ
day day False NOUN
today today False NOUN
然后我尝试了这个(对于相同的文本)
nlp2 = spacy.blank('en')
for token in nlp2(text):
print(token.text, token.lemma_, token.is_stop, token.pos_)
结果是
hello hello False
everyone everyone True
, , False
it -PRON- True PRON
's 's True
a a True
wonderful wonderful False
day day False
today today False
不仅结果不同(例如,'s
的引理不同),而且空白模型中的大多数单词也没有词性标注。
很明显,我需要一个预训练模型来规范化我的数据。但我仍然不明白我的数据分类器应该如何处理。我应该 1) 创建一个空白模型来训练文本分类器(使用 nlp.update()
)并加载一个预训练模型来删除停用词、词形还原和 POS 标记,还是 2)只加载一个预训练模型用于:规范化和训练我的文本分类器?
提前感谢您的任何建议!
如果您使用的是 spacy 的文本分类器,那么从空白模型开始就可以了。 TextCategorizer
不使用任何其他管道组件的功能。
如果您使用 spacy 为另一个文本分类器预处理数据,那么您需要确定哪些组件对您的任务有意义。预训练模型默认加载标记器、解析器和 NER 模型。
未作为单独组件实现的词形还原器是其中最复杂的部分。它尝试使用可用数据和模型提供最佳结果:
如果您没有安装软件包 spacy-lookups-data
并且创建了一个空白模型,您将获得小写形式作为 default/dummy 引理。
如果您安装了软件包 spacy-lookups-data
并创建了一个空白模型,它会自动加载适用于该语言的查找词条。
如果您加载提供的模型并且管道包含标记器,则词形还原器会切换到更好的基于规则的词形还原器,前提是该语言(当前:希腊语、英语、法语)在 spacy 中可用、挪威博克马尔语、荷兰语、瑞典语)。提供的模型还始终包含该语言的查找数据,因此可以在标记器不是 运行.
时使用它们
如果您想从提供的模型中获取查找引理,您可以通过加载不带标注器的模型来查看它们:
import spacy
nlp = spacy.load("en_core_web_sm", disable=["tagger"])
总的来说,查找引理的质量不是很好(没有信息可以帮助处理模棱两可的情况),基于规则的引理会好很多,但是 运行标记器,因此如果质量足以完成您的任务,您可以选择查找引理来加快速度。
如果您不使用解析器或 NER 模型进行预处理,您可以通过禁用它们来加快速度:
nlp = spacy.load("en_core_web_sm", disable=["ner", "parser"])
我目前正在尝试使用 spacy
训练文本分类器,但我遇到了以下问题:使用 spacy.blank('en')
创建空白模型与使用预训练模型 spacy.load('en_core_web_sm')
。只是为了看看我写这段代码的区别:
text = "hello everyone, it's a wonderful day today"
nlp1 = spacy.load('en_core_web_sm')
for token in nlp1(text):
print(token.text, token.lemma_, token.is_stop, token.pos_)
它给了我以下结果:
hello hello False INTJ
everyone everyone True PRON
, , False PUNCT
it -PRON- True PRON
's be True AUX
a a True DET
wonderful wonderful False ADJ
day day False NOUN
today today False NOUN
然后我尝试了这个(对于相同的文本)
nlp2 = spacy.blank('en')
for token in nlp2(text):
print(token.text, token.lemma_, token.is_stop, token.pos_)
结果是
hello hello False
everyone everyone True
, , False
it -PRON- True PRON
's 's True
a a True
wonderful wonderful False
day day False
today today False
不仅结果不同(例如,'s
的引理不同),而且空白模型中的大多数单词也没有词性标注。
很明显,我需要一个预训练模型来规范化我的数据。但我仍然不明白我的数据分类器应该如何处理。我应该 1) 创建一个空白模型来训练文本分类器(使用 nlp.update()
)并加载一个预训练模型来删除停用词、词形还原和 POS 标记,还是 2)只加载一个预训练模型用于:规范化和训练我的文本分类器?
提前感谢您的任何建议!
如果您使用的是 spacy 的文本分类器,那么从空白模型开始就可以了。 TextCategorizer
不使用任何其他管道组件的功能。
如果您使用 spacy 为另一个文本分类器预处理数据,那么您需要确定哪些组件对您的任务有意义。预训练模型默认加载标记器、解析器和 NER 模型。
未作为单独组件实现的词形还原器是其中最复杂的部分。它尝试使用可用数据和模型提供最佳结果:
如果您没有安装软件包
spacy-lookups-data
并且创建了一个空白模型,您将获得小写形式作为 default/dummy 引理。如果您安装了软件包
spacy-lookups-data
并创建了一个空白模型,它会自动加载适用于该语言的查找词条。如果您加载提供的模型并且管道包含标记器,则词形还原器会切换到更好的基于规则的词形还原器,前提是该语言(当前:希腊语、英语、法语)在 spacy 中可用、挪威博克马尔语、荷兰语、瑞典语)。提供的模型还始终包含该语言的查找数据,因此可以在标记器不是 运行.
时使用它们
如果您想从提供的模型中获取查找引理,您可以通过加载不带标注器的模型来查看它们:
import spacy
nlp = spacy.load("en_core_web_sm", disable=["tagger"])
总的来说,查找引理的质量不是很好(没有信息可以帮助处理模棱两可的情况),基于规则的引理会好很多,但是 运行标记器,因此如果质量足以完成您的任务,您可以选择查找引理来加快速度。
如果您不使用解析器或 NER 模型进行预处理,您可以通过禁用它们来加快速度:
nlp = spacy.load("en_core_web_sm", disable=["ner", "parser"])