Python命名实体识别(NER):用标签替换命名实体

时间:2020-07-14 22:01:03

标签: python nlp spacy named-entity-recognition ner

我是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.

非常感谢!

2 个答案:

答案 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”值来避免这种情况编程。顺便说一句,从计算的角度来看,我也认为这应该更有效。