TextCategorizer.predict 如何与 spaCy 一起工作?
How does TextCategorizer.predict work with spaCy?
我一直在关注文本分类的 spaCy 快速入门指南。
假设我有一个非常简单的数据集。
TRAIN_DATA = [
("beef", {"cats": {"POSITIVE": 1.0, "NEGATIVE": 0.0}}),
("apple", {"cats": {"POSITIVE": 0, "NEGATIVE": 1}})
]
我正在训练管道对文本进行分类。它训练并且损失率低。
textcat = nlp.create_pipe("pytt_textcat", config={"exclusive_classes": True})
for label in ("POSITIVE", "NEGATIVE"):
textcat.add_label(label)
nlp.add_pipe(textcat)
optimizer = nlp.resume_training()
for i in range(10):
random.shuffle(TRAIN_DATA)
losses = {}
for batch in minibatch(TRAIN_DATA, size=8):
texts, cats = zip(*batch)
nlp.update(texts, cats, sgd=optimizer, losses=losses)
print(i, losses)
现在,我如何预测新的文本字符串是 "POSITIVE" 还是 "NEGATIVE"?
这会起作用:
doc = nlp(u'Pork')
print(doc.cats)
它为我们训练预测的每个类别给出分数。
但这似乎与文档不一致。 It says I should use a predict
method 在原始子类管道组件上。
虽然那行不通。
尝试textcat.predict('text')
或textcat.predict(['text'])
等。抛出:
AttributeError Traceback (most recent call last)
<ipython-input-29-39e0c6e34fd8> in <module>
----> 1 textcat.predict(['text'])
pipes.pyx in spacy.pipeline.pipes.TextCategorizer.predict()
AttributeError: 'str' object has no attribute 'tensor'
管道组件的 predict
方法实际上需要 Doc
作为输入,因此您需要执行类似 textcat.predict(nlp(text))
的操作。那里使用的 nlp
不一定有 textcat
组件。然后需要将该调用的结果输入到对 set_annotations()
的调用中,如 here.
所示
但是,您的第一种方法就可以了:
...
nlp.add_pipe(textcat)
...
doc = nlp(u'Pork')
print(doc.cats)
...
在内部,当调用nlp(text)
时,首先会生成text
的Doc
,然后每个管道组件,一个接一个,运行它的predict
方法 Doc
并继续使用 set_annotations
向其添加信息。最终 textcat
组件将定义 Doc
.
的 cats
变量
您为另一种方法引用的 API 文档,让您看看 "under the hood"。所以它们并不是真正相互冲突的方法 ;-)
我一直在关注文本分类的 spaCy 快速入门指南。
假设我有一个非常简单的数据集。
TRAIN_DATA = [
("beef", {"cats": {"POSITIVE": 1.0, "NEGATIVE": 0.0}}),
("apple", {"cats": {"POSITIVE": 0, "NEGATIVE": 1}})
]
我正在训练管道对文本进行分类。它训练并且损失率低。
textcat = nlp.create_pipe("pytt_textcat", config={"exclusive_classes": True})
for label in ("POSITIVE", "NEGATIVE"):
textcat.add_label(label)
nlp.add_pipe(textcat)
optimizer = nlp.resume_training()
for i in range(10):
random.shuffle(TRAIN_DATA)
losses = {}
for batch in minibatch(TRAIN_DATA, size=8):
texts, cats = zip(*batch)
nlp.update(texts, cats, sgd=optimizer, losses=losses)
print(i, losses)
现在,我如何预测新的文本字符串是 "POSITIVE" 还是 "NEGATIVE"?
这会起作用:
doc = nlp(u'Pork')
print(doc.cats)
它为我们训练预测的每个类别给出分数。
但这似乎与文档不一致。 It says I should use a predict
method 在原始子类管道组件上。
虽然那行不通。
尝试textcat.predict('text')
或textcat.predict(['text'])
等。抛出:
AttributeError Traceback (most recent call last)
<ipython-input-29-39e0c6e34fd8> in <module>
----> 1 textcat.predict(['text'])
pipes.pyx in spacy.pipeline.pipes.TextCategorizer.predict()
AttributeError: 'str' object has no attribute 'tensor'
管道组件的 predict
方法实际上需要 Doc
作为输入,因此您需要执行类似 textcat.predict(nlp(text))
的操作。那里使用的 nlp
不一定有 textcat
组件。然后需要将该调用的结果输入到对 set_annotations()
的调用中,如 here.
但是,您的第一种方法就可以了:
...
nlp.add_pipe(textcat)
...
doc = nlp(u'Pork')
print(doc.cats)
...
在内部,当调用nlp(text)
时,首先会生成text
的Doc
,然后每个管道组件,一个接一个,运行它的predict
方法 Doc
并继续使用 set_annotations
向其添加信息。最终 textcat
组件将定义 Doc
.
cats
变量
您为另一种方法引用的 API 文档,让您看看 "under the hood"。所以它们并不是真正相互冲突的方法 ;-)