gifts2017

Яндекс склонятор

Опубликовал Aleksandr Podskrebkin (Menjoy) в раздел Программирование - Практика программирования

Демонстрация простой функции для использовании сервиса Яндекса по склонению слов.

Столкнулся с проблемой, что в договорах нужно писать фамилию, имя и отчество в родительном падеже. После небольшого поиска решения нашел бесплатный сервис Яндекса, которому просто нужно отправить http запрос, и сервер с радостью ответит набором склоненных слов.

В файле внешняя обработка с примером реализованной функции и ничего более. Скриншот обработки для теста.

Буду рад, если кому-то пригодится.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
ЯндексСклонятор
.epf 6,64Kb
09.07.13
59
.epf 6,64Kb 59 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Яков Коган (Yashazz) 09.07.13 16:38
Советую http://infostart.ru/public/16470/ - тогда и интернет не надобен. И там ещё есть ссылки на другие толковые наработки.
2. Aleksandr Podskrebkin (Menjoy) 09.07.13 17:05
Можно и так, на ноу-хау статья не претендует - всего лишь один из возможных простых способов.
Еще я при поиске натыкался на некую платную компоненту, но отказался, в виду ее платности.
3. Алексей Соловьев (Silenser) 10.07.13 01:48
4. Александр Зубцов (iov) 10.07.13 01:51
5. Программулькин (Программулькин) 10.07.13 03:05
А что? dll-ки уже отменили? или религия запрещает их юзать? Инет отвалился - всё капец? Перестанет склонять? Минус - за то, что делает приложение зависимым, но ставить не буду, ибо как идея, имеет право на жизнь.
6. Aleksandr Podskrebkin (Menjoy) 10.07.13 08:49
(5) Программулькин, dll, конечно, не отменяли. Это действительно просто вариант решения вопроса, а зависимость от интернета - минус.
7. ПОБЕДАСОФТ (prog77) 10.07.13 09:54
Ещё бы для подбора синонимов что то подобное найти.
8. Елена _ (FeliceYa) 10.07.13 11:55
А как быть с тем, что проект Яндекс.нано, в который и входил Яндекс склонятор, закрыли, и ссылки Яндекс.склонятора перестали работать ещё в конце 2012-го????
9. Aleksandr Podskrebkin (Menjoy) 10.07.13 12:36
(8) FeliceYa, работа над проектом закрыта, но сервис работает.
10. qweasd qweasdzc (serega3333) 10.07.13 13:46
интересная реализация, спасиб
11. muha muhaha (fr.myha) 10.07.13 13:59
Спасибо, интересно. А на случай, если интернет не подключен делюсь функцией, возвращающая инициалы в дательном падеже =)

// функция в зависимости от переданного параметра возвращает ФИО
//
// Параметры:
// ФИО - строка. Если Можно вводить только Фамилию или Фимилия Имя или полное ФИО,
// разделитель пробел.
// Пол - Перечисления.Пол
// ТипВывода - числа 1: полное ФИО
// 2: Фамилия И.О.
// 3: И.О. Фамилия
// Возвращаемое значение:
// строка - результат форматирования
Функция обДательныйПадежНаСервере(ФИО,Пол,ТипВывода=0) Экспорт

ФИО_Падеж="";
Фамилия="";
Имя="";
Отчество="";
ФамилияПадеж="";
ИмяПадеж="";
ОтчествоПадеж="";
ФИО=СокрЛП(ФИО);
Длина=0;

