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