Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 文本分类的训练空间_Python_Spacy - Fatal编程技术网

Python 文本分类的训练空间

Python 文本分类的训练空间,python,spacy,Python,Spacy,在阅读和完成之后,我想我应该做一个小的演示。结果我的模特不想训练。这是密码 import spacy import random import json TRAINING_DATA = [ ["My little kitty is so special", {"KAT": True}], ["Dude, Totally, Yeah, Video Games", {"KAT": False}], ["Should I pay $1,000 for the iPhone X

在阅读和完成之后,我想我应该做一个小的演示。结果我的模特不想训练。这是密码

import spacy
import random
import json

TRAINING_DATA = [
    ["My little kitty is so special", {"KAT": True}],
    ["Dude, Totally, Yeah, Video Games", {"KAT": False}],
    ["Should I pay $1,000 for the iPhone X?", {"KAT": False}],
    ["The iPhone 8 reviews are here", {"KAT": False}],
    ["Noa is a great cat name.", {"KAT": True}],
    ["We got a new kitten!", {"KAT": True}]
]

nlp = spacy.blank("en")
category = nlp.create_pipe("textcat")
nlp.add_pipe(category)
category.add_label("KAT")

# Start the training
nlp.begin_training()

# Loop for 10 iterations
for itn in range(100):
    # Shuffle the training data
    random.shuffle(TRAINING_DATA)
    losses = {}

    # Batch the examples and iterate over them
    for batch in spacy.util.minibatch(TRAINING_DATA, size=2):
        texts = [text for text, entities in batch]
        annotations = [{"textcat": [entities]} for text, entities in batch]
        nlp.update(texts, annotations, losses=losses)
    if itn % 20 == 0:
        print(losses)
当我运行这个程序时,输出结果表明所学到的东西很少

{'textcat': 0.0}
{'textcat': 0.0}
{'textcat': 0.0}
{'textcat': 0.0}
{'textcat': 0.0}
这感觉不对。应该有错误或有意义的标记。预测证实了这一点

对于训练数据中的文本,d:
打印(文本,nlp(文本).cats)
#哥们,完全,是的,电子游戏{'KAT':0.45303162932395935}
#iPhone8评论如下{'KAT':0.45303162932395935}
#诺亚是一个很好的猫名。{'KAT':0.45303162932395935}
#我应该为iPhone X支付1000美元吗?{'KAT':0.45303162932395935}
#我们有了一只新小猫!{'KAT':0.45303162932395935}
#我的小猫很特别{'KAT':0.45303162932395935}

感觉我的代码缺少了一些东西,但我不知道是什么

根据Ines的评论,这是答案

导入空间
随机输入
导入json
培训数据=[
[“我的小猫太特别了”{“凯特”:真的}],
[“老兄,完全,是的,电子游戏”{“凯特”:错},
[“我应该为iPhone X支付1000美元吗?”,{“KAT”:False},
[“iPhone8评论在这里,{“KAT”:False}],
[“诺亚是一个伟大的猫名。”,{“凯特”:真的},
[“我们有一只新小猫!”,{“凯特”:真的}]
]
nlp=空间空白(“en”)
类别=nlp。创建管道(“文本猫”)
类别。添加标签(“KAT”)
nlp.添加_管道(类别)
#开始训练
nlp.begin_培训()
#循环10次迭代
对于范围(100)内的itn:
#洗牌训练数据
随机洗牌(训练数据)
损失={}
#对示例进行批处理并迭代
对于spacy.util.minibatch中的批(训练数据,大小=1):
文本=[nlp(文本)用于文本,批量中的实体]
注释=[{“猫”:实体}文本,成批实体]
nlp.update(文本、注释、损失=损失)
如果itn%20==0:
打印(损失)

如果您更新并使用spaCy 3-上述代码将不再有效。解决方案是通过一些更改进行迁移。我已经相应地修改了示例

更改摘要:

  • 使用配置更改体系结构。旧的默认值是“单词袋”,新的默认值是“文本集合”,它使用注意力。在调整模型时请记住这一点
  • 标签现在需要一个热编码
  • 添加管道
    界面略有更改
  • nlp.update
    现在需要一个
    示例
    对象,而不是
    文本的元组
    注释
导入空间
#例如,添加导入以及textcat配置。。。
从spacy.training导入示例
从spacy.pipeline.textcat导入单标签、单标签、默认配置
从thinc.api导入配置
随机输入
#标签应该是热编码的
培训数据=[
[“我的小猫很特别”,{“KAT0”:真的}],
[“哥们,完全,是的,电子游戏”{“KAT1”:真的}],
[“我应该为iPhone X支付1000美元吗?”,{“KAT1”:True},
[“iPhone8评论在此,{“KAT1”:True}],
[“诺亚是一个伟大的猫名。”,{“KAT0”:真的},
[“我们有一只新小猫!”,{“KAT0”:真的}]
]
#鞠躬
#config=config()。来自\u str(单\u标签\u船首\u配置)
#全神贯注
config=config()。来自\u str(单个\u标签\u默认\u配置)
nlp=空间空白(“en”)
#现在改为使用“添加管道”
类别=nlp.add_管道(“textcat”,last=True)
类别。添加标签(“KAT0”)
类别。添加标签(“KAT1”)
#开始训练
nlp.begin_培训()
#循环10次迭代
对于范围(100)内的itn:
#洗牌训练数据
随机洗牌(训练数据)
损失={}
#对示例进行批处理并迭代
对于spacy.util.minibatch中的批(训练数据,大小=4):
text=[nlp.make_doc(text)for text,批量实体]
注释=[{“猫”:实体}文本,成批实体]
#使用示例对象而不是文本/注释元组
examples=[Example.from_dict(doc,annotation)for doc,annotation in zip(
文本、注释
)]
nlp.update(示例,损失=损失)
如果itn%20==0:
打印(损失)

他们使用了2000个示例。你确定机器学习可以用6个例子吗?你的三个猫的例子都用不同的词来形容猫。我从10个不同的例子开始,一只猫只有一个单词。当然,但textcat类别报告的是零损失,这不应该是这样。您的训练循环和数据看起来是正确的——我想我发现了问题:尝试将
{“textcat”:[entities]}
更改为
{“cats”:entities}
(如果您正在传递注释的dict,那么也将查找预期的键)。当您更新文本分类器时,它将查找一个键
“cats”
–但不存在,只有
“textcat”
。因此,您基本上是在不使用任何内容更新文本分类器,并且只使用随机初始化的权重(由nlp产生。开始培训)。