Назад в библиотеку

Морфологический анализатор и генератор для русского и украинского языков

Автор: Михаил Коробов

Перевод: Круть Андрей

Источник: Cornell University, USA.

Аннотация. pymorphy2 — морфологический анализатор и генератор для русский и украинский языки. Он использует большие эффективно закодированные лексиконы, созданные на основе данных OpenCorpora и LanguageTool. Разработан набор лингвистически мотивированных правил, позволяющих проводить морфологический анализ и генерация слов, не входящих в словарь, наблюдаемых в реальных документах. Для русского языка pymorphy2 обеспечивает современный морфологический анализ качество. Анализатор реализован на языке программирования Python. с необязательными расширениями C++. Особое внимание уделяется простоте использования, документации и расширяемости. Пакет распространяется под разрешительным лицензия с открытым исходным кодом, поощряющая ее использование как в академических, так и в коммерческих целях.

Ключевые слова: морфологический анализатор, русский, украинский, морфологический генератор, с открытым исходным кодом, OpenCorpora, LanguageTool, pymorphy2, pymorphy

1. Введение

Морфологический анализ – это анализ внутренней структуры слов. Для языков с богатой морфологией, такой как русский или украинский, с использованием морфологического анализа можно выяснить, может ли слово быть существительным или глаголом, или может быть единственное или множественное число. Морфологический анализ находится на важном этапе естественного конвейеры языковой обработки для таких языков.

Морфологическое порождение — это процесс построения слова по его грамматическому представлению; это включает лемматизацию, флексию и поиск слова лексемы.

pymorphy2 — морфологический анализатор и генератор для русского и украинского языков. Язык широко используется в промышленности и в научных кругах. Он разрабатывается с 2012 г.; Украинская поддержка появилась совсем недавно. Развитие предшественника, pymorphy1, началось в 2009 году. Пакет доступен под лицензией (MIT), и он использует словарные данные с открытым исходным кодом с разрешительной лицензией.

Остальная часть этой статьи организована следующим образом. Раздел 2 объясняет, как pymorphy2 использует словари и как работает анализ и морфологическая генерация для словарных слов. Раздел 3 посвящен проблеме выбора правильного анализа из всех возможных. анализов и роль морфологического анализатора в этой задаче. В разделе 4 представлены результаты оценки. Раздел 5 описывает дорожную карту для будущего pymorphy2 улучшения.

2. Анализ словарных слов

pymorphy2 полагается на большие словари для анализа общих слов. Для русского он использует словарь OpenCorpora [3] (~ 5 * 10^6 словоформ, ~ 0,39 * 10^6 леммы) преобразованый из OpenCorpora XML6 формата в компактное представление, оптимизированное для задач морфологического анализа и генерации. Конечные пользователи не должны сами составляют словари; pymorphy2 поставляется с предварительно собранными периодически обновленные словари.

Любой словарь в формате OpenCorpora XML может использоваться pymorphy2. Для украинского языка есть такой экспериментальный словарь (~ 2,5 * 10^6 словоформ) разрабатывают Андрей Рысин, Дмитрий Чаплинский, Марьяна Романишина и другие участники; он основан на данных LanguageTool8.

Исходный словарь содержит словоформы с их тэгами, сгруппированные по лексемам. Например, лексема для леммы «ёж» (ёжик) выглядит так:

Рис. 1 - Лексема для леммы «ёж»

В словарях-источниках также могут быть связи между лексемами. Например, лексемы для форм инфинитива, глагола, герундия и причастия одной и той же леммы могут быть на связи. В настоящее время pymorphy2 объединяет связанные лексемы в одну лексему. для большинства типов ссылок.

2.1 Морфологический анализ и генерация

Имея словарь, проанализировать слово означает найти все возможные грамматические теги к слову. Получение нормальной формы (лемматизация) есть нахождение первого словоформа в лексеме. Изменять слово означает находить другую форму слова в та же лексема с запрашиваемыми граммемами.

