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 还不够成熟,无法正确标记时间和日期。谢谢!

4

3 回答 3

30

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

于 2013-10-16T09:44:33.570 回答
6

命名实体识别不是一个简单的问题,不要指望任何库是 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 中)。

于 2013-10-11T08:48:57.847 回答
3

如果您希望从短信中正确识别日期时间,您可以使用斯坦福的 NER

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

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

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

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

于 2016-06-21T14:36:37.873 回答