Проблемы редактирования имен из текста с использованием Python 3.x и SpaCy - PullRequest
1 голос
/ 29 июня 2019

У меня есть несколько текстовых фрагментов, в которых я хочу редактировать определенные имена, но не все имена. Я играл с некоторыми струнными инструментами в python, затем основал spaCy. Я установил spaCy версии 2.1.4 с Python 3.6.6. Затем я написал небольшую программу, основанную на некоторых статьях в Интернете и документах.

Проблемы, с которыми я столкнулся, заключаются в том, что spaCy хорошо работает с полными именами (первая фамилия или первая средняя последняя), а не только с именами, как вы можете видеть из кода и вывода.

redacted_text.py:

test="This picture is also a test of redacting text. I will add some names and see if they are redacted. First, let's talk about Sally Marriott. We could then mention Adam Westin Marriott. Maybe Hanna and John need an honorable mention. Then, of course, there are Diana and Meagan."

hidden_people=['Sally Magilicudy Marriott', 'Sally Francis Magilicudy', 'Adam Westin Marriott', 'Diana Francis Marriott', 'Meagan Marriott', 'Sally Marriott', 'Sally Magilicudy', 'Adam Marriott', 'Diana Marriott', 'Meagan Marriott', 'Sally', 'Adam', 'Diana', 'Meagan',]

import spacy
nlp = spacy.load('en_core_web_sm')
docx = nlp(test)
redacted_sentences = []    
for ent in docx.ents:
    print("ent=%s" % ent)
    ent.merge()
for token in docx:
    print("token.string='%s', type=%s" % (token.string, token.ent_type_))
    if (token.string in hidden_people):
    redacted_sentences.append("[REDACTED]") 
    #print("redacted name=%s" % token.string)
    else:
    redacted_sentences.append(token.string)
    #print("did not redact=%s" % token.string)
print("".join(redacted_sentences))

выход:

$ python redacted_text.py 
ent=First
ent=Sally Marriott
ent=Adam Westin Marriott
ent=Hanna
ent=John
ent=Diana
ent=Meagan
token.string='This ', type=
token.string='picture ', type=
token.string='is ', type=
token.string='also ', type=
token.string='a ', type=
token.string='test ', type=
token.string='of ', type=
token.string='redacting ', type=
token.string='text', type=
token.string='. ', type=
token.string='I ', type=
token.string='will ', type=
token.string='add ', type=
token.string='some ', type=
token.string='names ', type=
token.string='and ', type=
token.string='see ', type=
token.string='if ', type=
token.string='they ', type=
token.string='are ', type=
token.string='redacted', type=
token.string='. ', type=
token.string='First', type=ORDINAL
token.string=', ', type=
token.string='let', type=
token.string=''s ', type=
token.string='talk ', type=
token.string='about ', type=
token.string='Sally Marriott', type=PERSON
token.string='. ', type=
token.string='We ', type=
token.string='could ', type=
token.string='then ', type=
token.string='mention ', type=
token.string='Adam Westin Marriott', type=PERSON
token.string='. ', type=
token.string='Maybe ', type=
token.string='Hanna ', type=PERSON
token.string='and ', type=
token.string='John ', type=PERSON
token.string='need ', type=
token.string='an ', type=
token.string='honorable ', type=
token.string='mention', type=
token.string='. ', type=
token.string='Then', type=
token.string=', ', type=
token.string='of ', type=
token.string='course', type=
token.string=', ', type=
token.string='there ', type=
token.string='are ', type=
token.string='Diana ', type=PERSON
token.string='and ', type=
token.string='Meagan', type=GPE
token.string='.', type=
This picture is also a test of redacting text. I will add some names and see if they are redacted. First, let's talk about [REDACTED]. We could then mention [REDACTED]. Maybe Hanna and John need an honorable mention. Then, of course, there are Diana and [REDACTED].

Проблемы заключаются в том, что (1) не все имена распознаются как PERSON: Meagan - это GPE, поэтому я не могу использовать объект PERSON для поиска в тексте, и (2) я не могу использовать token.string для поиска Мой список имен, потому что токен Дианы связан с пробелом, но не с Меганом или другими именами.

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

Спасибо

Mark

...