我使用Python Spacy将任何实体替换为label_==="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,并将任何ent替换为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
项。