用于命名实体识别的 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 将 today
或 tomorrow
识别为时间表达式。你可以试试Stanford SUTime,它是Stanford CoreNLP 的一部分-在我使用它之前我已经使用过它,它运行得很好(虽然它是在Java 中的)。
【讨论】:
实际上 NLTK 为斯坦福的 NERTagger (from nltk.tag.stanford import StanfordNERTagger
) 提供了绑定。您仍然需要下载 java 源代码,但那里有很多帮助。以上是关于用于命名实体识别的 NLTK的主要内容,如果未能解决你的问题,请参考以下文章
Python NLTK 命名实体识别取决于首字母的(大写)?