Это не всегда удобно, не всегда красиво, не всегда уместно. Русский язык одарён богатой морфологией, которая несколько затрудняет его автоматическую обработку. Всем известно, что антропонимы, как полагается именам существительным, подчиняются всем правилам словообразования.
Для решения этой проблемы при использовании Ruby существует Petrovich — удобная легковесная библиотека для автомагического склонения русскоязычных имён, фамилий и отчеств.
Суть
В основе алгоритма Petrovich лежит база правил словообразования, составленная вручную. Прикладному программисту работать с библиотекой будет очень легко: на входе указывается слово в канонической форме, на выходе получается слово запрошенного рода и падежа.
Использование
Базовый синтаксис достаточно прост для понимания.
petrovich = Petrovich.new(:male) petrovich.lastname('Иванов', :dative) # => Иванову petrovich.firstname('Пётр', :dative) # => Петру petrovich.middlename('Сергеевич', :dative) # => Сергеевичу
Как можно заметить, имеется два параметра, которые описывают поведение анализатора: в конструктор класса Petrovich
передаётся пол, вторым параметром метода склонения передаётся падеж.
Во-первых, половая принадлежность имени. Petrovich рассматривает три варианта:
- мужской пол,
:male
; - женский пол,
:female
; - «андрогинный» пол,
:androgynous
, при котором форма фамилии не зависит от пола человека. Например, Прокопенко.
Во-вторых, требуемый падеж. Допустимые падежи, изменяющие слово, описаны ниже в таблице.
Падеж | Характеризующий вопрос | Обозначение |
---|---|---|
Родительный | Кого? Чего? | genitive |
Дательный | Кому? Чему? | dative |
Винительный | Кого? Что? | accusative |
Творительный | Кем? Чем? | instrumental |
Предложный | О ком? О чём? | prepositional |
Имеется возможность подмешать модуль Petrovich::Extension
в любой класс. Это особенно полезно при использовании ActiveRecord и подобных ORM.
class User < ActiveRecord::Base include Petrovich::Extension petrovich :firstname => :my_firstname, :middlename => :my_middlename, :lastname => :my_lastname, :gender => :my_gender def my_firstname 'Пётр' end def my_middlename 'Ашотович' end def my_lastname 'Бонч-Соколов-Скаля' end # Если пол не был указан, используется автоматическое определение # пола на основе отчества. Если отчество также не было указано, # пытаемся определить правильное склонение на основе файла правил. def my_gender :male # :male, :female или :androgynous end end
При помощи метода petrovich
указываются методы, представляющие фамилию, имя и отчество. В данном примере указано, что метод my_firstname
представляет имя, метод my_lastname
представляет фамилию, метод my_middlename
представляет отчество. Ничто не мешает подмешать модуль и в обычный класс, всё будет работать так же хорошо. В целевой класс будут добавлены методы с падежами, описанными в таблице.
user = User.new user.my_firstname # => Пётр user.my_firstname_genitive # => Петра user.my_middlename_genitive # => Ашотовича user.my_lastname_genitive # => Бонч-Соколова-Скаля
Некоторые особенности русского правописания учитываются достаточно хорошо.
Оценка точности
Ради приличия, проводилась оценка точности склонения слов. В качестве эталона взят список фамилий и их форм из морфологического словаря АОТ. Точность оценивалась на основе обработки 88 314 примеров по формуле
,
где case — падеж, gender — пол, Vcase,gender — количество верных словоизменений для указанного падежа и рода, Ncase,gender — общее количество примеров для указанного падежа и рода.
На момент написания статьи наблюдается средняя точность 99,6614% на основе обработки 88 314 примеров. Детали приведены ниже в таблице. Эта информация может быть полезна при использовании Petrovich в боевых условиях.
Пол / Падеж | Родительный | Дательный | Винительный | Творительный | Предложный |
---|---|---|---|---|---|
Мужской | 99,7137% | 99,7386% | 99,7635% | 97,9858% | 99,7261% |
Женский | 99,9102% | 99,9401% | 99,9701% | 99,4636% | 99,9401% |
Реквизиты
Репозиторий на GitHub располагается по адресу rocsci/petrovich. Библиотека распространяется на условиях MIT License. Авторами библиотеки являются Андрей Козлов (Bonch) и Дмитрий Усталов (eveel).
Чтобы установить Petrovich и использовать его в собственных приложениях, достаточно выполнить gem install petrovich
или дописать соответствующую строчку в Gemfile.
Веб-интерфейс
Приятно, что Андрей Ситник (Iskin) из «Злых Марсиан» сделал классный интерфейс, который позволяет играться с Petrovich прямо из браузера.
В настоящий момент интерфейс доступен по адресу http://petrovich.rocketscience.it/.
Портирование
Было бы здорово, если разработчики, работающие с другими языками программирования, портировали бы эту библиотеку на свои языки. Мы рады ответить на любые вопросы по Petrovich. В общем случае, начать портирование можно с нашей базы правил.
Спасибо, что дочитали до конца!
Иллюстрации с Петровичем принадлежат Андрею Бильжо, автору комиксов про Петровича.
ссылка на оригинал статьи http://habrahabr.ru/post/195874/
Добавить комментарий