NLTK для распознавания именованных объектов

Я пытаюсь использовать инструментарий 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 ответа

Чанкер сетевого элемента по умолчанию в nltk - это максимальный энтропийный блок, обученный в корпусе 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

Распознавание именованных объектов - непростая задача, не ожидайте, что какая-либо библиотека будет на 100% точной. Вы не должны делать какие-либо выводы о работе НЛТК на основе одного предложения. Вот еще один пример:

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 здесь очень хорошо. Тем не менее, я не мог заставить НЛТК распознать today или же tomorrow как временные выражения. Вы можете попробовать Stanford SUTime, он входит в состав Stanford CoreNLP - я использовал его до того, как заработал достаточно хорошо (хотя и на Java).

Если вы хотите правильно определить дату или время из текстовых сообщений, вы можете использовать NER Стэнфорда.

Он использует классификатор CRF(условные случайные поля). CRF - это последовательный классификатор. Таким образом, он принимает во внимание последовательность слов.

Как вы формируете или конструируете предложение, соответственно вы получите секретные данные.

Если бы ваше входное предложение было бы Let's meet on wednesday at 9am.Тогда Стэнфордский NER правильно определил wednesday как дата и 9am как раз.

NLTK поддерживает Stanford NER. Попробуйте использовать это.

Другие вопросы по тегам