Как определить, является ли токен частью объекта в Spacy? - PullRequest
1 голос
/ 06 августа 2020

У меня

import spacy
nlp = spacy.load("en_core_web_lg")
line = "Rio de Janeiro is the capital of.."
doc = nlp(line)
for tok in doc:
    printf(tok.lemma_)
for ent in doc.ents:
    printf(e.lemma_)

Я хочу получить википедию: "[[Рио-де-Жанейро]] [[быть | is]] [[the]] [[capital]] [[of]]". . "как определить, является ли токен" Рио "частью организации" Рио-де-Жанейро "?

Ответы [ 2 ]

2 голосов
/ 06 августа 2020

Используйте атрибут ent_type или ent_type_, если значение не является пустой строкой, это сущность.

Изменить: для атрибута ent_iob или ent_iob_ «B» означает, что токен начинает сущность, «I» означает, что он находится внутри сущности, «O» означает, что он находится вне сущности, а «» означает, что тег сущности не установить.

 import spacy
    nlp = spacy.load("en_core_web_lg")
    line = "Rio de Janeiro is the capital of.."
    doc = nlp(line)
    for tok in doc:
        print(tok, tok.ent_type_, tok.ent_iob_)

Вывод:

Rio GPE B
de GPE I
Janeiro GPE I
is  O
the  O
capital  O
of  O
..  O
1 голос
/ 07 августа 2020

Сущности имеют свойство start и end: индикаторы потока токенов. Я могу написать:

import spacy
nlp = spacy.load("en_core_web_lg")
line = "Rio de Janeiro is the capital of.."
doc = nlp(line)
if len(doc.ents)>0:
    firstEnt = doc.ents[0].start
else:
    firstEnt = len(doc)
for j in range(firstEnt):
    print(doc[j])
j = firstEnt
for i in range(len(doc.ents)):
    ent = doc.ents[i]
    while j<ent.start:
        print(doc[j])
        j+=1
    print(ent)
if len(doc.ents) > 0:
    j = ent.end
while j<len(doc):
    print(doc[j])
    j+=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...