Подтвердить что ты не робот

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

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

Я преподаватель литературы в 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 ( "Старый медведь реки", "Старая речная медведица" и т.д.). Подсчитайте количество ошибок для каждой конструкции. В этом случае единственной конструкцией для поднятия ошибки, казалось бы, было бы "Старый медведь".
  • Обтекание должно быть легким... Из возможностей с наименьшим количеством ошибок выберите случайное.
4b9b3361

Ответ 1

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

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

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

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

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

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

Связи Python: они существуют!

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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