Skip to content

Latest commit

 

History

History

gender_by_name

Функция на PostgreSQL 12+ для определение пола по русскоязычным ФИО (фамилии, имени, отчеству)

Пример использования

Когда части ФИО находятся в одном поле:

select gender_by_name('Савина Анна Николаевна'); --female
select gender_by_name('Савина Анна'); --female
select gender_by_name('Анна'); --female

Когда части ФИО находятся в разных полях, то качество детектирования пола можно немного улучшить. Однако, некоторые пользователи путают Ф,И,О местами и надеяться только на позицию нельзя, это учтено в алгоритме.

Последовательность перечисления частей ФИО важна. Нужен именно такой порядок: фамилия, имя, отчество. Для разделения частей ФИО используется перенос строки \n:

select gender_by_name(pg_catalog.concat('Савина', e'\n', 'Анна', e'\n', 'Николаевна')); --female
select gender_by_name(pg_catalog.concat('Савина', e'\n', 'Анна', e'\n', null)); --female
select gender_by_name(pg_catalog.concat('Савина', e'\n', 'Анна', e'\n', '')); --female
select gender_by_name(pg_catalog.concat(null,     e'\n', 'Анна', e'\n', '')); --female
select gender_by_name(pg_catalog.concat('',       e'\n', 'Анна', e'\n', '')); --female

Особенности определения пола по ФИО

При детектировании пола используется словарь имён (51504 шт.), словарь окончаний фамилий и отчеств. Ромка, Ромчик, Ромочка, Анька, Анечка, Анютка, Анюша, Саша, Слава — это уменьшительно-ласкательные, жаргонные и неоднозначные имена. Их в словаре имён нет и в детектировании пола они не участвуют.

Результаты тестирования качества

Для женских ФИО:

  • Некорректно определяется пол как мужской в 0.24% случаев.
  • Неопределяется пол в 0.28% случаев.

Для мужских ФИО:

  • Некорректно определяется пол как женский в 0.12% случаев.
  • Неопределяется пол в 0.43% случаев.

Альтернативные решения

PHP функция morpher_get_gender()

Проблемы с этой функцией:

  1. Умеет работать с ФИО только на кириллице, для других алфавитов выдаёт ошибку. Например, не умеет работать с именами в транслите типа Elena.
  2. Не умеет возвращать unknown. Некорректно возвращает пол для неоднозначных уменьшительных русских имён типа Валя - female; Женя, Саша - male (должно быть unknown)
  3. Фамилии типа Петренко, Кац, Перельман, Мартиросян, Нет - это male (должно быть unknown)
  4. Неоднозначные ФИО определяет так (результат совпадает с gender_by_name()):
    1. Сергеева Олег - male
    2. Сергеева Олег Николаевна - female
    3. Сергеев Ольга - female
    4. Сергеев Ольга Николаевич - male

Сравнение gender_by_name() с morpher_get_gender()

Женский пол

name gender_by_name() morpher_get_gender()
1 Юля female f
2 Сергеевна female f
3 Анна Герман female f
4 Вагнер Елена female m
5 саид алина акбари female f
6 Irada Zeinalova female error
7 Watson Emma female error

Мужской пол

name gender_by_name() morpher_get_gender()
1 Олег male m
2 Сергеевич male m
3 Gref German male error
4 Плутник Никита male m
5 Арнольд Шварценеггер male m
6 Вольф Мессинг male m
7 Жюль Верн male m

Пол неопределён

name gender_by_name() morpher_get_gender()
1 Остапенко unknown m
2 Вассерман unknown m
3 кирилл или татьяна unknown m
4 елена сергей высоцкие unknown m
5 андрей, виктория, мария unknown f
6 новиков роман и светлана unknown m
7 Лошадь Пржевальского unknown f

Ссылки по теме

  1. http://ceur-ws.org/Vol-2754/paper3.pdf (TODO почитать)