Некоторый фон
Я изучаю литературу в Новом колледже Флориды и в настоящее время работаю над чересчур амбициозным творческим проектом. Проект ориентирован на алгоритмическое создание поэзии. Он написан на Питоне. Мои знания Python и обработки естественного языка получены только благодаря обучению через Интернет. Я работаю с этим около года, так что я не беспомощен, но в разные моменты у меня были проблемы с продвижением этого проекта. В настоящее время я вхожу в финальную фазу разработки и столкнулся с небольшим препятствием.
Мне нужно внедрить какую-то форму грамматической нормализации, чтобы на выходе не получился неспрягаемый/флективный язык пещерного человека. Около месяца назад несколько дружелюбных людей на SO дал мне несколько советов о том, как я могу решить эту проблему в основном с помощью программы моделирования языка ngram, но я ищу другие решения, так как мне кажется, что NgramModeler от NLTK не подходит для моих нужд. (Возможности POS-тегов также упоминались, но мой текст может быть слишком фрагментарным и странным, чтобы его реализовать было легко, учитывая мое дилетантство.)
Возможно, мне нужно что-то вроде AtD, но, надеюсь, менее сложное.
Я думаю, мне нужно что-то, что работает, например After the Deadline или Queequeg, но ни один из них не кажется правильным. Queequeg, вероятно, не подходит - он был написан в 2003 году для Unix, и я не могу заставить его работать в Windows всю жизнь (перепробовал все). Но мне нравится, что все, что он проверяет, это правильное спряжение глаголов и числовое соответствие.
С другой стороны, AtD гораздо более строгий, предлагая больше возможностей, чем мне нужно. Но я не могу получить привязки python а> для того, чтобы это работало. (Я получаю 502 ошибки от сервера AtD, которые, я уверен, легко исправить, но мое приложение будет в сети, и я предпочитаю избегать зависимости от другого сервера. Я не могу позволить себе запустить сервер AtD себя, потому что количество «сервисов», которые мое приложение потребует от моего веб-хостинга, уже угрожает вызвать проблемы с дешевым размещением этого приложения.)
Вещи, которых я хотел бы избежать
Самостоятельное построение языковых моделей Ngram кажется неподходящим для этой задачи. мое приложение содержит много незнакомой лексики, что искажает все результаты. (Если только я не использую настолько большой корпус, что он работает слишком медленно для моего приложения — приложение должно работать довольно быстро.)
Строгая проверка грамматики не подходит для этой задачи. грамматика не должна быть идеальной, а предложения не должны быть более осмысленными, чем та английская тарабарщина, которую вы можете генерировать с помощью ngrams. Даже если это тарабарщина, мне просто нужно обеспечить спряжение глаголов, согласование чисел и такие вещи, как удаление лишних артиклей.
На самом деле мне даже не нужны никакие предложения по исправлению. Я думаю, все, что мне нужно, это подсчитать, сколько ошибок встречается в каждом предложении в группе возможных предложений, чтобы я мог отсортировать их по их количеству и выбрать то, в котором меньше всего грамматических проблем.
Простое решение? Оценка беглости путем обнаружения очевидных ошибок
Если существует скрипт, который позаботится обо всем этом, я был бы вне себя от радости (я еще не нашел его). Конечно, я могу написать код для того, чего не могу найти; Я ищу совета о том, как оптимизировать мой подход.
Допустим, у нас уже есть небольшой текст:
existing_text = "The old river"
Теперь предположим, что моему сценарию нужно вычислить, какое склонение глагола «нести» может быть следующим. Я открыт для предложений по поводу этой рутины. Но мне нужна помощь в основном в шаге 2, оценивающем беглость речи путем подсчета грамматических ошибок:
- Используйте методы спряжения глагола в NodeBox Linguistics, чтобы получить все спряжения этого глагола;
['bear', 'bears', 'bearing', 'bore', 'borne']
. - Переберите возможные варианты, (поверхностно) проверив грамматику строки, полученной из
existing_text + " " + possibility
("Старый речной медведь", "Старый речной медведь" и т. д.). Подсчитайте количество ошибок для каждой конструкции. В этом случае единственной конструкцией, вызывающей ошибку, казалось бы, будет "Старый речной медведь". - Завершение должно быть легким... Из возможностей с наименьшим количеством ошибок выберите случайным образом.