【问题标题】:NLP Named Entity Recognition using NLTK and Spacy使用 NLTK 和 Spacy 的 NLP 命名实体识别
【发布时间】:2020-02-01 06:26:16
【问题描述】:

我在 NLTK 和 Spacy 的以下句子中使用了 NER,结果如下:

"Zoni I want to find a pencil, a eraser and a sharpener"

我在 Google Colab 上运行了以下代码。

import nltk
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
from nltk.tokenize import word_tokenize
from nltk.tag import pos_tag

ex = "Zoni I want to find a pencil, a eraser and a sharpener"

def preprocess(sent):
    sent = nltk.word_tokenize(sent)
    sent = nltk.pos_tag(sent)
    return sent

sent = preprocess(ex)
sent

#Output:
[('Zoni', 'NNP'),
 ('I', 'PRP'),
 ('want', 'VBP'),
 ('to', 'TO'),
 ('find', 'VB'),
 ('a', 'DT'),
 ('pencil', 'NN'),
 (',', ','),
 ('a', 'DT'),
 ('eraser', 'NN'),
 ('and', 'CC'),
 ('a', 'DT'),
 ('sharpener', 'NN')]

但是当我在同一文本上使用 spacy 时,它没有返回任何结果

import spacy
from spacy import displacy
from collections import Counter
import en_core_web_sm
nlp = en_core_web_sm.load()

text = "Zoni I want to find a pencil, a eraser and a sharpener"

doc = nlp(text)
doc.ents

#Output:
()

它只适用于某些句子。

import spacy
from spacy import displacy
from collections import Counter
import en_core_web_sm
nlp = en_core_web_sm.load()

# text = "Zoni I want to find a pencil, a eraser and a sharpener"

text = 'European authorities fined Google a record $5.1 billion on Wednesday for abusing its power in the mobile phone market and ordered the company to alter its practices'

doc = nlp(text)
doc.ents

#Output:
(European, Google, $5.1 billion, Wednesday)

如果有问题请告诉我。

【问题讨论】:

    标签: python-3.x nlp nltk spacy named-entity-recognition


    【解决方案1】:

    Spacy 模型是统计模型。因此,这些模型识别的命名实体取决于这些模型所训练的数据集。

    根据 spacy 文档,命名实体是一个“现实世界的对象”,它被分配了一个名称——例如,一个人、一个国家、一个产品或一个书名。

    例如,名称 Zoni 并不常见,因此模型不会将该名称识别为命名实体(人)。如果我在您的句子中将名称 Zoni 更改为 WilliamspacyWilliam 识别为一个人。

    import spacy
    nlp = spacy.load('en_core_web_lg')
    
    doc = nlp('William I want to find a pencil, a eraser and a sharpener')
    
    for entity in doc.ents:
      print(entity.label_, ' | ', entity.text)
      #output
      PERSON  |  William
    

    人们会假设 pencilerasersharpener 是对象,因此它们可能会被归类为产品,因为 spacy documentation 声明“对象”是产品。但是,您句子中的 3 个对象似乎并非如此。

    我还注意到,如果在输入文本中找不到命名实体,则输出将为空。

    import spacy
    nlp = spacy.load("en_core_web_lg")
    
    doc = nlp('Zoni I want to find a pencil, a eraser and a sharpener')
    if not doc.ents:
      print ('No named entities were recognized in the input text.')
    else:
      for entity in doc.ents:
        print(entity.label_, ' | ', entity.text)
    

    【讨论】:

      【解决方案2】:

      我不确定我是否理解您要进行的比较。在您使用 NLTK 的第一个示例中,您正在查看句子中的 POS 标签。然而,在 spaCy 的第二个示例中,您正在查看 命名实体。这是两个不同的东西。统计模型应该始终为每个令牌提供一个 POS 标签(尽管有时可能会有所不同),但命名实体的识别(如“生活很复杂”的帖子中所解释的那样)取决于这些模型的数据集受过训练。如果模型“感觉”句子中没有命名实体,您将得到一个空的结果集。但为了公平比较,您还应该显示 NLTK 找到的命名实体,并与之进行比较。

      如果您想比较 POS 标签,可以使用 spaCy 运行:

      for token in doc:
          print(token.text, token.pos_, token.tag_) 
      

      【讨论】:

      • 我也注意到了这种差异。我很高兴您在 OP 的问题中提到了 NLTK 和 spaCy 代码之间的区别。
      猜你喜欢
      • 1970-01-01
      • 2018-03-08
      • 2020-07-02
      • 2021-05-06
      • 2023-03-24
      • 1970-01-01
      • 2013-10-19
      • 2019-11-12
      • 1970-01-01
      相关资源
      最近更新 更多