Удаление текста «ЧЕЛОВЕК» из текста? - PullRequest
0 голосов
/ 07 мая 2019
>>> import spacy
>>> en = spacy.load('en')
>>> text = "Joe is walking down the street. He is wondering if Dan Jordan will be home soon."
>>> doc = en(text)
>>> people = [e for e in doc.ents if e.label_ == 'PERSON']
>>> print(people)
[Joe, Dan Jordan]
>>> print(doc.ents)
(Joe, Dan Jordan)

Я хотел бы иметь возможность удалить или заменить все энты с меткой, в данном случае «ЧЕЛОВЕК» - так что каким-то образом получить «х идет по улице. Он интересуется, будет ли х домаскоро ".

Какой лучший подход для этого?Я полагаю, что вам придется каким-то образом повторно маркировать документ и удалять / заменять строки «PERSON», но я не уверен, как проверить, является ли токен ent и есть ли у ent метка «PERSON» во время итерации документа....

1 Ответ

1 голос
/ 07 мая 2019

Вы можете указать расширение токена, в отличие от других изменяемых полей, где вы будете хранить необходимую информацию. В этом случае вы можете скопировать текст каждого токена и затем анонимизировать сущности, изменив это.

import spacy
spacy.tokens.token.Token.set_extension('anonymized', default='')
text = "Joe is walking down the street. He is wondering if Dan Jordan will be home soon."
doc = en(text)
people = [e for e in doc.ents if e.label_ == 'PERSON']
for tok in doc: 
    tok._.anonymized = tok.text
for ent in people:
    ent[0]._.anonymized = "X"
    for i in range(1, len(ent)):
        ent[i]._.anonymized = ''
"".join([tok._.anonymized + (" " if tok.whitespace_ else "")
         for tok in doc if tok._.anonymized])

И вы получите:

'X is walking down the street. He is wondering if X will be home soon.'

Возможно, вам понадобится провести детокенизацию более тщательно.

...