使用spaCy

时间:2018-10-02 13:28:30

标签: python python-3.x nlp spacy

为了进行可比较的研究,我正在使用已被标记化的数据(不带有伪造性)。我需要将这些令牌用作输入,以确保我在整个系统中使用相同的数据。我希望将这些令牌提供给spaCy的标记器,但是以下操作失败:

import spacy

nlp = spacy.load('en', disable=['tokenizer', 'parser', 'ner', 'textcat'])
sent = ['I', 'like', 'yellow', 'bananas']

doc = nlp(sent)

for i in doc:
    print(i)

具有以下痕迹

Traceback (most recent call last):
  File "C:/Users/bmvroy/.PyCharm2018.2/config/scratches/scratch_6.py", line 6, in <module>
    doc = nlp(sent)
  File "C:\Users\bmvroy\venv\lib\site-packages\spacy\language.py", line 346, in __call__
    doc = self.make_doc(text)
  File "C:\Users\bmvroy\venv\lib\site-packages\spacy\language.py", line 378, in make_doc
    return self.tokenizer(text)
TypeError: Argument 'string' has incorrect type (expected str, got list)

首先,我不确定为什么我在load()语句中禁用了标记化程序时,spaCy为何尝试对输入进行标记化。其次,显然这不是要走的路。

我正在寻找一种向标记器提供令牌列表的方法。 spaCy有可能吗?


我尝试了@aab提供的解决方案,并结合了the documentation的信息,但无济于事:

from spacy.tokens import Doc
from spacy.lang.en import English
from spacy.pipeline import Tagger

nlp = English()
tagger = Tagger(nlp.vocab)

words = ['Listen', 'up', '.']
spaces = [True, False, False]

doc = Doc(nlp.vocab, words=words, spaces=spaces)
processed = tagger(doc)
print(processed)

此代码未运行,并出现以下错误:

    processed = tagger(doc)
  File "pipeline.pyx", line 426, in spacy.pipeline.Tagger.__call__
  File "pipeline.pyx", line 438, in spacy.pipeline.Tagger.predict
AttributeError: 'bool' object has no attribute 'tok2vec'

1 个答案:

答案 0 :(得分:2)

您需要使用通过Doc类直接构建文档的另一种方法。这是他们的文档(https://spacy.io/api/doc)中的示例:

from spacy.tokens import Doc
doc = Doc(nlp.vocab, words=[u'hello', u'world', u'!'], spaces=[True, False, False])

spaces参数(每个标记后面是否都有空格)是可选的。

然后,您可以运行所需的组件,因此整个过程看起来像这样:

import spacy
from spacy.tokens import Doc

nlp = spacy.load('en')
doc = Doc(nlp.vocab, words=[u'hello', u'world', u'!'], spaces=[True, False, False])

nlp.tagger(doc)
nlp.parser(doc)

for t in doc:
    print(t.text, t.pos_, t.tag_, t.dep_, t.head)