NLTK用于命名实体识别

27

我正在尝试使用NLTK工具包从文本消息中提取地点、日期和时间信息。我刚刚在我的电脑上安装了该工具包,并编写了以下代码来进行测试:

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在标记时间和日期方面还不够成熟呢。谢谢!

3个回答

30

谢谢!链接非常有帮助! - Pranav Waila
那个第二个链接坏了 :( - xyz
@xyz链接已修复。 - Viktor Vojnovski

6

命名实体识别并不是一个简单的问题,不要期望任何库都能百分之百准确。你不应该根据一个句子来得出关于NLTK性能的结论。这里有另一个例子:

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

I get

(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提供了Stanford的NERTagger绑定(from nltk.tag.stanford import StanfordNERTagger)。但是你仍然需要下载Java源代码,但外部有很多帮助资源。 - Pithikos

3
如果你想要正确地从文本消息中识别出日期或时间,你可以使用斯坦福大学的NER。它使用CRF(条件随机场)分类器,CRF是一种序列分类器,因此它考虑了单词序列。根据您如何构造或设计句子,您将得到分类数据。如果您的输入句子是“让我们在周三上午9点见面”,那么斯坦福NER将正确地将“周三”识别为日期,“9am”识别为时间。NLTK支持斯坦福NER,尝试使用吧。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接