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

时间:2020-03-27 14:28:18

标签: python spacy text-classification

我目前正在尝试使用spacy训练文本分类器,但遇到以下问题:使用spacy.blank('en')创建空白模型与使用预先训练的模型{{1}有什么区别? }。只是为了看看我编写这段代码的不同之处:

spacy.load('en_core_web_sm')

它给了我以下结果:

你好你好假INTJ

每个人都是真正的PRON

,,“错误插入”

it -PRON- True PRON

是True AUX

一个真实的DET

精彩绝妙的错误ADJ

day day False NOUN

今天今天是假名词

然后我尝试了此操作(相同的文字)

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_)

结果是

你好你好

每个人都对

,,错误

it -PRON- True PRON

的真

一个真实的

精彩绝妙的错误

day day False

今天今天错了

不仅结果不同(例如nlp2 = spacy.blank('en') for token in nlp2(text): print(token.text, token.lemma_, token.is_stop, token.pos_) 的引理不同),而且空白模型中的大多数单词也没有POS标记。

因此,显然,我需要一个预训练的模型来标准化我的数据。但是我仍然不明白我的数据分类器应该如何。我应该1)创建用于训练文本分类器的空白模型(使用's)并加载用于去除停用词,词形化和POS标记的预训练模型还是2)仅对以下两者均加载预训练模型:规范化和训练我的文本分类器?

提前感谢您的任何建议!

1 个答案:

答案 0 :(得分:3)

如果您正在使用spacy的文本分类器,则可以从空白模型开始。 TextCategorizer不使用任何其他管道组件中的功能。

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

不是作为单独组件实现的lemmatizer是其中最复杂的部分。它尝试通过可用的数据和模型来提供最佳结果:

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

  • 如果您安装了软件包spacy-lookups-data并创建了一个空白模型,它将自动加载查找词条(如果该语言可用)。

  • 如果您加载提供的模型,并且管道中包含标记器,则lemmatizer会切换到更好的基于规则的lemmatizer,前提是该语言有大量可用的语言(当前:希腊文,英文,法文,挪威文荷兰文,瑞典文)。提供的模型还始终包含该语言的查找数据,因此可以在不运行标记器时使用它们。

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

import spacy
nlp = spacy.load("en_core_web_sm", disable=["tagger"])

通常,查找引文质量不是很好(没有信息可帮助解决不明确的情况),基于规则的引理会好很多,但是运行标记器需要花费更多时间,因此您可以选择如果质量足以胜任您的任务,则查找引理可以加快处理速度。

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

nlp = spacy.load("en_core_web_sm", disable=["ner", "parser"])