Как видно, все эти задачи несложные. С анализом словаря XML известных слов можно выполнить, просто запустив запросы к файлу XML.

Проблема в том, что запрос XML — это O(N) с большими постоянными множителями, необработанными данные занимают довольно много памяти, а исходный словарь плохо подходит для морфологический анализ и генерация слов, не входящих в словарь.

Чтобы создать компактное представление и обеспечить быстрый доступ, pymorphy2 кодирует информация о лексемах: все слова хранятся в DAFSA [5] с использованием dawgdic9 C++. библиотека [11] через Python wrapper; информация о тегах слов и лексемах закодированы как числа. Схема хранения близка к схеме описанной на aot.ru [10], но это не совсем то же самое.

Парадигмы Парадигма в pymorphy2 — это образец словоизменения лексемы. Это состоит из префикса, суффикса, тройки тегов, по одной на каждую словоформу в лексеме, например, каждая словоформа и может быть представлена ​​как префикс + основа + суффикс, где основа одинакова для всех слов в лексеме.

Это представление позволяет нам разложить лексему на основу и парадигму.

Префиксы, суффиксы и теги Парадигм кодируются как числа с помощью pymorphy2; лексемные основы отбрасываются. Это означает, что парадигма хранится в виде массива числа (префиксы, суффиксы и идентификаторы тегов), а также лексемы не сохраняются явно - они реконструируются по запросу из словесной и парадигмальной информации.

В исходном словаре нет парадигм; pymorphy2 делает вывод их из лексем. Для русского языка выведено около 3200 парадигм. из 390000 лексем.

Хранилище слов Словарные формы с информацией об их анализе хранятся в ДАФСА. Были опробованы и другие схемы хранения, в том числе схема с двумя попытками, аналогичная описанные в [9] (но с использованием двойных массивов) и краткие (MARISA11) попытки. Для данных pymorphy2 DAFSA обеспечивает наиболее компактное представление, а при в то же время он был самым быстрым и имел самую гибкую поддержку итераций.

Рис. 2 - Пример кодировки DAFSA. Закодированы (word, paradigmId, formIndex) тройки: (двор, 103, 0); (ёж, 104, 0); (дворник, 101, 2); (дворник, 102, 2); (ёжик, 101, 2); (ёжик, 102, 2)

Для каждой словоформы pymorphy2 хранит тройки (word, paradigmId, formIndex): – словоформа, как текст; – идентификатор своей парадигмы; – индекс словоформы в лексеме.

DAFSA не поддерживает прикрепление значений к листьям; информация кодируется следующим образом: < word > SEP < paradigmId >< formIndex > (см. пример на рис. 2)12.

Хранение особенно эффективно, потому что слова с похожими окончаниями часто иметь одинаковые анализы, т.е. одинаковые (paradigmId, formIndex) пары; это позволяет DAFSA использовать меньше узлов/переходов для представления данных. DAFSA для Русский словарь OpenCorpora (5 * 10^6 анализов, около 3 * 10^6 уникальных слов формы) обеспечивает быстрый поиск (сотни тысяч запросов в секунду из Python) и занимает менее 7 МБ оперативной памяти; исходный файл XML занимает около 400 МБ на диске.

Чтобы получить все анализы слова, следуют переходы DAFSA для слова, затем следует разделитель SEP, а затем просматривается оставшееся поддерево, чтобы получить все возможные пары (paradigmId, formIndex).

По заданной паре (paradigmId, formIndex) можно найти грамматический тег word: найти парадигму в массиве paradigms по paradigmId, получить (префикс, суффикс, теги) утроить парадигму, используя i := formIndex. По полученным данным (paradigmId, formIndex) можно восстановить лексему и лемматизировать или склонить слово - из слова, префикса и суффикса мы можем получить основу, и учитывая основу и (префикс, суффикс, теги) можно восстановить полное слово для количественной словоформы.

2.2 Эффективная работа с символами «ё» и «ґ»

Использование буквы «ё» в русском языке необязательно; в реальных текстах часто заменяется с буквой "е". В украинском языке правила замены "ґ" / "г" другие, но на практике встречаются тексты реального мира, в которых буквы «ґ» заменены на «г».

