Pull to refresh

Petrovich просклоняет русские имена

Reading time 3 min
Views 64K
Вам часто приходится иметь дело со склонением имён пользователей на русском языке? При рассылке писем, при отображении страниц и упоминаний, при генерации рекламных объявлений? Скорее всего, приходится изворачиваться и писать все сообщения в именительном падеже — Иванов Пётр Сергеевич.

Это не всегда удобно, не всегда красиво, не всегда уместно. Русский язык одарён богатой морфологией, которая несколько затрудняет его автоматическую обработку. Всем известно, что антропонимы, как полагается именам существительным, подчиняются всем правилам словообразования.

Для решения этой проблемы при использовании 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 располагается по адресу petrovich/petrovich-ruby. Библиотека распространяется на условиях MIT License. Авторами библиотеки являются Андрей Козлов (Bonch) и Дмитрий Усталов (dustalov).

Чтобы установить Petrovich и использовать его в собственных приложениях, достаточно выполнить gem install petrovich или дописать соответствующую строчку в Gemfile.

Веб-интерфейс


Приятно, что Андрей Ситник (Iskin) из «Злых Марсиан» сделал классный интерфейс, который позволяет играться с Petrovich прямо из браузера.



В настоящий момент интерфейс доступен по адресу http://petrovich.nlpub.ru/.

Портирование


Было бы здорово, если разработчики, работающие с другими языками программирования, портировали бы эту библиотеку на свои языки. Мы рады ответить на любые вопросы по Petrovich. В общем случае, начать портирование можно с нашей базы правил.

Спасибо, что дочитали до конца!

Иллюстрации с Петровичем принадлежат Андрею Бильжо, автору комиксов про Петровича.
Tags:
Hubs:
+149
Comments 141
Comments Comments 141

Articles