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)时,首先会生成textDoc,然后每个管道组件,一个接一个,运行它的predict 方法 Doc 并继续使用 set_annotations 向其添加信息。最终 textcat 组件将定义 Doc.

cats 变量

您为另一种方法引用的 API 文档,让您看看 "under the hood"。所以它们并不是真正相互冲突的方法 ;-)