Выбор наиболее беглого текста из набора возможностей с помощью проверки грамматики (Python)

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

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

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

person driftcatcher    schedule 12.01.2012    source источник
comment
Если вы опубликуете отчет или сообщение в блоге, когда закончите работу над проектом, я буду рад его прочитать. [email protected]   -  person Rob Neuhaus    schedule 13.01.2012
comment
Можешь и сюда ссылку кинуть, мне тоже было бы интересно почитать.   -  person dmh    schedule 31.05.2012


Ответы (4)


Проверка грамматики с помощью Link Grammar

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

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

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

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

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

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

Грамматика ссылок написана на языке C. Это представляло для меня проблему, когда я впервые занимался исследованиями, так как я только год занимаюсь программированием на Python, и мне было бы трудно самостоятельно создавать привязки. Меня также беспокоило количество процессов/служб, поэтому я не хотел запускать программу Link Grammar поверх моего процесса 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 Linguistics, набору инструментов с помощью которого «вы можете выполнять изменение грамматики и семантические операции с содержанием на английском языке». Действительно, библиотеку можно использовать для спряжения глаголов, образования единственного и множественного числа существительных и многих других операций. Это как раз то, что мне было нужно. Мое приложение знает, какие слова во входных данных заменены на новый, неизменяемый язык; именно для этих частей создаются варианты с использованием методов NodeBox Linguistics.

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

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

person driftcatcher    schedule 19.01.2012
comment
Я получаю сообщение об ошибке, когда пытаюсь выполнить из парсера импорта pylinkgrammar.linkgrammar. Ошибка выглядит так ===› ImportError: /usr/local/lib/python2.7/dist-packages. /pylinkgrammar/_clinkgrammar.so: неопределенный символ: Dictionary_is_entity не могли бы вы сказать мне, что не так .. спасибо - person Gunjan; 19.12.2013
comment
@Gunjan На странице pylinkgrammar в PyPI есть инструкции по установке (см. ссылку в моем ответе). Этот другой поток SO о проблемах установки pylinkgrammar также может представлять интерес. - person driftcatcher; 19.12.2013
comment
P.S. некоторое время спустя: я давно не экспериментировал в этой области, но я хотел сказать, что существует ряд других подходов, использующих машинное обучение. Вот пример использования Deep Learning для исправления предложений, подобно автозамене телефона в текстовых сообщениях. Было бы много возможных подходов, основанных на ML. Но машинное обучение может быть особенно полезным в таком фрагментированном контексте, когда не всегда удается хорошо разобрать код. - person driftcatcher; 13.01.2017

Очень крутой проект, во-первых.

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

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

person Johnny Brown    schedule 16.01.2012
comment
Спасибо за предложение, а также за интерес к проекту :) Я рассматривал LanguageTool, но я надеюсь найти решение, которое не требует запуска другого процесса (как это, казалось бы, требуется, будучи сервером); Я получаю образовательную скидку на сервер, но у меня есть (по-видимому) строгое ограничение на количество сервисов, которые я могу запускать. Если я не смогу найти решение, не связанное с обслуживанием, мне, конечно, придется пойти на компромисс ... Тем не менее я изучу это. - person driftcatcher; 16.01.2012

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

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

person Lee Becker    schedule 01.02.2012

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

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

person Victor    schedule 21.10.2013