Spacy — порция токенов NE

Допустим, у меня есть документ, например:

import spacy

nlp = spacy.load('en')

doc = nlp('My name is John Smith')

[t for t in doc]
> [My, name, is, John, Smith]

Спейси достаточно умен, чтобы понять, что «Джон Смит» — это именованная сущность с несколькими токенами:

[e for e in doc.ents]
> [John Smith]

Как я могу разбить именованные объекты на отдельные токены, например:

> [My, name, is, John Smith]

person Chris C    schedule 11.08.2018    source источник


Ответы (1)


В документации Spacy по NER говорится, что вы можете получить доступ к аннотациям сущности токена, используя атрибуты token.ent_iob_ и token.ent_type_.

https://spacy.io/usage/linguistic-features#accessing

Пример:

import spacy

nlp = spacy.load('en')
doc = nlp('My name is John Smith')


ne = []
merged = []
for t in doc:
    # "O" -> current token is not part of the NE
    if t.ent_iob_ == "O":
        if len(ne) > 0:
            merged.append(" ".join(ne))
            ne = []
        merged.append(t.text)
    else:
        ne.append(t.text)

if len(ne) > 0:
    merged.append(" ".join(ne))

print(merged)

Это напечатает:

['My', 'name', 'is', 'John Smith']
person iborko    schedule 11.08.2018
comment
Этого будет достаточно, но мне нужен результат в виде списка документов Spacy, как в моем примере вывода. - person Chris C; 12.08.2018