如何使用Spacy找到命名实体左右的字符串

3

我是Python和NLP(使用SpaCy)的新手,所以希望有人能帮助我。我想检测文本中的命名实体,然后获取NE周围的五个单词。

我已经找到了NEs,但是我卡在了如何找到“周围的单词”上。

import spacy

nlp=spacy.load("en_core_web_sm")

doc = nlp(open(path to my text).read())

for index, token in enumerate(doc.ents): 
    if token.label_ == "PERSON" and token.text == "Frodo" or token.text == "Frodo Beutlin":
        print(token[:index])
        print(token[index])
        print(token[index:])

Frodo Beutlin
think

这是我的结果,正如你所看到的,在我的NE之前的字符串没有显示出来。此外,我不知道如何获取多个字符串(包括NE之前和之后的字符串)。

2个回答

2
感谢您的帮助!我确实对类型有误解,现在它已经可以工作了。最初的回答。
for index, token in enumerate(doc.ents): 
    if token.label_ == "PERSON":
        if token.text == "Frodo Beutlin":
            span = doc.ents[index]
            for i in range(1,6):
                wordsBefore = doc[span.start - i]
            for i in range(1,6):
                wordsAfter = doc[span.start + i]

-1

doc.ents 中的实体属于 Span 类型。使用方括号只能索引范围内的标记。实体具有 startend 字段,可用于索引原始文档中的标记。

import spacy

nlp = spacy.load("en_core_web_sm")
doc = nlp("My name is Frodo Beutlin.")

entity = doc.ents[0]
print(f"Token on the left: '{doc[entity.start - 1]}'")
print(f"Token on the right: '{doc[entity.end]}'") 

Token on the left: 'is'
Token on the right: '.'

您的代码片段中未定义 span - amirouche

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