Если СтрЧислоВхождений(ФИО," ") = 0 Тогда
Фамилия = ФИО;
Длина = 1;
ИначеЕсли СтрЧислоВхождений(ФИО," ") = 1 Тогда
Фамилия = Лев(ФИО,Найти(ФИО," ")-1);
Имя = СтрЗаменить(ФИО,Фамилия+" ","");
Длина = 2;
ИначеЕсли СтрЧислоВхождений(ФИО," ") = 2 Тогда
Фамилия = Лев(ФИО,Найти(ФИО," ")-1);
Имя = Лев(СтрЗаменить(ФИО,Фамилия+" ",""),Найти(СтрЗаменить(ФИО,Фамилия+" ","")," ")-1);
Отчество = СтрЗаменить(СтрЗаменить(ФИО,Фамилия+" ",""),Имя+" ","");
Длина = 3;
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Предупреждение! Неправильно записано ФИО. Проверьте пробелы!" + Символы.ПС + "(обДательныйПадежНаСервере)";
Сообщение.Сообщить();
КонецЕсли;

Если (Нрег(Прав(Отчество,1))="ч") Тогда
ТекПол = Перечисления.Пол.Муж;
ИначеЕсли (Нрег(Прав(Отчество,1))="а") Тогда
ТекПол = Перечисления.Пол.Жен;
КонецЕсли;

Если ТекПол = Перечисления.Пол.Муж Тогда
КонецФамилии = Прав(Фамилия,1);
Если Нрег(КонецФамилии)="е"
ИЛИ Нрег(КонецФамилии) = "и"
ИЛИ Нрег(КонецФамилии) = "о"
ИЛИ Нрег(КонецФамилии) = "у"
ИЛИ Нрег(КонецФамилии) = "э"
ИЛИ Нрег(КонецФамилии) = "ю"
Тогда
ФамилияПадеж = Фамилия;
ИначеЕсли Нрег(КонецФамилии) = "я" Тогда
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-1) + "е";
ИначеЕсли Нрег(КонецФамилии) = "а" Тогда
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-1) + "е";
ИначеЕсли Нрег(КонецФамилии) = "й"
ИЛИ Нрег(КонецФамилии) = "ь"
Тогда
Если Нрег(Прав(Фамилия,2)) = "ий"
ИЛИ Нрег(Прав(Фамилия,2)) = "ый"
Тогда
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-2) + "ому";
Иначе
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-1) + "ю";
КонецЕсли
Иначе
Если Нрег(Прав(Фамилия,2)) = "ец" Тогда
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-2) + "цу";
Иначе
ФамилияПадеж = Фамилия + "у";
КонецЕсли
КонецЕсли;

Если Имя = "Лев" Тогда
ИмяПадеж = "Льву";
ИначеЕсли Имя="Павел" Тогда
ИмяПадеж = "Павлу";
ИначеЕсли Имя = "Пётр" Тогда
ИмяПадеж = "Петру";
ИначеЕсли Нрег(Прав(Имя,1)) = "й"
ИЛИ Нрег(Прав(Имя,1)) = "ь"
Тогда
ИмяПадеж = Лев(Имя,СтрДлина(Имя)-1) + "ю";
ИначеЕсли Нрег(Прав(Имя,1)) = "и" Тогда
ИмяПадеж = Имя;
ИначеЕсли Нрег(Прав(Имя,1)) = "а" Тогда
ИмяПадеж = Лев(Имя,СтрДлина(Имя)-1) + "е";
Иначе
ИмяПадеж = Имя + "у";
КонецЕсли;
ОтчествоПадеж = Отчество + "у";
ИначеЕсли ТекПол = Перечисления.Пол.Жен Тогда
КонецФамилии = Прав(Фамилия,1);

Если Нрег(КонецФамилии) = "а" Тогда
Если Нрег(Прав(Фамилия,3)) = "ова"
ИЛИ Нрег(Прав(Фамилия,3))="ева"
Тогда
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-1) + "ой";
Иначе
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-1) + "е";
КонецЕсли
ИначеЕсли Нрег(КонецФамилии) = "я" Тогда
Если Нрег(Прав(Фамилия,2)) = "ая" Тогда
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-2) + "ой";
Иначе
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-1) + "е";
КонецЕсли
Иначе
ФамилияПадеж = Фамилия;
КонецЕсли;

