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