Некоторые вещи НЛП, связанные с грамматикой, тегированием, выделением корней и устранением неоднозначности слов в 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 nymphs

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

Если он выберет «иметь» , результат может быть существенно изменен, так как «имел» , «иметь» , «иметь» , «будет иметь» , »будет иметь» и т. Д. (Но не «имеет» ). (В результате получится что-то вроде «У нимф есть» , и результат с разумной изменчивостью обеспечит лучший контекст для будущих результатов ...)

Я бы хотел «депурация» быть допустимой возможностью в этом случае; в то время как «Уход нимф» не имеет смысла (это не «нимфы» ), «Нимфы ушли» (или другой глагол спряжения) будет.

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

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

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

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

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

10
задан driftcatcher 16 December 2011 в 23:37
поделиться