Замените имена серийным номером, используя Spacy Python - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь заменить имена в текстовом фрейме данных (два столбца: Имя и Комментарии) серийными номерами. Для этого я использую NeuralCoref от Spacy для NER. Мой текущий код достаточно хорош, чтобы заменить имена в кадре данных на «[УДАЛЕНО]».

import spacy
import pandas as pd
`Load the large English NLP model`
nlp = spacy.load('en_core_web_lg-2.1.0')

`load neural coref to Spacy pipe`
 import neuralcoref
 neuralcoref.add_to_pipe(nlp)

df = pd.read_excel(r'D:\XXX\YYY\try.xlsx')

def replace_name_with_index(token):
if token.ent_iob != 0 and token.ent_type_ == "PERSON":

    return "[REDACTED] "

else:
    return token.string

def scrub(text):
    doc = nlp(text)
    for ent in doc.ents:
       ent.merge()
    tokens = map(replace_name_with_index, doc)
    return "".join(tokens)

for ind in df.index:
    name = df['Name'][ind]
    comments = df['Comments'][ind]
    textDoc = name + " ; " + comments #concat text from both columns
    #remove stopwords and punctuations
    print (scrub(textDoc), end = '\n')
    print("---")

Я пытаюсь использовать другой набор кодов, пытаясь сначала заменить имена индексными номерами.

import spacy
import pandas as pd


# Load the large English NLP model
nlp = spacy.load('en_core_web_lg-2.1.0')

#load neural coref to Spacy's pipe
import neuralcoref
neuralcoref.add_to_pipe(nlp)

text= "Carolina Smith Henderson is my sister. Carolina Smith Henderson is a dog lover. Carolina loves to eat ice cream even though she is lactose intolerent. She has a brother named Andrew and a sister named Brenda"

doc = nlp(text)

newString = text
index = 0

for e in reversed(doc.ents): #reversed to not modify the offsets of other entities when substituting
    start = e.start_char
    end = start + len(e.text)
    #newString = newString[:start] + e.label_ + newString[end:]

    newString = newString[:start] + str(index) + newString[end:]

    index = index + 1

print(newString)

Но проблема с приведенным выше кодом заключается в том, что «Каролина Смит Хендерсон», «Каролина Смит Хендерсон» (второе упоминание) и «Каролина» рассматриваются как 3 разных «ЧЕЛОВЕКА», хотя они имеют в виду тот же человек. Не могли бы вы посоветовать, как можно улучшить код, чтобы NeuralCoref мог идентифицировать его как одного человека и назначить ему только один индекс? Впоследствии это должно быть сделано для всех записей в кадре данных, использующих для l oop, как показано в первой половине поста.

Заранее спасибо!

...