使用 spacy 编辑数据框中列的名称

Using spacy to redact names from a column in a data frame

我有一个名为“df1”的数据框。该数据框有 12 列。此数据框中的最后一列称为注释。我需要从该列中替换“john、sally 和 richard”等常用名称,并将值替换为 xxxx 或类似名称。我有一个正在从 MS SQL 创建此数据框的工作脚本。我花了几个小时并使用了各种资源来尝试获取一些可以执行此操作的代码,但我没有成功。我不必使用 Spacy,但有人告诉我这是一个很好的软件包。任何帮助将不胜感激。

您需要使用类似

的解决方案
import spacy
import pandas as pd

# Test dataframe
df = pd.DataFrame({'notes':["Peter A. Smith came to see Bart in Washington on Tuesday."]})

print(df['notes'])
# => 0    Peter A. Smith came to see   Bart     in   Washington on  Tuesday.
##        <<PERSON>>     came to see <<PERSON>> in     <<GPE>>  on <<DATE>>.

nlp = spacy.load('en_core_web_trf')

def redact_with_spacy(text: str) -> str:
    doc = nlp(text)
    newString = text
    for e in reversed(doc.ents):
        if e.label_ == "PERSON": # Only redact PERSON entities
            start = e.start_char
            end = start + len(e.text)
            newString = newString[:start] + "xxxx" + newString[end:]
    return newString

df['notes'] = df['notes'].apply(redact_with_spacy)
print(df['notes'])

输出:

0    xxxx came to see xxxx in Washington on Tuesday.

请注意,您可以在 redact_with_spacy 函数中调整 "xxxx"。例如,如果您使用 newString = newString[:start] + ("x" * len(e.text)) + newString[end:],您可以用相同数量的 x 替换找到的实体。或者,为了保留空格,newString = newString[:start] + "".join(["x" if not x.isspace() else " " for x in e.text]) + newString[end:].