Некоторые вещи НЛП, связанные с грамматикой, тегами, основами и устранением неоднозначности слов в Python - PullRequest
10 голосов
/ 17 декабря 2011

Фон (TLDR; предоставляется для завершения)

Ищу совета по оптимальному решению странных требований. Я учусь на (литературе) на четвертом курсеколледж только с моим собственным руководством в программировании.Я достаточно компетентен в Python, чтобы у меня не возникало проблем с реализацией решений, которые я нахожу (большую часть времени), и разработкой на них, но из-за своего новизны я ищу совет о способах best Я мог бы заняться этой специфической проблемой.

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

Я работаю с фрагментарным, атомарным языком. Мое приложение перемещается пословно: в каждом раунде несколько пользователей вводят слова (по одному слову на пользователя).Моя программа стремится объединить или объединить эти входные слова для получения одного выходного слова.Я уже разработал алгоритм выбора слов - он использует различные функции WordNet для получения результата из одного слова.Результат в форме набора слов WordNet - неотраженного слова (лишенного множественности и времени).Результат добавляется к тексту «стихотворения» (после пробела).Добавление полученного слова влияет на выбор пользователями того, какое слово бросить в банк следующим, и именно так продвигается эта игра / программа, добавляя одно машинно-преобразованное слово в стихотворение за раз.

Проблема: как изобразить результат грамматически разумным способом? Без какой-либо грамматической обработки результаты представляют собой просто список слов для поиска по словарю, без согласования между словами.Первым шагом для моего приложения является определение / множественное число / сопряжение / склонение корневых слов в соответствии с контекстом.(«Коренные слова», о которых я говорю, - это наборы из WordNet и / или их понятные человеку эквиваленты.) Представляя, что в стихотворении уже есть некоторый грамматически чувствительный текст, мое приложение должно получить новый результатСлово, чтобы согласиться с существующей последовательностью.Хорошо, если это работает только как окно из 3 слов или что-то в этом роде, но я ищу советы по оптимальному порядку операций.Я надеюсь, что кто-то может дать мне несколько советов (я ожидаю, что это будет трудно реализовать, но я хочу убедиться, что я начинаю с правильных идей).

Пример сценария (меньше контекста, большевопрос)

Давайте предположим, что у нас уже есть фрагмент стихотворения, к которому пользователи добавляют новые материалы.Новые результаты должны быть отражены грамматически осмысленным образом.

The river bears no empty bottles, sandwich papers,   
Silk handkerchiefs, cardboard boxes, cigarette ends  
Or other testimony of summer nights. The nymphs

Допустим, мой алгоритм принял пакет данных от пользователей и теперь должен напечатать 1 из 4 возможных следующих слов / синтаксисов (неофициально представлен): ['departure', 'to have', 'blue', 'quick'].Мне кажется, что 'blue' следует отбросить;'The nymphs blue' кажется грамматически странным / маловероятным.Оттуда он может использовать любой из этих глаголов.

Если он выберет 'to have', результат может быть заметно изменен как 'had', 'have', 'having', 'will have', 'would have' и т. Д.. (но не 'has').(Результирующая строка будет выглядеть примерно так: 'The nymphs have', а результат с разумным переворотом обеспечит лучший контекст для будущих результатов ...)

Я бы хотел, чтобы 'depature' была допустимой возможностью в этом случае.;в то время как 'The nymphs departure' не имеет смысла (это не "nymphs'"), 'The nymphs departed' (или другие глагол спряжения) будут.

Казалось бы 'The nymphs quick' не имеет смысла,но что-то вроде 'The nymphs quickly [...]' или 'The nymphs quicken' может, так что 'quick' также дает возможность для разумного перегиба.

Разбивка задач

  1. Пометка части речи, множественности, времени и т. Д. - исходных входов. Принятие к сведению этого может помочь выбрать одну из нескольких возможностей (то есть выбор между имел / имел / иметь мог бы быть более направленным, чем случайным, если пользователь ввел 'having', а не какое-то другое время). Я слышал, что Stanford POS tagger хорош, у него есть реализация в NLTK. Я не уверен, как справиться с обнаружением напряжения здесь.
  2. Рассмотрим контекст, чтобы исключить грамматически пекулярные возможности. Рассмотрим последние пару слов и их метки части речи (и время?), А также границы предложения, если таковые имеются, и из этого Бросай вещи, которые не имеют смысла. После 'The nymphs' нам не нужна ни одна статья (или, как я могу судить, определитель), ни прилагательное, но наречие или глагол могут работать. Сравнение текущего материала с последовательностями в помеченных корпусах (и / или цепях Маркова?) - или обращение к функциям проверки грамматики - может обеспечить решение для этого.
  3. Выберите слово из оставшихся возможностей (те, которые могут быть разумно выражены). Это не то, на что мне нужен ответ - у меня есть свои методы для этого. Допустим, он выбран случайным образом.
  4. Преобразовать выбранное слово при необходимости . Если информация из # 1 может быть свернута (например, возможно, флаг «множественного числа» был установлен в True), сделайте это. Если есть несколько возможностей (например, выбранное слово является глаголом, но возможны несколько времен), выберите случайным образом. В любом случае, мне нужно изменить слово перед тем, как вставить его в «стихотворение».

Я ищу советы по поводу правильности этой процедуры, а также предложения по добавлению шагов. Способы сломать эти шаги дальше также будут полезны. Наконец, я ищу предложения о том, какой инструмент может лучше всего выполнить каждую задачу.

Я старался быть максимально кратким, предоставляя достаточно информации. Пожалуйста, не стесняйтесь спрашивать у меня разъяснения! Я буду признателен за любую информацию, которую получу, и приму самый ясный / самый яркий ответ :) Спасибо!

1 Ответ

5 голосов
/ 17 декабря 2011

Я думаю, что приведенный выше комментарий к языковой модели n-граммы лучше соответствует вашим требованиям, чем анализ и разметка. Синтаксические анализаторы и тегеры (если они не изменены) будут страдать от отсутствия правильного контекста целевого слова (т. Е. Остальная часть предложения недоступна во время запроса). С другой стороны, языковые модели эффективно учитывают прошлое (левый контекст), особенно для окон длиной до 5 слов. Проблема с n-граммами заключается в том, что они не моделируют зависимости на большие расстояния (более n слов).

NLTK имеет языковую модель: http://nltk.googlecode.com/svn/trunk/doc/api/nltk.model.ngram-pysrc.html. Тег лексики может помочь вам сгладить модель больше.

Шаги, как я их вижу: 1. Получить набор слов от пользователей. 2. Создайте больший набор всех возможных изгибов слов. 3. Спросите модель, какое слово склоняется наиболее вероятно.

...