Подтвердить что ты не робот

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

Я пытаюсь использовать инструментарий NLTK для получения места извлечения, даты и времени из текстовых сообщений. Я только что установил инструментарий на своей машине, и я написал этот быстрый фрагмент, чтобы проверить его:

sentence = "Let 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 просто недостаточно зрело, чтобы правильно пометить время и дату. Спасибо!

4b9b3361

Ответ 1

Стандартный chunker NE в nltk является максимальным энтропийным chunker, обученным на корпусе ACE (http://catalog.ldc.upenn.edu/LDC2005T09). Он не был обучен распознавать даты и время, поэтому вам нужно обучить свой классификатор, если вы хотите это сделать.

Посмотрите http://mattshomepage.com/articles/2016/May/23/nltk_nec/, весь процесс объясняется очень хорошо.

Кроме того, существует модуль, называемый timex в nltk_contrib, который может помочь вам в ваших потребностях. https://code.google.com/p/nltk/source/browse/trunk/nltk_contrib/nltk_contrib/timex.py

Ответ 2

Именованное распознавание объектов - непростая задача, не ожидайте, что какая-либо библиотека будет на 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, это часть Стэнфорда CoreNLP - я использовал его до того, как он работает хорошо (он находится на Java хотя).

Ответ 3

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

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

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

Если ваше входное предложение было бы Let meet on wednesday at 9am., то Stanford NER правильно определил бы wednesday как дату и 9am как время.

NLTK поддерживает Stanford NER. Попытка использовать его.