用于命名实体识别的 NLTK

Posted

技术标签:

【中文标题】用于命名实体识别的 NLTK【英文标题】:NLTK for Named Entity Recognition 【发布时间】:2013-10-19 04:55:30 【问题描述】:

我正在尝试使用 NLTK 工具包从短信中提取地点、日期和时间。我刚刚在我的机器上安装了工具包,我写了这个快速的 sn-p 来测试它:

sentence = "Let's meet tomorrow at 9 pm";
tokens = nltk.word_tokenize(sentence)
pos_tags = nltk.pos_tag(tokens)
print nltk.ne_chunk(pos_tags, binary=True)

我假设它将识别日期(明天)和时间(晚上 9 点)。但是,令人惊讶的是,它没有意识到这一点。当我运行上面的代码时,我得到以下结果:

(S (GPE Let/NNP) 's/POS meet/NN tomorrow/NN at/IN 9/CD pm/NN)

如果我遗漏了什么,或者 NLTK 还不够成熟,无法正确标记时间和日期,有人可以帮我了解一下吗?谢谢!

【问题讨论】:

【参考方案1】:

nltk 中默认的 NE 分块器是在 ACE 语料库 (http://catalog.ldc.upenn.edu/LDC2005T09) 上训练的最大熵分块器。它还没有被训练来识别日期和时间,所以如果你想这样做,你需要训练自己的分类器。

看看http://mattshomepage.com/articles/2016/May/23/nltk_nec/,整个过程解释的很好。

此外,nltk_contrib 中有一个名为 timex 的模块,它可能会帮助您满足您的需求。 https://github.com/nltk/nltk_contrib/blob/master/nltk_contrib/timex.py

【讨论】:

谢谢!!链接很有帮助!! 第二个链接坏了:( @xyz 链接已修复。【参考方案2】:

如果您希望从短信中正确识别日期时间,您可以使用Stanford's NER

它使用 CRF(条件随机场)分类器。 CRF 是一个顺序分类器。所以它考虑了单词的序列。

你如何构筑或设计一个句子,你会得到相应的分类数据。

如果您的输入句子是 Let's meet on wednesday at 9am.,那么斯坦福 NER 将正确地将 wednesday 识别为日期,将 9am 识别为时间。

NLTK 支持斯坦福 NER。尝试使用它。

【讨论】:

【参考方案3】:

命名实体识别不是一个简单的问题,不要期望任何库都是 100% 准确的。您不应该仅凭一句话就对 NLTK 的表现做出任何结论。这是另一个例子:

sentence = "I went to New York to meet John Smith";

我明白了

(S
  I/PRP
  went/VBD
  to/TO
  (NE New/NNP York/NNP)
  to/TO
  meet/VB
  (NE John/NNP Smith/NNP))

如您所见,NLTK 在这里做得很好。但是,我无法让 NLTK 将 todaytomorrow 识别为时间表达式。你可以试试Stanford SUTime,它是Stanford CoreNLP 的一部分-在我使用它之前我已经使用过它,它运行得很好(虽然它是在Java 中的)。

【讨论】:

实际上 NLTK 为斯坦福的 NERTagger (from nltk.tag.stanford import StanfordNERTagger) 提供了绑定。您仍然需要下载 java 源代码,但那里有很多帮助。

以上是关于用于命名实体识别的 NLTK的主要内容,如果未能解决你的问题,请参考以下文章

Python NLTK 命名实体识别取决于首字母的(大写)?

如何改进hanlp命名实体识别

命名实体识别研究综述

使用使用nltk 和 spacy进行命名实体提取/识别

stanford CoreNLP 命名实体识别NER学习笔记

NLP屠夫系列- NER之实战BILSTM