【问题标题】:Tag an already tokenised string with spaCy用 spaCy 标记一个已经标记化的字符串
【发布时间】:2018-10-02 13:28:29
【问题描述】:

为了进行可比较的研究,我正在处理已经标记化的数据(而不是 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)

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

我正在寻找一种向标记器提供标记列表的方法。 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'

【问题讨论】:

    标签: python python-3.x nlp spacy


    【解决方案1】:

    您需要使用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)
    

    【讨论】:

    • 非常感谢您的回复。不幸的是,这对我不起作用。我编辑了我的 OP,向您展示了我尝试过的代码以及它返回的错误。有什么想法吗?
    • 我不确定你从哪里得到其余的代码,这不是加载 spacy 的常用方法。我将用更多代码编辑我的示例。
    • 非常感谢!我从文档中获得了示例代码,但也许我错误地实现了它。非常感谢!
    • @BramVanroy 最初的示例不起作用,因为您只创建了英语语言类 (nlp = English()),没有加载任何统计模型,然后创建了一个没有任何统计模型的空标记器数据可用且其权重未初始化。如果没有模型权重,标注器将无法为您的Doc 分配任何标签。不过,spaCy 在这里可能会更优雅地失败!
    • 对上面代码的一个小补充:除了使用nlp.taggernlp.parser,您还可以使用nlp.get_pipe方法获取管道组件,例如tagger = nlp.get_pipe('tagger')。这更明确一点,因为您告诉 spaCy 您想要模型管道中存在的具有 此确切名称pipeline component。结果与通过nlp.tagger 相同,但我通常建议使用更明确的语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    相关资源
    最近更新 更多