Отметьте уже токенизированную строку с помощью spaCy - PullRequest
0 голосов
/ 02 октября 2018

Чтобы провести сопоставимое исследование, я работаю с данными, которые уже были токенизированы (не с простыми).Мне нужно использовать эти токены в качестве входных данных, чтобы обеспечить работу с одними и теми же данными по всем направлениям.Я хочу передать эти токены в tagger, но следующее не получается:

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, в сочетании с информацией из документации , но безрезультатно:

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 голосов
/ 02 октября 2018

Вам нужно использовать альтернативный способ конструирования документа напрямую, используя класс 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)
...