Самый простой способ справиться с этим - заменить "ё" / "ґ" на "е" / "г" оба во вводном тексте и в словаре. Однако это неоптимально, поскольку отбрасывает полезную информацию, делает текст менее корректным (по-украински "г" вместо "ґ" можно рассматривать как орфографическую ошибку) и увеличивает двусмысленность: слова, анализ которых должен зависеть от е/ё и ґ/г. Например, слово «все» следует анализировать во множественном числе, а слово «всё» — нет.

pymorphy2 предполагает, что использование «ё» / «ґ» в словаре обязательно, но в ввод текста не является обязательным. Например, если русское входное слово содержит "ё" письмо, то возвращаются только анализы с этим письмом; если есть буквы "е" в входное слово, то возвращаются возможные анализы как для "е", так и для "ё".

Простым способом реализовать это будет проверка каждой комбинации е/ё. и ґ/г замена входного слова. Это не то, как работает pymorphy2. К выполнить задачу эффективно, pymorphy2 использует структуру словаря DAFSA [5]: результат строится путем обхода графа символов слова и попытки следовать за «ё» переходы в дополнение к переходам «е» (для русского языка) и переходам «ґ» в дополнение к переходам "г" (укр.).

3. Оценка вероятности

Морфологический анализатор может возвращать несколько возможных разборов слова. Проблема выбора правильного анализа из списка возможных вариантов называется устранением неоднозначности. Как правило, для выбора правильного анализа требуется верить на слово контекст в аккаунте. Морфологический анализатор принимает на вход отдельные слова, поэтому он не может надежно устранить неоднозначность результата. Однако он может дать оценку условной вероятности P(анализ|слово). Такие оценки вероятности может использоваться в отсутствие специального средства устранения неоднозначности для выбора наиболее вероятного анализ. Кроме того, эти вероятности можно использовать на более поздних стадиях анализ текста, например, с помощью средства устранения неоднозначности.

Для оценки условной вероятности P(анализ|слово) для русских слов pymorphy2 использует корпус OpenCorpora с частичным устранением неоднозначности [3] и предполагает, что P(анализ|слово) = P(тег|слово). Условная вероятность оценивается для слова, которые имеют множественный анализ в соответствии с pymorphy2, но имеют вхождения с единственным оставшимся анализом в корпусе OpenCorpora; оценка представляет собой оценку максимального правдоподобия со сглаживанием Лапласа.

Счетчики вычисляются на основе данных корпуса OpenCorpora; все слова с одним оставшиймся анализом берутся во внимание.

После оценки результат сохраняется на диске как DAFSA; ключи:

Для слов без оценок PMLE(тег|слово) назначаются вероятности равномерно во время синтаксического анализа.

Для украинского языка вероятности назначаются единообразно, т.к. на момент написания нет в свободном доступе украинского корпуса, подобного OpenCorpora.

4. Оценка

Оценка качества анализа различных морфологических анализаторов для русского языка не так просто, потому что большинство анализаторов (а также аннотированных корпусов) используют их собственные несовместимые наборы тегов. И когда корпус и словарь имеют совместимый набор тегов обычно означает, что словарь был расширен из корпуса, и это проблема, потому что числа качества, полученные на корпусе, словарь был расширен из не следует полагаться - они слишком оптимистичны.

Качество анализа pymorphy2 сравнивали с качеством анализа известного морфологического анализатора Mystem 3.0 [9]. Тестовый корпус состоит из 100 случайно выбранные предложения (1405 токенов) из OpenCorpora (microcorpus) и 100 случайно выбранных предложений (1093 токена) от ruscorpora.ru - 2498 общее количество токенов, устраненных вручную.

Полную информацию об этой оценке можно найти в Интернете.

