NLTK считает, что императивы являются существительными - PullRequest
12 голосов
/ 23 февраля 2012

Я использую pos_tagger для рецептов. У меня проблема в том, что pos_tagger возвращает, что слова в императивном времени являются существительными, не должны ли они быть глаголами? Например:

С вводом:

combine 1 1/2 cups floud, 3/4 cup sugar, salt and baking powder

Вывод:

[('combine', 'NN'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('floud', 'VBD'), (',',      ','), ('3/4', 'CD'), ('cup', 'NN'), ('sugar', 'NN'), (',', ','), ('salt', 'NN'), ('and', 'CC'), ('baking', 'VBG'), ('powder', 'NN')]

Вот код, который я использую для этого:

    def part_of_speech(self,input_sentance):
        text = nltk.word_tokenize(input_sentance)
        return nltk.pos_tag(text)

Разве «объединение» не должно быть помечено как какой-то глагол? Это вина НЛТК? Или я что-то не так делаю?

Ответы [ 5 ]

10 голосов
/ 05 марта 2012

То, что вы видите, является очень распространенной проблемой в традиционной статистической обработке естественного языка (NLP). Короче говоря, данные, на которых вы используете теггер, не похожи на данные, на которых они были обучены. NLTK не документирует детали, но, насколько мне известно, тегер по умолчанию обучен на статьях Wall Street Journal, Brown Corpus или какой-то их комбинации. Эти корпуса содержат очень мало императивов, поэтому, когда вы даете им данные с императивами, это не делает правильных действий.

Хорошим долгосрочным решением было бы исправить теги для большого набора рецептов и обучить исправленным данным, чтобы таким образом решить проблему несоответствия между данными обучения и тестирования. Это, однако, огромный объем работы. В идеале корпус с большим количеством императивов уже существовал бы; моя исследовательская группа изучила это, и мы не нашли подходящую, хотя мы находимся в процессе ее создания.

Гораздо более простое решение, которое я использовал в недавнем проекте, который требовал правильного понимания императивов, - это просто отметить, какие императивы вам нужны, и заставить теги для этих слов быть правильными.

Итак, в приведенном ниже примере я составил словарь, в котором говорится, что «объединять» следует рассматривать как глагол, а затем использовал понимание списка для изменения тегов.

tagged_words = [('combine', 'NN'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('flour', 'VBD')]
force_tags = {'combine': 'VB'}
new_tagged_words = [(word, force_tags.get(word, tag)) for word, tag in tagged_words]

Содержимое new_tagged_words теперь имеет оригинальные теги, за исключением того, что оно изменялось везде, где была запись в force_tags.

>>> new_tagged_words
[('combine', 'VB'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('flour', 'VBD')]

Это решение требует, чтобы вы сказали, какие слова вы хотите навязать глаголам. Это далеко от идеала, но лучшего общего решения не существует.

4 голосов
/ 20 декабря 2012

Обучение на императивных корпусах будет лучшим вариантом.Но если у вас нет времени или вы не думаете, что усилия того стоят, вот простое решение (скорее хак): просто поместите местоимение типа «они» перед каждым предложением (которое, как вы уверены, обязательно).Теперь nltk отлично работает с тегером по умолчанию.

1 голос
/ 02 мая 2016

Попробуйте Stanford POS tagger .

Мне повезло больше. Он был обучен более императивным предложениям по сравнению со стандартным тегом NLTK.

Также докеризуется в cuzzo / stanford-pos-tagger .

например.

Follow us on Instagram
VB PRP IN NN
1 голос
/ 23 февраля 2012

«Объединить» с картой существительного, возможно, из-за того, что оно думает, что это существительное.Например, комбайн.Полагаю, вам следует настроить алгоритм существительного для своего варианта использования или изменить / изменить слово корпус.

0 голосов
/ 26 августа 2015
>>> from nltk import pos_tag, word_tokenize
>>> def imperative_pos_tag(sent):
...     return pos_tag(['He']+sent)[1:]
... 
>>> sent1 = 'combine 1 1/2 cups floud, 3/4 cup sugar, salt and baking powder'

>>> imperative_pos_tag(word_tokenize(sent1))
[('combine', 'VBD'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('floud', 'VBD'), (',', ','), ('3/4', 'CD'), ('cup', 'NN'), ('sugar', 'NN'), (',', ','), ('salt', 'NN'), ('and', 'CC'), ('baking', 'VBG'), ('powder', 'NN')]

Кроме того, обратите внимание на Python NLTK pos_tag не возвращает правильный тег части речи , а NLTK определяет глагол как существительное в императивах

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...