Я пытаюсь заменить имена в текстовом фрейме данных (два столбца: Имя и Комментарии) серийными номерами. Для этого я использую 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, как показано в первой половине поста.
Заранее спасибо!