是否可以对已标记化的输入使用spacy?
问题内容:
我有一句话已经被标记成单词。我想为句子中的每个单词获取语音标签的一部分。当我查看SpaCy中的文档时,我意识到它始于原始句子。我不想这样做,因为在这种情况下,spacy可能会以不同的标记化结束。因此,我想知道是否可以将spaCy与单词列表(而不是字符串)一起使用?
这是关于我的问题的示例:
# I know that it does the following sucessfully :
import spacy
nlp = spacy.load('en_core_web_sm')
raw_text = 'Hello, world.'
doc = nlp(raw_text)
for token in doc:
print(token.pos_)
但是我想做类似以下的事情:
import spacy
nlp = spacy.load('en_core_web_sm')
tokenized_text = ['Hello',',','world','.']
doc = nlp(tokenized_text)
for token in doc:
print(token.pos_)
我知道这是行不通的,但是有可能做类似的事情吗?
问题答案:
您可以通过使用自己的替换spaCy的默认令牌生成器来做到这一点:
nlp.tokenizer = custom_tokenizer
其中custom_tokenizer
的函数将原始文本作为输入并返回一个Doc
对象。
您未指定如何获取令牌列表。如果您已经有一个使用原始文本并返回令牌列表的函数,则对其进行一些小的更改:
def custom_tokenizer(text):
tokens = []
# your existing code to fill the list with tokens
# replace this line:
return tokens
# with this:
return Doc(nlp.vocab, tokens)
请参阅文档上Doc
。
如果由于某种原因您不能执行此操作(也许您无权使用令牌化功能),则可以使用字典:
tokens_dict = {'Hello, world.': ['Hello', ',', 'world', '.']}
def custom_tokenizer(text):
if text in tokens_dict:
return Doc(nlp.vocab, tokens_dict[text])
else:
raise ValueError('No tokenization available for input.')
无论哪种方式,都可以像第一个示例一样使用管道:
doc = nlp('Hello, world.')