28 June 2010

Парсим словарь русского языка Зализняка Андрея Анатольевича

Lumber room
Понадобилось мне как-то собрать много русских существительных имён в единственном числе и именительном падеже. Стал искать на просторах Интернета. Всё, что попадалось под руку, было либо в не очень удобном формате для меня, либо любительскими сборниками. Хотелось всё-таки более официальных исходных данных, да чтобы можно было перевести в свой формат, например в таблицу базы данных MySQL.

1 сентября 2009 года вступил в силу приказ Министерства образования и науки, утверждающий перечень словарей, грамматик и справочников, рекомендованных Межведомственной комиссией по русскому языку при Минобрнауки. Среди 4 утверждённых книг — Грамматический словарь русского языка А. А. Зализняка.

Я остановился на этом словаре, во-первых, потому что в нём присутствует морфологическое описание слова, что бы вытащить, например, только глаголы совершенного вида. Во-вторых, потому что смог найти электронную версию словаря.

Был еще вариант граббинга wiktionary.org — Категория: Русские существительные. Может быть имеет смысл совместить эти две базы, но пока остановимся на Зализняке.

Словарь


Словарь Зализняка был найден на сайте проекта «Вавилонская башня», посвященному сравнительно-историческому языкознанию. Словари Ожегова, Зализняка и Фасмера доступны как в режиме онлайн, так и для скачивания.

Скачиваем файл dicts.exe от 27.11.2004. Устанавливаем. В папке c:\StarSoft\dict\ буду расположены файлы. Нам нужны только начинающиеся на Z_* (от Z_160 до Z_239). Слова в файлах сгруппированы по первым буквам. Т.е. в файле Z_160 находятся все слова, начинающиеся с буквы А, в Z_161 — с буквы Б и т.д.

Парсер


Файлы в кодировке OEM 866. Я для удобства перевёл их в UTF-8 с помощью Notepad++. Затем написал простенький парсер на PHP. Мне нужны были только существительные мужского и женского рода. Вы можете сами изменить регулярное выражение под свои нужды.
<?php<br/> <br/>mb_internal_encoding('utf-8');<br/> <br/>$dir = new DirectoryIterator(dirname(__FILE__).'/dict/');<br/>foreach ($dir as $file) <br/>{<br/> if($file->isDot()) {<br/> continue;<br/> }<br/> <br/> if (!preg_match_all('/^(\\p{L}{2,})\\s+\\d+\\s+(?:с|м|ж|мо|жо)\\s+/um', file_get_contents($file->getPathname()), $matches)) {<br/> continue;<br/> }<br/> <br/> foreach ($matches[1] as $word)<br/> {<br/> // делайте с $word что хотите<br/> }<br/>}

В итоге у меня получилась таблица с 39361 существительным.
Tags:словариЗализняк А.А.phpпарсеррусский язык
Hubs: Lumber room
+3
2.9k 20
Comments 22
Popular right now
Копирайтер, контент менеджер
from 30,000 to 40,000 ₽3snetRemote job
Технический писатель
from 80,000 ₽ЛегионМосква
PHP developer
to 250,000 ₽РНКБ Банк (ПАО)МоскваRemote job
Senior PHP Developer (Symfony) - Remote (English)
from 250,000 to 285,000 ₽Jimmy TechnologiesRemote job
Top of the last 24 hours