Набор тегов OpenCorpora (pymorphy2) отличается от набора тегов ruscorpora.ru, и набор тегов ruscorpora.ru отличается от набора тегов Mystem. В целях оценки все теги были преобразованы в формат Mystem с использованием набора автоматических правил. Качество оценивался по полным морфологическим тегам, т.е. теги должны точно совпадать, чтобы быть считается правильным, за некоторыми исключениями, связанными с проблемами преобразования тегов. Все обнаруженные ошибки были проверены вручную, чтобы отфильтровать ложные срабатывания.

Таблица ошибок

И pymorphy2, и Mystem допустили менее 1% ошибок (без устранения неоднозначности, т.е. менее чем в 1% случаев правильного анализа не было в наборе анализов возвращается анализатором). Следует отметить, что 9 из 19 ошибок pymorphy2 и 14 из 23 ошибок Mystem были связаны с обработкой аббревиатур. Mystem лучше обрабатываются имена и фамилии (1 ошибка против 4 у pymorphy2); pymorphy2 сделал меньше ошибок для «обычных» слов (4 против 6 для mystem). Mystem не может анализировать множество слов через дефис как один токен; такие слова не рассматривались. Пунктуация, цифры и нерусские слова также были удалены из ввод.

Количественный вывод сделать сложно, так как размер корпуса небольшой. Оба анализатора имеют одинаковое качество анализа, а полученные цифры зависят об оценочных мелочах: ​​учитываются ли сокращения или нет, должны ли мы требуют разбора слов, написанных через дефис, мы требуем, чтобы переходность глагола была предсказано правильно, важно ли отличать наречия от скобок и т. д.

При анализе данных OpenCorpora было обнаружено несколько человеческих ошибок в аннотациях. с mystem (1 ошибка) и данными ruscorpora с pymorphy2 (6 ошибок). OpenCorpora разделяет словарь с pymorphy2, а аннотация ruscorpora связана с mystem; это показывает полезность использования межкорпусных инструментов для проверки аннотации.

На сегодняшний день самым сложным русским морфологическим парсером является pymorphy2 [1]; За первенство участвовала и предыдущая версия pymorphy2 - (pymorphy) в треках без значений; он занял 1-е место по полному морфологическому анализу, 3-е место по лемматизации, 3-е место по тегам POS и 5-е место по треку редких слов. pymorphy не участвовал в следах значений неоднозначности.

pymorphy использовал некоторые правила pymorphy2 (не все) и другой словарь (взято из [10] вместо [3]). Как правило, pymorphy2 должен работать лучше чем pymorphy из-за улучшенного словаря и правил, но это не количественно еще не измерены.

5. Заключение и планы на будущее

Для pymorphy2 используется лицензия с открытым исохдным кодом (MIT). Все словари и корпуса, от которых зависит pymorphy2, также доступны по разрешающим лицензиям с открытым исходным кодом. Несомненно, это удобно и благодаря этому можно внести свои изменения

Разработка pymorphy2 ещё не закончена. Есть классы слов для которых анализ pymorphy2 может быть улучшен. Некоторые из них: люди последние и отчества, имена иностранных граждан, уменьшительно-ласкательные имена, местонахождения, прописные и другие сокращения, некоторые классы слов, написанных через дефис, порядковые числительные (в том числе порядковые числительные, записанные в цифровом обозначении типа "22-й"). В соответствии [1] аналогичные проблемы характерны для российских морфологических анализаторов.

Неконтекстные оценки P(tag|word) можно улучшить, передав некоторую информацию о похожих словах и путем улучшения корпусов.

Для лучшего сравнения pymorphy, pymorphy2, Mystem и других морфологических анализаторов может потребоваться надежная библиотека преобразования наборов тегов.

Поддержка украинского языка является экспериментальной. Словарь требует работы, pymorphy2 нуждается в большем количестве специфичных для Украины правил для обработки словарного запаса слов, а для лучшей оценки P(tag|word) аннотированный украинский корпус необходимо: даже небольшой корпус (или даже составленный вручную список частот) должен исправить значительное количество «очевидных» ошибок.

Есть планы добавить поддержку белорусского языка в pymorphy2 на основе грамматической базы белорусского языка N-korpus.

