Выбор наиболее свободного текста из набора возможностей с помощью проверки грамматики (Python) - PullRequest
30 голосов
/ 13 января 2012

Некоторый фон

Я учусь на литературу в Нью-колледже Флориды, в настоящее время работаю над чрезмерно амбициозным творческим проектом. Проект направлен на алгоритмическую генерацию поэзии . Это написано на 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 , оценка беглости путем подсчета грамматических ошибок:

  1. Используйте методы спряжения глаголов в Лингвистика NodeBox , чтобы придумать все спряжения этого глагола;['bear', 'bears', 'bearing', 'bore', 'borne'].
  2. Перебирайте возможности, (поверхностно) проверяя грамматику строки, полученной из existing_text + " " + possibility («Старый речной медведь», «Старые речные медведи» и т. Д.).Подсчитайте количество ошибок для каждой конструкции.В этом случае единственной конструкцией, вызывающей ошибку, по-видимому, будет «Старый речной медведь».
  3. Подведение итогов должно быть простым ... Из вариантов с наименьшим количеством ошибок выберите случайным образом.

Ответы [ 4 ]

11 голосов
/ 19 января 2012

Проверка грамматики с помощью Грамматика ссылок

Введение в грамматику ссылок

Грамматика ссылок, разработанная Дэви Темперли, Даниэлем Слеатором и Джоном Лафферти, является синтаксическим синтаксическим анализаторомАнглийский: «Принимая предложение, система присваивает ему синтаксическую структуру, которая состоит из набора помеченных ссылок, соединяющих пары слов. Парсер также создает« составное »представление предложения (с указанием имен существительных, глагольных фраз и т. Д..) «.Вы можете узнать больше о Link Grammar и , чтобы взаимодействовать с онлайн-парсером здесь .

Несколько лет назад AbiWord взял проект за .Они объясняют, что AbiWord использует грамматику ссылок для проверки грамматики. Я не знаю тонкостей того, как AbiWord фактически выполняет их проверку грамматики, но я читал об основном подходе в вопросах и ответах о проверке грамматики (ссылка на которую я сейчас потерял).В отличие от некоторых других синтаксических анализаторов, с которыми я взаимодействовал, грамматика ссылок дает очень разные результаты, когда предложение не имеет грамматически правильной формы: не может найти полную связь для грамматически неправильных предложений .

Вы можете убедиться в этом с помощью онлайн-парсера : , введя предложение «Это человек, чью собаку я купил» производит 1 связь, тогда как «ЭтоЧеловек, чью собаку я купил "не производит полных связей.

Это не" подсчитывает "количество ошибок, как я и просил.Однако он выполняет оригинальный для способ исключить грамматически неправдоподобные (то есть неправильно сопряженные) возможности.

Привязки Python: они существуют!

Грамматика ссылокнаписано на C. Это представляло для меня проблему, когда я впервые занимался исследованиями, так как я только год изучаю кодирование на Python, и мне было бы трудно создавать привязки самостоятельно.Меня также беспокоило количество процессов / сервисов, поэтому я не хотел запускать программу грамматики ссылок поверх процесса Python.Но через день или два после публикации этого вопроса 13 января я столкнулся с вкладом Джеффа Элмора (enzondio) pylinkgrammar в PyPi - который произошел всего за день до этого.

pylinkgrammar страница объясняет, вам все еще нужно сначала собрать и установить linkgrammar. Инструкции по его использованию находятся на этой странице.Но некоторые предостережения относительно установки pylinkgrammar:

  1. Мне не удалось заставить pylinkgrammar работать на Python 2.7 с Windows 7, , что, по-моему, связано с проблемами при работе CMake сPython 2.7 в Windows 7.
  2. Таким образом, я переместил весь свой проект в Ubuntu (10.10), потому что мне это было так нужно.Но когда я установил Ubuntu, я попытался установить все для Python 2.7 (даже удалил 2.6). Я все еще не мог заставить pylinkgrammar работать с Python 2.7. Я думаю, что это все еще происходило из-за проблем между CMake и Python 2.7.
  3. Я начал заново с установкой Ubuntu, потому что все стало грязно,и вместо этого настроить все с Python 2.6. Теперь я получил pylinkgrammar, работающий с Python 2.6. (Но мне нужно набрать from pylinkgrammar.linkgrammar import Parser, что немного отличается от инструкций на странице pypi).

NodeBox Linguistics: другая часть моего решения

В своем вопросе я заявил о необходимости генерировать все перегибы / спряжения данного предложения, , чтобы проверить все эти вариантыи устранить грамматически неправдоподобные предметы.(Я использую WordNet, чтобы изменить некоторые части пользовательского ввода перед выводом, и результаты WordNet не отражаются; их нужно изменить, чтобы сделать выводы (более) понятными).

Очень информативный пост блога привел меня к Библиотеке лингвистики NodeBox , набор инструментов, с помощью которых "вы можете сделать перегиб грамматики и семантические операции над английским контентом. "Действительно, библиотека может использоваться для спряжения глаголов, сингулярного и множественного числа существительных среди многих других операций.Это как раз то, что мне было нужно.Мое приложение знает, какие слова в вводе оно поменялось на новый, неотраженный язык;эти фрагменты - те, для которых он генерирует вариации, используя методы в NodeBox Linguistics.

Я передаю эти вариации в pylinkgrammar и отбрасываю вариации, для которых не удается найти полные связи. Иногда это приводит квообще никаких результатов, но чаще всего это приносит полезные результаты.Обратите внимание, что Грамматика ссылок не найдет полных связей для большинства неполных предложений. Если вы хотите проверить спряжения в фрагментированных предложениях, как я, попробуйте расширение фрагментированных предложений с помощью наполнителя перед проверкой, а затем пропуститезаполнитель перед выводом. Я получаю этот «заполнитель», беря последнее слово из данных, ища его в корпусе Брауна и добавляя оставшуюся часть этого предложения из корпуса.

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

2 голосов
/ 16 января 2012

Очень крутой проект, в первую очередь.

Я нашел java грамматику .Я никогда не использовал его, но документы утверждают, что он может работать как сервер.И Java, и прослушивание порта должны поддерживаться практически везде.

Я только начинаю работать в НЛП с опытом работы в CS, поэтому я не возражаю углубиться в детали, чтобы помочь вам интегрировать все, что вы решите использовать.Не стесняйтесь спрашивать более подробную информацию.

1 голос
/ 21 октября 2013

Приведенная выше ссылка на pylinkgrammar немного устарела. Он указывает на версию 0.1.9, и примеры кода для этой версии больше не работают. Если вы идете по этому пути, обязательно используйте последнюю версию, которую можно найти по адресу:

https://pypi.python.org/pypi/pylinkgrammar

1 голос
/ 01 февраля 2012

Другим подходом было бы использование того, что называется перерождением и ранговым подходом.На первом этапе ваш генератор стихов генерирует несколько поколений кандидатов.Затем с помощью сервиса Amazon Mechanical Turk собирать суждения о беглости.Я бы на самом деле предложил собрать одновременные суждения для ряда предложений, сгенерированных из одинаковых начальных условий.Наконец, вы извлекаете функции из сгенерированных предложений (предположительно, используя синтаксический синтаксический анализатор в той или иной форме), чтобы обучить модель оценивать или классифицировать качество вопроса.Вы могли бы даже добавить эвристику, перечисленную выше.

Майкл Хейлман использует этот подход для генерации вопросов.Для более подробной информации, прочитайте эти статьи: Хороший вопрос!Статистический рейтинг для генерации вопросов и Рейтинг компьютерных вопросов с помощью Mechanical Turk .

...