Skip to content

Instantly share code, notes, and snippets.

@drakmail
Created April 28, 2013 07:08
Show Gist options
  • Save drakmail/5476161 to your computer and use it in GitHub Desktop.
Save drakmail/5476161 to your computer and use it in GitHub Desktop.
Определение пола на ruby. Использование - detect_gender_by_given_name("Имя", "Фамилия", "Отчество").
# -*- coding: utf-8 -*-
FEMININE = 0
MASCULINE = 1
UNDEF = -1
MASCULINE_NAMES = %w[Аба Азарья Акива Аккужа Аникита Алёша Андрюха Андрюша Аса Байгужа
Вафа Ваня Вася Витя Вова Володя Габдулла Габидулла Гаврила Гадельша
Гайнулла Гайса Гайфулла Галиулла Гарри Гата Гдалья Гийора Гиля Гошеа
Данила Джиханша Дима Зайнулла Закария Зия Зосима Зхарья Зыя Идельгужа
Иешуа Изя Ильмурза Илья Иона Исайя Иуда Йегошуа Йегуда Йедидья Карагужа Коля
Костя Кузьма Лёха Лёша Лука Ларри Марданша Микола Мирза Миха Миша Мойша Моня
Муртаза Муса Мусса Мустафа Никита Нэта Нэхэмья Овадья Петя Птахья
Рахматулла Риза Рома Савва Сафа Серёга Серёжа Сила Симха Сэадья Товия
Толя Федя Фима Фока Фома Хамза Хананья Цфанья Шалва Шахна Шрага Эзра
Элиша Элькана Юмагужа Ярулла Яхья Яша]
FEMININE_NAMES = %w[Айгуль Айгюль Айзиряк Айрис Альфинур Асылгюль Бадар Бадиян Банат Бедер
Бибикамал Бибинур Гайниджамал Гайникамал Гаухар Гиффат Гулендем
Гульбадиян Гульдар Гульджамал Гульджихан Гульехан Гульзар Гулькей
Гульназ Гульнар Гульнур Гульсем Гульсесек Гульсибар Гульчачак Гульшат
Гульшаян Гульюзум Гульямал Гюзель Джамал Джаухар Джихан Дильбар Диляфруз
Зайнаб Зайнап Зейнаб Зубарджат Зуберьят Ильсёяр Камяр Карасес Кейт
Кэролайн Кэт Кэтрин Кямар Любовь Ляйсан Магинур Магруй Марьям Минджихан
Минлегюль Миньеган Наркас Нинель Нурджиган Райхан Раушан Рахель Рахиль
Рут Руфь Рэйчел Сагадат Сагдат Сарбиназ Сарвар Сафин Сахибджамал Сулпан
Сумбуль Сурур Сюмбель Сясак Тамар Тансулпан Умегульсум Уммегюльсем
Фарваз Фархинур Фирдаус Хаджар Хажар Хаят Хуршид Чечек Чулпан Шамсинур
Элис Энн Юдифь Юндуз Ямал]
AMBIGUOUS_NAMES = %w[Валя Женя Мина Паша Саша Шура]
def detect_gender_by_given_name(firstname, lastname='', patronym='')
ambiguous = false
# Detect by patronym
return FEMININE if patronym =~ /на$/
return MASCULINE if patronym =~ /[иы]ч$/
# Process exceptions
MASCULINE_NAMES.each do |name|
return MASCULINE if firstname == name
end
FEMININE_NAMES.each do |name|
return FEMININE if firstname == name
end
AMBIGUOUS_NAMES.each do |name|
if firstname == name
ambiguous = true
break
end
end
if not ambiguous
# Feminine firstnames ends to vowels
return FEMININE if firstname =~ /[ая]$/
# Masculine firstnames ends to consonants
return MASCULINE if firstname !~ /[аеёиоуыэюя]$/
end
# Detect by lastname
# possessive names
return FEMININE if lastname =~ /(ев|ин|ын|ёв|ов)а$/
return MASCULINE if lastname =~ /(ев|ин|ын|ёв|ов)$/
# adjectives
return FEMININE if lastname =~ /(ая|яя)$/
return MASCULINE if lastname =~ /(ий|ый)$/
# Unknown or ambiguous name
return UNDEF
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment