我目前正在尝试使用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)仅对以下两者均加载预训练模型:规范化和训练我的文本分类器?
提前感谢您的任何建议!
答案 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"])