Некоторые вещи НЛП, связанные с грамматикой, тегами, выделением корней и устранением неоднозначности слов в Python

Справочная информация (TL; DR; предоставляется для завершения)

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

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

Я работаю с фрагментарным, атомарным языком. Пользователи вводят слова и фрагменты предложений, а WordNet используется для поиска связей между входными данными и создания новых слов и предложений / фрагментов. Мой вопрос заключается в том, чтобы превратить неотражаемое слово из WordNet (синсета) во что-то, имеющее контекстный смысл.

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

Пример сценария

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

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

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

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

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

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

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

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

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


person driftcatcher    schedule 16.12.2011    source источник
comment
Вы рассматривали возможность использования языковой модели n-грамм, а не части речевого теггера? Они часто используются в системах НЛП для машинного перевода или преобразования речи в текст, когда вы хотите программно выбрать свободный текст из набора параметров, учитывая некоторую предыдущую историю.   -  person Rob Neuhaus    schedule 17.12.2011
comment
@rrenaud n-граммовые языковые модели полезны в машинном переводе в сочетании с моделями выравнивания (простейшая из них - статистическая модель зашумленного канала) для выбора порядка слов. В этом случае я подозреваю, что дерево синтаксического анализа из nltk или Stanford POS tagger было бы немного более ценным. Майкл, возможно, стоит взглянуть на некоторые простые модели выравнивания слов, которые в сочетании с приличной языковой моделью будут правильно обрабатывать время / множественное число в приличном проценте случаев (скажем, около 80-90%).   -  person Alex Churchill    schedule 17.12.2011
comment
@eowl Следует ли переместить / продублировать вопрос? Я не уверен, что это за протокол ... Сайт стека НЛП - такая захватывающая идея :)   -  person driftcatcher    schedule 17.12.2011


Ответы (1)


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

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

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

person cyborg    schedule 17.12.2011
comment
Хорошо, я подозревал, что n-граммы будут наиболее подходящими для таких предсказаний в маленьком окне, но хотел подтверждения. Это звучит неплохо. Теперь я знаю, что сглаживание поможет в словах с нулевой частотой. Но, наверное, у меня будет много слов с нулевой частотой. Возможное решение: сделать корпус, альтернативный моему корпусу нормальных слов, где все слова были заменены тегами (например, POS), и когда я нажимаю слова с нулевой частотой, откат к n-граммовой модели, основанной на 'POS корпус '? Так что, если точная последовательность неизвестна, возможно, можно выбрать вероятную грамматическую структуру. Есть предположения? - person driftcatcher; 17.12.2011
comment
Как узнать часть речи неизвестного слова? Возможности формы слова могут немного помочь (* ly - наречие, * ies, скорее всего, глагол), но я бы пока не особо об этом беспокоился. Сначала создайте прототип, потом беспокоитесь о потенциальных проблемах. - person Rob Neuhaus; 18.12.2011
comment
Есть действительно хорошие английские словари. Как вы думаете, каких слов будет не хватать? Имена собственные? Старый английский? - person cyborg; 18.12.2011
comment
Что ж, я подумал, что мог бы сделать свой собственный n-граммовый корпус из текстов известных стихов (я собирался взять пару сотен лучших файлов в разделе поэзии на Project Gutenberg), а не корпус прозы. Я подумал, что пользователи могут использовать слова, которые создают последовательность, которой нет в корпусе. Слова, которые неизвестны моему корпусу, могут еще быть известны устройству тегов POS, поэтому при необходимости они могут быть переведены в статус POS. В любом случае я создам прототип, который сначала игнорирует эти случаи, хороший момент! - person driftcatcher; 18.12.2011