24

Я пытаюсь использовать инструментарий 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 просто не достаточно зрелой, чтобы помечать дату и время правильно. Благодаря!

ответ

5

Именованное распознавание лица - непростая задача, не ожидать, что любая библиотека будет на 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, хотя).

+0

На самом деле NLTK предоставляет привязки для NERTagger от Stanford ('from nltk.tag.stanford import StanfordNERTagger'). Тем не менее вам нужно загрузить источник java, но от него много помощи. – Pithikos

25

По умолчанию NE chunker в 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

+0

Спасибо! Ссылки очень полезны! –

1

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

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

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

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

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