Склонение падежей русских имён, фамилий и отчеств. Вы задаёте начальное имя в именительном падеже, а получаете в нужном вам.
Посмотреть в действии: http://petrovich.rocketscience.it
Добавьте в Gemfile:
gem 'petrovich'
Установите гем cредствами Bundler:
$ bundle
Или установите его отдельно:
$ gem install petrovich
Для работы гема требуется Ruby не младше версии 1.9.1. Petrovich не привязан к Ruby on Rails и может свободно использоваться практически в любых приложениях и библиотеках на Ruby.
Вы задаёте начальные значения (фамилию, имя и отчество) в именительном падеже.
p = Petrovich.new(:male)
p.lastname('Иванов', :dative) # => Иванову
p.firstname('Пётр', :dative) # => Петру
p.middlename('Сергеевич', :dative) # => Сергеевичу
Конструктор класса Petrovich
принимает пол в качестве единственного
аргумента. Пол может принимать значения :male
, :female
или
:androgynous
. Последнее означает, что слово не склоняется по родам.
По нормам языка, некоторые фамилии не склоняются. Например, такие
украинские фамилии, как Симоненко, а также заимствованные фамилии,
такие как Нельсон.
Важно понимать, что явное указание пола повышает точность обработки слов. Если пол неизвестен, однако известно отчество, то гем постарается определить по пол отчеству на основе простой эвристики.
Вы можете подмешать модуль 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::Extension
в самый обычный
класс.
class Person
include Petrovich::Extension
# А здесь мы не указали пол - он будет определяться на основе отчества
petrovich :firstname => :name,
:middlename => :patronymic,
:lastname => :surname
def name
'Иван'
end
def patronymic
'Олегович'
end
def surname
'Сафронов'
end
end
При помощи метода petrovich
указываются методы, представляющие фамилию,
имя и отчество. В данном примере указано, что метод name
представляет
имя, метод lastname
представляет фамилию, метод patronymic
представляет
отчество.
После конфигурации Petrovich можно легко выполнять склонение необходимых строк.
user = User.new
user.my_firstname # => Пётр
user.my_firstname_dative # => Петру
user.my_middlename_dative # => Петровичу
user.my_lastname_dative # => Петренко
person = Person.new
person.name # => Иван
person.my_firstname_dative # => Ивану
person.my_middlename_dative # => Олеговичу
person.my_lastname_dative # => Сафронову
Базовое имя должно быть в именительном падеже. Вы просто добавляете
_<суффикс>
в конец имени оригинального метода и получаете заданное имя
в требуемом падеже.
Названия суффиксов для методов образованы от английских названий соответствующих падежей. Полный список поддерживаемых падежей приведён в таблице ниже.
Суффикс метода | Падеж | Характеризующий вопрос |
---|---|---|
genitive | родительный | Кого? Чего? |
dative | дательный | Кому? Чему? |
accusative | винительный | Кого? Что? |
instrumental | творительный | Кем? Чем? |
prepositional | предложный | О ком? О чём? |
Тестирование гема при склонении коллекции фамилий из морфологического словаря АОТ показало точность около 99%. Оригинальный словарь распространяется по лицензии LGPL версии 2.1, однако используется только в задаче оценки точности данного гема.
Для оценки точности достаточно выполнить команду rake evaluate
. После
выполнения этой команды в поток стандартного вывода будут напечатаны
результаты оценки с данными в словаре АОТ.
Pr(nominative|male) = 100.0000%
Pr(genitive|male) = 99.7137%
Pr(dative|male) = 99.7386%
Pr(accusative|male) = 99.7635%
Pr(instrumental|male) = 97.9858%
Pr(prepositional|male) = 99.7261%
Pr(nominative|female) = 100.0000%
Pr(genitive|female) = 99.9102%
Pr(dative|female) = 99.9401%
Pr(accusative|female) = 99.9701%
Pr(instrumental|female) = 99.4636%
Pr(prepositional|female) = 99.9401%
В настоящий момент наблюдается точность в 99.6614% на основе обработки 88314 примеров.
Для запуска тестов достаточно выполнить rake spec
или просто rake
.
Неравнодушные люди портировали Petrovich на другие языки и платформы программирования.
- JavaScript:
- JavaScript-порт от Никиты Майнника
- JavaScript-порт от Дениса Ольшина
- Kuzmich от Ильи Щелокова
- PHP:
- PHP-порт от Михаила Баженова
- PHP-порт от Паршикова Григория
- Kohana module от Паршикова Григория на основе PHP-порта
- C#:
- C#-порт от Виталия Фокина
Ребята, спасибо!
Мы планируем и далее улучшать этот проект. Поэтому нам важен отклик от пользователей данного гема. Вот наши планы:
- добавить отладочный режим, чтобы видеть, какое именно правило было использовано при словообразовании;
- интерфейс командной строки, чтобы работать с гемом из командной строки;
- проверка совместимости с различными ORM и сторонними библиотеками.
Если вы хотите помочь этому проекту, вы можете реализовать любую вышеперечисленную идею. Перед этим желательно связаться с нами, чтобы мы были в курсе.
Если вы нашли баги, как программной части, так и в базе правил, то вы всегда можете форкнуть репозиторий и внести необходимые изменения. Ваша помощь не останется незамеченной! Если вы заметили ошибки при склонении падежей имён, фамилий или отчеств, можете написать об этом в Issues на GitHub. Проблема будет сразу же исследована и, по возможности, решена.
Не стесняйтесь добавлять улучшения.
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request