Если Нрег(Прав(Имя,1)) = "а" Тогда
ИмяПадеж = Лев(Имя,СтрДлина(Имя)-1) + "е";
ИначеЕсли Нрег(Прав(Имя,1)) = "я" Тогда
Если Нрег(Прав(Имя,2)) = "ия" Тогда
ИмяПадеж = Лев(Имя,СтрДлина(Имя)-1) + "и";
Иначе
ИмяПадеж = Лев(Имя,СтрДлина(Имя)-1) + "е";
КонецЕсли
Иначе
ИмяПадеж = Имя;
КонецЕсли;
ОтчествоПадеж = Лев(Отчество,СтрДлина(Отчество)-1) + "е";
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Предупреждение! Неправильно задан Пол. Проверьте!" + Символы.ПС + "(обДательныйПадежНаСервере)";
Сообщение.Сообщить();
КонецЕсли;

Если Длина = 1 Тогда
ФИО_Падеж = "" + ФамилияПадеж;
ИначеЕсли Длина = 2 Тогда
Если ТипВывода = 1 Тогда
ФИО_Падеж = "" + ИмяПадеж + " " + ФамилияПадеж;
ИначеЕсли ТипВывода = 2 Тогда
ФИО_Падеж = "" + ФамилияПадеж + " " + Лев(ИмяПадеж,1) + ".";
ИначеЕсли ТипВывода = 3 Тогда
ФИО_Падеж = "" + Лев(ИмяПадеж,1) + "." + " " + ФамилияПадеж;
Иначе
ФИО_Падеж = "" + ФамилияПадеж + " " + ИмяПадеж;
КонецЕсли
ИначеЕсли Длина = 3 Тогда
Если ТипВывода = 1 Тогда
ФИО_Падеж = "" + ИмяПадеж + " " + ОтчествоПадеж + " " + ФамилияПадеж;
ИначеЕсли ТипВывода = 2 Тогда
ФИО_Падеж = "" + ФамилияПадеж + " " + Лев(ИмяПадеж,1) + "." + " " + Лев(ОтчествоПадеж,1) + ".";
ИначеЕсли ТипВывода=3 Тогда
ФИО_Падеж = "" + Лев(ИмяПадеж,1) + "." + " " + Лев(ОтчествоПадеж,1) + "." + " " + ФамилияПадеж;
Иначе
ФИО_Падеж = "" + ФамилияПадеж + " " + ИмяПадеж + " " + ОтчествоПадеж;
КонецЕсли
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Предупреждение! Это не ФИО. Проверьте!" + Символы.ПС + "(обДательныйПадежНаСервере)";
Сообщение.Сообщить();
КонецЕсли;
Возврат ФИО_Падеж;
КонецФункции
12. Евгений Мадонов (madonov) 11.07.13 02:20
Так 1С вроде выпустила специальную ВК еще несколько лет назад =)).
В реальной конфе "онлайн" решение абсолютно неприменимо, но плюсанул за пример.
13. Михаил Русанов (RainyAugust22) 11.07.13 09:05
Ну почему именно Иван?:)
14. Антон Чарушкин (hulio) 11.07.13 10:08
(7) prog77, в 1С полнотекстовый поиск работает с учетом синонимов, словари синонимов можно подключать свои собственные. Думаю, те же самые словари можно использовать для собственных нужд :)
15. Аркадий Кучер (Abadonna) 11.07.13 15:10
(11) fr.myha, Особо не разглядывал, но, кажись, стандартная ошибка склонения фамилии, не учитывающая пол.
Должно получиться (по правилам русского) Адольфом ГитлеРОМ, но Евой ГитлеР. Что функция выдаст?
wunderland; +1 Ответить
16. ПОБЕДАСОФТ (prog77) 12.07.13 14:47
(14) hulio, Спасибо за информацию. Буду копать как вытащить синонимы для слова...
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа