【问题标题】:Difference between blank and pretrained models in spacyspacy中空白模型和预训练模型之间的区别
【发布时间】:2020-07-08 07:28:30
【问题描述】:

我目前正在尝试使用 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_)

它给了我以下结果:

你好你好假INTJ

每个人都真正的代名词

, , 假打孔

它 -PRON- 真正的 PRON

是真正的辅助

一个真正的 DET

精彩绝伦的 False ADJ

day 假名词

tod​​ay today 假名词

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

nlp2 = spacy.blank('en')
for token in nlp2(text):
    print(token.text, token.lemma_, token.is_stop, token.pos_)

结果是

你好你好假

每个人都是真的

, , 错误

它 -PRON- 真正的 PRON

是真的

真的

精彩绝伦的假

一天一天假

今天今天假

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

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

提前感谢您的任何建议!

【问题讨论】:

    标签: python spacy text-classification


    【解决方案1】:

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

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

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

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

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

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

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

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

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

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

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

    【讨论】:

    • 感谢您的回答!总结一下:如果我想通过以下预处理步骤(删除停用词、使用词形还原和删除某些词性)为德语构建文本分类模型,我应该创建一个空白模型进行训练并加载一个预训练的模型进行预处理?但我也应该在这个预训练模型中禁用 NER 组件并安装查找表?对吗?
    • 只有在速度成为问题时才真正需要禁用某些东西。如果您使用 spacy 的 TextCategorizer,我会先尝试,无需任何预处理。它不需要任何预处理,我不确定这种预处理(德国查找词形还原器不是很好)是否会有所帮助。 (不过,它可能用于特定任务。我真的不知道,因为我从未将它用于任何预处理。)
    • 问题是我有超过 1500 万篇德语文章和 21 个类别。所以它的工作非常缓慢。不使用预处理时精度也更差。现在(使用我在之前评论中描述的步骤)我的准确率等于 57%。如果没有词形还原,它小于 40%。也许一些建议我还能做些什么来改进我的模型?
    • Spacy 的TextCategorizer 主要用于更小的数据集。我们通常建议使用 Vowpal Wabbit 之类的东西。当然,您可能仍想使用 spacy 进行预处理。
    猜你喜欢
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    相关资源
    最近更新 更多