我是 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 是一个面向专业和爱好者程序员的问答网站。它是一个私有(private)持有的网站,是 Stack Exchange Network 的旗舰网站,[5][6][7] 由 PERSON 和 PERSON 于 DATE 创建。
非常感谢!
最佳答案
您确实可以按照 @taha 的解释循环遍历文本和标签,但在一般情况下这是一个坏主意!此循环可能会在文本中混合具有相同名称但不同类型(或者有时不是实体)的实体,因为您只依赖于实体的标签。
例如考虑以下情况:
In 2000 I sent 2000 emails.
I saw a statue of Washington in Washington.
您将无法区分出现的“2000”或“Washington”!这可能看起来很少见,但避免此类错误不是更好吗,特别是对于很长的文档?
据我了解,ner python 模块看起来像是到 Spacy 的简单绑定(bind)。所以我想你可以通过一些基本的Python编程来访问每个实体的“start_char”和“end_char”值来避免这种情况。顺便说一句,我也认为从计算的角度来看这应该更有效。
关于Python 命名实体识别 (NER) : Replace named entities with labels,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62904623/