как найти строки слева и справа от именованной сущности с пространством - PullRequest
1 голос
/ 03 июня 2019

Я новичок в Python и NLP (использую SpaCy), поэтому я надеюсь, что кто-нибудь может мне помочь. Я хочу обнаружить именованные объекты в моем тексте и сразу после того, как я хочу получить пять слов влево и вправо от сетевых элементов.

Я уже нашел сетевые элементы, но застрял в поиске "окружающих слов"

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 не будет показан. Также меня смущает, как получить более одной строки (до и после).

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Спасибо за вашу помощь! Я был действительно неправ насчет типа, теперь он работает;)

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]
0 голосов
/ 03 июня 2019

Объекты в doc.ents имеют тип Span. С помощью квадратных скобок вы индексируете токены только в пределах диапазона. У сущности есть поля start и end, которые можно использовать для индексации токенов в исходном документе.

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: '.'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...