Python Spacy 用其他东西替换 ent.label_ == PERSON 的值

Python Spacy replace value of ent.label_ == PERSON with something else

我正在使用 Python Spacy 将任何带有标签_ ==“PERSON”的实体替换为“[XXX]”。 看来我做对了,但我正在努力在我的测试字符串中替换它:

import spacy
from spacy.matcher import Matcher

nlp = spacy.load("en_core_web_sm")

file_text = """This is my teststring. Isaac Newton is supposed to be changed."""

nlp.add_pipe("merge_entities")

def change_names(file_text):
    text_doc = nlp(file_text)
    mylist = []
    for ent in text_doc.ents:
        if ent.label_ == "PERSON":
            print(ent)
            mylist.append("[XXX]")
        else:
            mylist.append(ent.text)
    res = ''.join(mylist)
    print(res)
    print(text_doc)

change_names(file_text)

这导致:

艾萨克·牛顿 [XXX] 这是我的测试字符串。艾萨克牛顿应该被改变。

结果应该是: 这是我的测试字符串。 [XXX] 应该更改

现在我想遍历我的 text_doc 并将任何带有 label_ == "PERSON" 的条目替换为 "[XXX]"。这不适合我。我尝试使用双 forloop 迭代字符串,如果某个项目是实体,则跳转到我在此处发布的 for 循环。有什么建议吗?

因为你只需要一个字符串输出,你可以使用

result = []
for t in text_doc:
    if t.ent_type_ == "PERSON":
        result.append("[XXX]")
    else:
        result.append(t.text)
    result.append(t.whitespace_)

res = ''.join(result)
print(res)

即:

  • 找到 PERSON 实体后,将 [XXX] 附加到 result 列表
  • 否则,添加当前标记文本
  • 如果存在,则在标记后附加任何空格。

然后,最后加入result项。