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