Хотя pymorphy2 уже достаточно быстр для многих случаев использования (десятки тысяч слов в секунду в одном потоке), есть смысл для дальнейшей оптимизации ради увеличения скорости обработки.

Список использованной литературы


1. Astaf ’eva I., Bonch-Osmolovskaya A., Garejshina A., Grishina Ju., D’jachkov V., Ionov M., Koroleva A., Kudrinsky M., Lityagina A., Luchina E., Sidorova E., Toldova S., Lyashevskaya O., Savchuk S.,Koval’ S.: NLP Evaluation: Russian Morphological Parsers. In: Kibrik A. (ed.). Computational Linguistics and Intellectual Technologies. Papers from the Annual International Conference “Dialogue”. Volume 1. (2010)

2. Bocharov, V.V., Granovsky, D.V., Surikov, A.V.: Probabilistic Tokenization Model in the OpenCorpora Project [Veroyatnastnaya model’ tokenizacii v proekte Otkritiy Korpus]. In: New Information Technology in Automated Systems: proceedings of the 15th seminar [Noviye informacionnie tehnologii v avtomatizirovannih sistemah: materiali pyatnadcatogo nauchno-prakticheskogo seminara]. M., 2012.

3. Bocharov, V.V., Alexeeva, S.V., Granovsky, D.V., Protopopova, E.V., Stepanova, M.E., Surikov, A.V.: Crowdsourcing morphological annotation. In: Selegey V. (ed.) Computational Linguistics and Intellectual Technologies. Papers from the Annual International Conference “Dialogue”. Volume 1. (2013).

4. Bolshakov, I. A., Bolshakova, E. I.: An Automatic Morphological Classifier of Noun Phrases in Russian. In: Kibrik A. (ed.) Computational Linguistics and Intellectual Technologies. Papers from the Annual International Conference “Dialogue” Volume 1. (2012).

5. Daciuk, J., Watson, B.W., Mihov, S., Watson, R.E.: Incremental Construction of Minimal Acyclic Finite-State Automata. Computational Linguistics 26(1) (March 2000) 3-16

6. Daciuk, J.: Treatment of Unknown Words. In: proceedings of Workshop on Implementing Automata WIA’99, Potsdam, Germany, 1999, (C) Springer Verlag LNCS Series Volume 2214, pp. 71-80, 2001.

7. Krylov, S. A., Starostin, S. A.: Current Morphological Analysis and Synthesis Challanges in the STARLING system [Aktualniye zadachi morfologicheskogo analiza i sinteza v integrirovannoy informacionnoy srede STARLING]. In: Proceedings of the International Conference “Dialog 2003” (2003)

8. Mikheev, A.: Automatic Rule Induction for Unknown Word Guessing. In: Computational Linguistics, Vol. 23(3) (1997). 405-423.

9. Segalovich, I.: A fast morphological algorithm with unknown word guessing induced by a dictionary for a web search engine. In Proc. of MLMTA-2003 Las Vegas (2003).

10. Sokirko, A.: Morphological Modules on the web-site www.aot.ru [Morphologicheskie Moduli na saite www.aot.ru]. Computational Linguistics and Intelligent Technologies: Proceedings of the International Conference “Dialog 2004” (2004).

11. Yata, S., Morita, K., Fuketa, M., Aoe, J.: Fast String Matching with Space-efficient Word Graphs. Innovations in Information Technology (Innovations ’08) Al Ain, United Arab Emirates (December 2008) 79-83

12. Zaliznjak, A. A.: Grammaticeskij slovar’ russkogo jazyka. Moscow, Russia (1977).

13. Zanegina, N. N.: Improvised-temporary-compounds as a new expressive mean in Russian. In: Kibrik A. (ed.) Computational Linguistics and Intellectual Technologies. Papers from the Annual International Conference “Dialogue” Volume 1. (2012).

14. Zipf, G.K.: Selected Studies of the Principle of Relative Frequency in Language. Cambridge, MA.: Harvard University Press (1932).