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

NLTK считает, что императивы являются существительными

Я использую 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)

Не следует ли "комбинировать" помечать как своего рода глагол? Это вина nltk? Или я делаю что-то неправильно?

4b9b3361

Ответ 1

То, что вы видите, является очень распространенной проблемой в традиционной статистической обработке естественного языка (NLP). Короче говоря, данные, которые вы используете с помощью tagger, не похожи на данные, которые были обучены. 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')]

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

Ответ 2

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

Ответ 3

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

Ответ 4

Попробуйте Стэнфордский POS-теггер.

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

Также добавлено в cuzzo/stanford-pos-tagger.

например.

Follow us on Instagram
VB PRP IN NN

Ответ 5

>>> 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 идентифицирует глагол как существительное в императивах