Преобразование фамилий из дательного в именительный падеж

10 5

При работе с входящими документами временами возникает ситуация, когда необходимо определить адресата (например, из справочника Работники).
В справочнике указаны фамилия, имя и отчество адресата в именительном падеже. А во входящих документах адресат почти всегда указывается в дательном падеже (например, Путину В.В.)

Имеется достаточное количество решений (в том числе и в «коробке»), которые позволяют проводить преобразование из именительного в любой другой падеж. А вот чтобы наоборот — таких, думаю, встретится не очень много. Одно из них опишу в этой статье и приложу его исходные файлы.

Почему решений по обратному преобразованию падежей почти нет? Задача, вроде бы, актуальная. Скорее всего, это из-за того, что порой однозначно верно преобразовать русскую фамилию к именительному падежу не всегда получается даже у человека. Что уж говорить про алгоритмы для машин. Приведенное в статье решение тоже не всегда позволит преобразовать фамилию в именительный падеж однозначно верно. Но большинство случаев вполне может обработать.

Какие встречаются сложности

Например, запись родительного падежа разных фамилий в женском роде (Перцева и Перцевая) могут совпадать (Перцевой). И тогда при обратном преобразовании непонятно, какая из фамилий имелась в виду.

Также у некоторых фамилий окончания в склонении могут быть гласными: «-ы», «-и», «-у», «-ю», «-е». Обычно фамилии, имеющие такие окончания, относятся к несклоняемым, и поэтому при обратном преобразовании сложно определить, является ли такая фамилия несклоняемой или получила такое окончание в результате склонения.

Если бы для решения подобной задачи использовались модные сейчас нейронные сети, то скорее всего они справились бы с задачей лучше. Но и трудоемкость реализации тогда будет выше. В этой статье описан относительно простой вариант реализации, анализирующий окончания фамилий.

Чуть-чуть теории и особенностей

В решении рассматриваются русские фамилии (т.к. в задаче, которую пришлось решать преобразовывались в основном именно русские фамилии). Хотя, как говорится, «поскреби русского – найдёшь татарина». Поэтому многие нерусские фамилии или фамилии, имеющие изначально не русские корни с окончаниями на «-их», «-ин», «-ов» (напр., Брюллов, Либних), будут тоже хорошо преобразовываться.

Углубляться в историю происхождения фамилий я не буду, хотя тема очень интересная. А вот то, что в фамилиях интересно вкратце рассмотрю. А интересно: окончания фамилий, отличия мужских и женских фамилий.

Большинство русских мужских фамилий имеют окончания «-ов/-ев», «-ин/-ын» (Иванов, Алексеев, Ивашкин). В дательном падеже окончания будут соответствовать «-ову/-еву», «-ину/ыну». Поэтому если фамилия оканчивается на «-ову/-еву» (Петрову, Шмелеву), «-ину/ыну» (Моськину, Синицыну), то обратное преобразование можно произвести, просто убрав последнюю букву «у» из окончания. Тогда получим фамилии в именительном падеже (Петрову, Шмелеву, Моськину, Синицыну).

Аналогичные окончания фамилий, но уже в женском роде будут такими: «-ова/-ева», «-ина/-ына». В дательном падеже они примут вид: «-овой/-евой» (Петровой, Шмелевой), «-иной/ыной» (Моськиной, Синицыной). Обратное преобразование в именительный падеж можно выполнить, убрав из окончания последние «ой» и затем добавив «а» (Петровойа, Шмелевойа, Моськинойа, Синицынойа).

Перебрав таким образом все основные окончания фамилий можно получить подобную таблицу преобразования:

А дальше уже дело техники. Можно написать небольшую функцию, которая ищет окончания фамилий в таблице. Если окончание найдено, то функция проводит преобразование фамилии по заданному в таблице правилу. Пример функции, реализующей такое преобразование см. по ссылке в конце материала.

Таблицу можно дополнять, но делать это нужно аккуратно, чтобы не было перекрытий окончаний фамилий. Например, если добавить окончание «-нова», а в таблице уже есть окончание «-ова», то функция сначала найдет окончание «-ова» и произведет преобразование по нему.

Пример кода на ISBL:

  // На вход: строка в виде перечисленных через запятую Фамилия И.О.
  Addresses = "г-ну Сергееву С.С., Иванову А., Снигиреву А."
  // В WorkerIDsList функция возвращает список строк с ИД найденных работников.
  WorkerIDsList = PadegGetWorkerIDsByString(Addresses)
  // ИД работников через запятую
  showmessage(WorkerIDsList.DelimitedText)

Исходные файлы

10
Авторизуйтесь, чтобы оценить материал.
2
Артем Сунцов

Согласен с автором в том, что перевод из дательного в именительный падеж сложнее, поэтому при решении задач подбора существующих данных на основании фразы в дательном падеже рекомендую вообще такое преобразование не делать, а применить для существующих данных обратное преобразование (из именительного в дательный), и их и сравнивать. Тут как с криптографией, проверить правильность открытым ключом гораздо проще, чем подобрать закрытый ключ.

А за саму реализацию спасибо! Готовых решений действительно мало.

Александр Чугунов

Поддержу Артема, проще и удобнее сделать для каждого работника поля с родительным и дательным падежами и по ним сравнивать. Все частные случаи можно поправить у конкретных работников. К тому же, эти поля (100% корректно склоненные) можно использовать потом для вставки в документы.

Евгения Жвакина

Спасибо, Алексей, за статью! Очень нужный, порой функционал для Организаций!

А подобное решение применимо и к работе с Контрагентами и с их контактными лицами?

Часто возникает необходимость "поиграться" с падежами контактных лиц как в ту, так и в другую сторону.

Планируется ли перенос данного решения в "коробку"?

Евгений Кочуров

Спасибо за статью и функционал!

Хочу добавить несколько строк в таблицу преобразований фамилий:

1. Украинские фамилии, типа Сидоренко, окончание в дательном падеже "- ко", ничего добавлять и убирать не надо.

2. Фамилии, которые в дательном падеже заканчиваются на "у", например, Шпиленбаху, Аванесяну, Смиту. В таком случае надо искать  окончания типа "-ху", "-ну", "-ту", убирать "у" и ничего не добавлять.

Алексей Тутаев

Евгения, в принципе исходный код вложенной функции можно переделать под справочник Контактные лица вместо Работники. Это нетрудоемко, вопрос нескольких минут.

По поводу "коробки" - изначально про это не думали и для коробки функционал этот не готовили. Он скорее как побочный и необходимый продукт возник )

 

Евгений, в первом случае можно ничего не добавлять. Сработает и так.

Про второй случай - в статье я описал, что рассматривались, в основном, статьи с русским происхождением. Поэтому фамилии с окончаниями на  "-ху", "-ну", "-ту" не "обкатывались". Если нужно их добавить, то проблем с этим не будет. Но предварительно нужно все-таки обкатать все возможные варианты с такими окончаниями.

Алексей Тутаев: обновлено 30.10.2017 в 11:01

Авторизуйтесь, чтобы написать комментарий