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