【问题标题】:Removing named entities from a document using spacy使用 spacy 从文档中删除命名实体
【发布时间】:2020-04-06 08:50:59
【问题描述】:

我试图从被 spacy 认为是命名实体的文档中删除单词,因此基本上从字符串示例中删除了“Sweden”和“Nokia”。我找不到解决实体存储为跨度的问题的方法。因此,当将它们与 spacy doc 中的单个标记进行比较时,会提示错误。

在后面的步骤中,这个过程应该是一个函数,应用于存储在 pandas 数据框中的多个文本文档。

对于如何更好地发布问题的任何帮助和建议,我将不胜感激,因为这是我在这里的第一个问题。


nlp = spacy.load('en')

text_data = u'This is a text document that speaks about entities like Sweden and Nokia'

document = nlp(text_data)

text_no_namedentities = []

for word in document:
    if word not in document.ents:
        text_no_namedentities.append(word)

return " ".join(text_no_namedentities)

它会产生以下错误:

TypeError:参数“其他”的类型不正确(预期为 spacy.tokens.token.Token,得到 spacy.tokens.span.Span)

【问题讨论】:

  • 您想对命名实体做什么?只需将它们从字符串中删除并返回没有它们的字符串?
  • 是的,这就是目标。
  • @john_28 你知道如果我有台词该怎么办吗?

标签: python text nlp spacy


【解决方案1】:

这不会处理覆盖多个令牌的实体。

import spacy
nlp = spacy.load('en_core_web_sm')
text_data = 'New York is in USA'
document = nlp(text_data)

text_no_namedentities = []
ents = [e.text for e in document.ents]
for item in document:
    if item.text in ents:
        pass
    else:
        text_no_namedentities.append(item.text)
print(" ".join(text_no_namedentities))

输出

'纽约在'

此处USA 已正确删除,但无法删除New York

解决方案

import spacy
nlp = spacy.load('en_core_web_sm')
text_data = 'New York is in USA'
document = nlp(text_data)
print(" ".join([ent.text for ent in document if not ent.ent_type_]))

输出

'在'

【讨论】:

    【解决方案2】:

    这将为您提供所需的结果。查看Named Entity Recognition 应该可以帮助您继续前进。

    import spacy
    
    nlp = spacy.load('en_core_web_sm')
    
    text_data = 'This is a text document that speaks about entities like Sweden and Nokia'
    
    document = nlp(text_data)
    
    text_no_namedentities = []
    
    ents = [e.text for e in document.ents]
    for item in document:
        if item.text in ents:
            pass
        else:
            text_no_namedentities.append(item.text)
    print(" ".join(text_no_namedentities))
    

    输出:

    This is a text document that speaks about entities like and
    

    【讨论】:

      【解决方案3】:

      您可以使用实体属性 start_char 和 end_char 将实体替换为空字符串。

      import spacy
      nlp = spacy.load('en_core_web_sm')
      text_data = 'New York is in USA'
      document = nlp(text_data)
      
      text_no_namedentities = []
      ents = [(e.start_char,e.end_char)  for e in document.ents]
      
      for ent in ents:
          start_char, end_char = ent
          text_data = text_data[:start_char] + text_data[end_char:]  
      print(text_data)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-25
        • 2021-02-23
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-06
        相关资源
        最近更新 更多