spacy 中空白模型和预训练模型之间的差异

Ole*_*kyi 4 python text-classification 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_)
Run Code Online (Sandbox Code Playgroud)

它给了我以下结果:

你好你好假INTJ

每个人每个人真正的PRON

, , 假 PUNCT

it-PRON- 真正的 PRON

是真正的 AUX

aa 真实 DET

精彩 精彩 假 ADJ

假名词

今天 今天 假名词

然后我尝试了这个(对于相同的文本)

nlp2 = spacy.blank('en')
for token in nlp2(text):
    print(token.text, token.lemma_, token.is_stop, token.pos_)
Run Code Online (Sandbox Code Playgroud)

结果是

你好你好假

每个人每个人真实

, , 错误的

it-PRON- 真正的 PRON

是的 是真的

精彩 精彩 错误

日 日 假

今天 今天 假

不仅结果不同(例如,引理 for's不同),而且空白模型中的大多数单词也没有词性标记。

显然我需要一个预训练模型来标准化我的数据。但我仍然不明白我的数据分类器应该如何。我应该 1) 创建一个用于训练文本分类器的空白模型(使用nlp.update())并加载用于删除停用词、词形还原和词性标记的预训练模型,还是 2) 只加载用于规范化和训练我的文本分类器的预训练模型?

预先感谢您的任何建议!

aab*_*aab 7

如果您使用 spacy 的文本分类器,那么从空白模型开始就可以了。它TextCategorizer不使用任何其他管道组件的功能。

\n\n

如果您使用 spacy 为另一个文本分类器预处理数据,那么您需要确定哪些组件对您的任务有意义。预训练模型默认加载标记器、解析器和 NER 模型。

\n\n

词形还原器不是作为单独的组件实现的,它是其中最复杂的部分。它试图利用可用的数据和模型提供最佳结果:

\n\n
    \n
  • 如果您没有spacy-lookups-data安装该软件包并创建了一个空白模型,您将获得小写形式作为默认/虚拟引理。

  • \n
  • 如果您安装了该软件包spacy-lookups-data并创建了一个空白模型,它将自动加载查找引理(如果它们适用于该语言)。

  • \n
  • 如果加载提供的模型并且管道包含标记器,则词形还原器会切换到更好的基于规则的词形还原器(如果 spacy 中有该语言可用)(当前:希腊语、英语、法语、挪威语 Bokm\xc3\xa5l、荷兰语、瑞典)。提供的模型还始终包含该语言的查找数据,以便在标记器未运行时可以使用它们。

  • \n
\n\n

如果您想从提供的模型中获取查找引理,您可以通过加载不带标记器的模型来查看它们:

\n\n
import spacy\nnlp = spacy.load("en_core_web_sm", disable=["tagger"])\n
Run Code Online (Sandbox Code Playgroud)\n\n

一般来说,查找引理质量不是很好(没有信息可以帮助解决不明确的情况),基于规则的引理会好很多,但是运行标记器确实需要额外的时间,因此您可以选择如果质量足以满足您的任务,则查找引理可以加快速度。

\n\n

如果您不使用解析器或 NER 模型进行预处理,您可以通过禁用它们来加快速度:

\n\n
nlp = spacy.load("en_core_web_sm", disable=["ner", "parser"])\n
Run Code Online (Sandbox Code Playgroud)\n