Удалить именованные объекты из пространственного объекта - PullRequest
0 голосов
/ 23 февраля 2020

Я пытаюсь удалить именованные объекты из документа с помощью Spacy. Я не нашел никаких проблем с распознаванием названных лиц. использовал этот код:

ne = [(ent.text, ent.label_) for ent in doc.ents]
print(ne)
persons = [ent.text for ent in doc.ents if ent.label_ == 'PERSON']
print(persons)

Вывод:

'Timothy D. Cook',
 'Peter',
 'Peter',
 'Benjamin A. Reitzes',
 'Timothy D. Cook',
 'Steve Milunovich',
 'Steven Mark Milunovich',
 'Peter',
 'Luca Maestri'

Но затем я пытаюсь использовать этот блок для фактического удаления их из документа:

text_no_namedentities = []

ents = [e.text for e in doc.ents]
for item in doc:
    if item.text in ents:
        pass
    else:
        text_no_namedentities.append(item.text)
print(" ".join(text_no_namedentities))

Это не работает, так как NE это n-грамм. И если я просто проверяю содержимое небольшого фрагмента просторного объекта, это выглядит следующим образом:

for item in doc:
    print(item.text)

iPad
has
a
78
%
Steve
Milunovich
share
of
the
U.S.
commercial
tablet
market

Таким образом, просторный объект маркируется. Следовательно, я не могу удалить сетевые элементы с моим кодом выше. Любые идеи о том, как я могу удалить все названные объекты из объекта?

Ответы [ 2 ]

1 голос
/ 23 февраля 2020

Условие, которое вы хотите проверить:

if item.ent_type:

Это оценивается как True, если item ("токен") является частью именованного объекта. token.ent_type будет идентификатором ha sh фактического типа объекта, который можно запросить с помощью token.ent_type_ (обратите внимание на _).

Это будет код, который я буду использовать:

    text_no_namedentities = ""
    for token in doc:
        if not token.ent_type:
            text_no_namedentities += token.text
            if token.whitespace_:
                text_no_namedentities += " "

Обратите внимание, что вы можете использовать token.whitespace_, чтобы определить, следует ли за пробелом в оригинальном предложении пробел или нет.

Для получения дополнительной информации см. Документацию по Token здесь .

К вашему сведению - в будущем было бы удобнее включить работающий минимальный фрагмент кода, а не только его части.

0 голосов
/ 23 февраля 2020

Вы можете использовать пространственные функции и понимание списка, чтобы преобразовать do c в список строк, а затем обратно в do c: но ...

Если у вас был однократный термин токены, тогда вот простое решение.

import spacy
nlp = spacy.load("en_core_web_sm")

doc = nlp('John and Jim are my favorite Google employees.')
persons = [ent.text for ent in doc.ents if ent.label_ == 'PERSON']
doc_anon = nlp(" ".join([d for d in doc.text.split() if d not in persons]))
print(doc_anon)

Это даст вам просторный объект do c.

and are my favorite Google employees.

Теперь, в вашем случае у вас есть n-грамм, так что не сработает Но, возможно, кто-то еще может извлечь из этого пользу.

...