【问题标题】:Python named entity recognition (NER): Replace named entities with labelsPython命名实体识别(NER):用标签替换命名实体
【发布时间】:2020-11-04 08:19:45
【问题描述】:

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

非常感谢!

【问题讨论】:

    标签: python nlp spacy named-entity-recognition


    【解决方案1】:

    您确实可以像@taha 解释的那样遍历文本和标签,但在一般情况下这是一个坏主意!此循环可能会在文本中混合具有相同名称但不同类型(或有时不是实体)的实体,因为您只依赖实体的标签。

    考虑以下例子:

    2000 年我发送了 2000 封电子邮件。

    我在华盛顿看到了一尊华盛顿的雕像。

    您将无法区分出现的“2000”或“Washington”!这可能看起来很少见,但避免此类错误不是更好吗,尤其是对于非常长的文档?

    据我所知,ner python 模块看起来像一个简单的绑定到Spacy,所以我猜你可以通过一些基本的 Python 编程访问每个实体的“start_char”和“end_char”值来避免这种情况。顺便说一句,我也认为从计算的角度来看这应该更有效。

    【讨论】:

      【解决方案2】:

      您可以遍历text_label 并将每个文本替换为相应的标签

      for text, label in text_label:
          input_text = input_text.replace(text, label)
      
      print(input_text)
      

      【讨论】:

        猜你喜欢
        • 2017-06-19
        • 2012-04-20
        • 1970-01-01
        • 2014-03-17
        • 1970-01-01
        • 1970-01-01
        • 2018-07-04
        • 2011-07-31
        • 2018-03-08
        相关资源
        最近更新 更多