【问题标题】:Use spacy on pretokenized text在预标记文本上使用 spacy
【发布时间】:2019-11-30 11:55:22
【问题描述】:
我想使用 spacy 来处理已经预先标记化的文本。将令牌列表解析为 spacy 不起作用。
import spacy
nlp = spacy.load("en_core_web_sm")
nlp(["This", "is", "a", "sentence"])
这给出了一个 TypeError(这是有道理的):
TypeError: Argument 'string' has incorrect type (expected str, got list)
我可以用自定义的标记器替换标记器,但我觉得这会使事情变得过于复杂并且不是首选方式。
感谢您的帮助:D
【问题讨论】:
标签:
python
tokenize
spacy
【解决方案1】:
你可以使用这个方法:
tokens = ["This", "is", "a", "sentence"]
sentence = nlp.tokenizer.tokens_from_list(tokens)
print(sentence)
This is a sentence
【解决方案2】:
如果你使用:
sentence = nlp.tokenizer.tokens_from_list(tokens) 使用 spacy.matcher / Matcher 你会得到错误:
尝试使用 nlp() 代替 nlp.make_doc() 或 list(nlp.pipe())
列表的(nlp.tokenizer.pipe())。
我解决它的方法:我在 for 循环中遍历每个项目:
from spacy.matcher import Matcher
matcher = Matcher(nlp.vocab)
pattern = [{'LEMMA': 'sentence', 'POS': 'NOUN'}]
matcher.add('Searched Word', None, pattern)
X = ["Sentence one", "Sentence two", "Sentence three", "sentence last !"]
for i in X.index:
doc = nlp(X[i])
matches = matcher(doc)
for match_id, start, end in matches:
matched_span = doc[start:end]
print(matched_span.text)
一个更好的方法是使用 nlp.pipe:
for doc in nlp.pipe(X):
print([token.text for token in doc])
也有利于更快的算法运行和更高效的文本处理。
希望这会有所帮助。谢谢你。
【解决方案3】:
从 spaCy 3.0+ 开始,nlp.tokenizer.tokens_from_list() 已被弃用。请改用Doc 对象。
import spacy
from spacy.tokens import Doc
nlp = spacy.load("en_core_web_sm")
sent = ["This", "is", "a", "sentence"]
doc = Doc(nlp.vocab, sent)
for token in nlp(doc):
print(token.text, token.pos_)