Spacy获取特定单词的词性标注

3
我可以帮您翻译中文,这篇文章涉及到IT技术。"Original Answer"可以翻译成"最初的回答"。以下是需要翻译的内容:

我遇到了一个情况,需要从spacy doc对象中获取pos_和tag_。

例如:

text = "Australian striker John hits century"
doc = nlp(text)
for nc in doc.noun_chunks:
    print(nc) #Australian striker John
doc[1].tag_ # gives for striker

如果我想要获取单词'striker'的pos_tag_,我需要再次将该句子提供给nlp()吗?
此外,有doc[1].tag_,但我需要像doc ['striker'] .tag_这样的内容...
是否有可能?
最初的回答:要获取单词'striker'的pos_tag_,您需要将整个句子提供给nlp()。如果您只想获取特定单词的tag_,您可以使用以下代码:doc[doc.vocab['striker'].i].tag_。

1
首先,如果句子中有多个“striker”单词,像doc['striker'].tag_这样的表达会产生歧义。但是关于你最初的问题,你说的“我需要再次给出那个句子”是什么意思?你已经有了doc[1].tag_ == 'NN'doc[1].pos_ == 'NOUN' - darksky
1
我需要再次将那个句子传递给 nlp() 吗?是的,因为词性标注取决于上下文。例如,没有上下文的情况下,“hits” 可能是名词(“hit”的复数形式)或动词。你可以将每个标记映射到它们的位置,然后执行类似于 doc[index[word]] 的操作,但如果同一个词出现多次会引起问题。 - Lomtrur
1
好的。我认为你不需要对句子进行多次解析。当doc准备好时,所有位置已经根据上下文正确计算了,就像你说的那样。你可以执行print([token.pos_ for token in doc]),它会返回['ADJ', 'NOUN', 'PROPN', 'VERB', 'NOUN'] - darksky
@darksky 但是如何仅获取检测到的名词短语的标签呢?比如如果有一个很长的段落。 - Wickkiey
1
@VivekAnanthan 名词块是 spacy.tokens.span.Span,而不是一个标记。您需要对其进行迭代,以打印块内每个标记的标签,例如 print([[token.tag_ for token in nc] for nc in doc.noun_chunks]) - darksky
2个回答

2
你只需要处理文本一次:
text = "Australian striker John hits century"
doc = nlp(text)
for nc in doc.noun_chunks:
    print(nc)  
    print([(token.text, token.tag_, token.pos_) for token in nc])

如果您只想在名词块中获取特定单词,则可以通过将第二个打印语句更改为例如来进一步筛选。
print([(token.text, token.tag_, token.pos_) for token in nc if token.tag_ == 'NN'])

请注意,这可能会打印多个匹配项,具体取决于您的模型和输入句子。

0
你可以做以下的事情:
text = "Australian striker John hits century"
x1 = "striker"
x2 = re.compile(x1,re.IGNORECASE | re.VERBOSE)
loc_indexes = [m.start(0) for m in re.finditer(x2, text )]
tag = [i.tag_ for i in nlp(text) if i.idx in loc_indexes ]
print(x1,tag[0])

它会输出:

striker NN

如果需要,您还可以轻松地使其动态化,其中x1是变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接