我是Python NER的新手,正尝试用其标签替换文本输入中的命名实体。
from nerd import ner
input_text = """Stack Overflow is a question and answer site for professional and enthusiast programmers. It is a privately held website, the flagship site of the Stack Exchange Network,[5][6][7] created in 2008 by Jeff Atwood and Joel Spolsky."""
doc = ner.name(input_text, language='en_core_web_sm')
text_label = [(X.text, X.label_) for X in doc]
print(text_label)
输出为:[('2008', 'DATE'), ('Jeff Atwood', 'PERSON'), ('Joel Spolsky', 'PERSON')]
然后我可以提取人物,例如:
people = [i for i,label in text_label if 'PERSON' in label]
print(people)
获得['Jeff Atwood', 'Joel Spolsky']
。
我的问题是如何替换原始输入文本中已标识的命名实体,以使结果为:
Stack Overflow is a question and answer site for professional and enthusiast programmers. It is a privately held website, the flagship site of the Stack Exchange Network,[5][6][7] created in DATE by PERSON and PERSON.
非常感谢!
答案 0 :(得分:2)
您可以遍历text_label
并将每个文本替换为相应的标签
for text, label in text_label:
input_text = input_text.replace(text, label)
print(input_text)
答案 1 :(得分:1)
您确实可以按照@taha的说明遍历文本和标签,但这在通常情况下是个坏主意!该循环可能在文本中混合使用名称相同但类型不同(有时不是实体)的实体,因为您仅依赖实体的标签。
例如考虑以下内容:
2000年,我发送了2000封电子邮件。
我在华盛顿看到华盛顿的雕像。
您将无法区分“ 2000”或“华盛顿”的出现!这可能看起来很少见,但是避免这种错误不是更好,特别是对于很长的文档?
据我所知,ner python模块看起来像是对Spacy的简单绑定,所以我想您可以使用一些基本的Python访问每个实体的“ start_char”和“ end_char”值来避免这种情况编程。顺便说一句,从计算的角度来看,我也认为这应该更有效。