|
Набор функций, позволяющий изменять по падежам ФИОНижеприведенный продукт был
мной найден в недрах Интернета |
Преобразование ФИО v2.0
Программный продукт (в дальнейшем – программа) является новой версией программы “Склонение фамилий, имен и отчеств по падежам”. Изменение названия программы обусловлено тем, что, как нам кажется, оно более точно отражает её функциональные возможности. Несмотря на изменение названия, имена файлов и экспортируемых функций оставлены прежними для обеспечения совместимости с предыдущей версией программы. Программа предназначена для преобразования фамилии, имени и отчества (ФИО), заданных в именительном падеже, в форму любого другого падежа по правилам склонения фамилий, имен и отчеств, принятых в русском языке (см. ниже), а также для восстановления именительного падежа для ФИО, записанного в произвольном падеже. Исходное ФИО может быть задано одной или тремя строками при склонении ФИО и одной строкой – при восстановлении именительного падежа. При реализации настоящей версии программы мы постарались учесть, по возможности, все замечания и предложения, сделанные при тестировании предыдущей версии. Ниже приведен перечень изменений и дополнений в предлагаемой версии программы. Ядром программы является библиотека динамической компоновки Padeg.dll с секцией экспорта: exports GetFIOPadeg Name 'GetFIOPadeg', GetFIOPadegAutoSex Name 'GetFIOPadegAS' GetFIOPadegFromStr Name 'GetFIOPadegFS' GetFIOPadegFromStrAutoSex Name 'GetFIOPadegFSAS', GetIFPadeg Name 'GetIFPadeg', GetIFPadegFromStr Name 'GetIFPadegFS', Get_FIO Name 'GetFIO', Get_FIO_FromStr Name 'GetFIOFromStr', Get_IF Name 'GetIF', Get_IF_FromStr Name 'GetIFFromStr', GetNominativePadeg Name 'GetNominativePadeg', Get_Nominative Name 'GetNominative', Update_Exceptions Name 'UpdateExceptions'; end. Экспортируемые библиотечные функции, за исключением последней, осуществляют преобразование ФИО, записанное в соответствующем формате, в заданный падеж и отличаются количеством и типом параметров, а также своими значениями. Под форматом здесь понимается порядок следования компонент ФИО в списке параметров или параметре, если ФИО передается одной строкой. Функции, в именах которых присутствует AutoSex (AS), выполняют преобразование, определяя род по отчеству. ФИО, заданные одной строкой, преобразуются функциями с FromStr (FS) в имени. Отметим, что имена функций прямо связаны с форматом записи ФИО. Функции, содержащие FIO в имени, предназначены для преобразования входных данных, записанных в формате "Фамилия Имя Отчество", а IF – "Имя [Имена] Фамилия”. Описание функций, их параметров и рекомендации по использованию приводятся в соответствующем разделе. Для нормального
функционирования библиотека Padeg.dll
должна находится в доступном для ОС
месте. Обычно это – "\Windows\System\"
("\WinNT\SYSTEM32\" – для Windows NT).
Ограничений на местоположение
словаря исключений нет. Однако
желательно поместить его в каталог: C:\Program
Files\Microsoft Office\Office. Если путь к каталогу
Office отличается от приведенного или
принято решение поместить файл
словаря в другом месте, то в этом
случае перед установкой программы
потребуется редактирование параметра
"ExceptionDicDir" в файле Padeg.reg. Для уже
установленной программы или при
изменении в процессе ее эксплуатации
местоположения файла исключений
полнофункциональная работа
обеспечивается путем редактирования
ключа реестра: Еще один параметр в секции реестра HKEY_LOCAL_MACHINE\Software\Padeg – "ErrorInfo". Его назначение - разрешать (при ненулевом значении) вывод предупреждающего сообщения об ошибке при использовании функций, возвращающих строковые значения своим результатом. Таким образом, процесс установки программы сводится к следующему: В настоящем разделе используются экспортируемые имена функций. В программе реализованы функции преобразования ФИО двух типов: Integer и ShortString. Работу со словарем исключений обеспечивает функция с типом Boolean. 6.1. Общие положенияВ общем случае символ “точка” в ФИО является признаком инициала имени или отчества. Однако если точка расположена непосредственно за отчеством, не являющимся инициалом или сокращением (завершающая предложение точка), преобразование выполняется правильно. При этом символ точки сохраняется в результате. Сказанное относится и к случаю восстановления именительного падежа. Двойные фамилии (и даже тройные, если такие есть) склоняются по установленным правилам. В общем случае, будут верно склоняться "N-спальные" с любым N. Единственное требование к такой фамилии - она должна разделяться дефисами: Лебедев-Кумач, Уткин-Задунайский-Краматорский. Несколько слов по поводу параметра nPadeg, задающего номер падежа (1 – именительный; 2 – родительный и т.д.) в который требуется преобразовать входные данные. При значении этого параметра [2..6] выполняется преобразование ФИО в соответствующий падеж. Если же задать значение, равное 1, то преобразования, естественно, не произойдет, т.к. бессмысленно преобразовывать в именительный падеж то, что уже записано в этом падеже, но выполнится форматирование ФИО: первые символы составляющих ФИО преобразуются к прописным, если они были строчными, а сами составляющие разделятся одним пробелом. Приведенные функции и макросы могут использоваться как сами по себе, так и при разработке собственных программ. А библиотечные функции могут вызываться не только из приложений MS Office. При этом следует иметь в виду, что встречаются “нестандартные” ФИО, для которых функции дадут неверный результат, и предусмотреть возможность ручной корректировки. В частности, это касается творительного падежа, где окончание некоторых фамилий зависит от положения ударения, определить которое алгоритмически не представляется возможным. 6.2. Функции, возвращающие результат типа IntegerФункции, имеющие тип возвращаемого значения Integer, своим значением передают результат выполнения операции преобразования: 0 – успешное завершение; -1 – недопустимое значение падежа; -2 – недопустимое значение рода; -3 – размер буфера недостаточен для размещения результата преобразования ФИО. Необходимо отметить, что поскольку параметр рода для этих функций – логический, то значение –2 никогда не будет возвращено в виде результата выполнения. Однако для функций другого типа это значение используется при обработке ошибки. Небольшое замечание о параметре nLen. В настоящей версии программы выполняется проверка этого параметра и на нулевое значение. Это, пожалуй, единственное обстоятельство, которое может повлиять на совместимость с предыдущей версией программы, т.к. в примерах прошлой версии параметр nLen инициализировался по умолчанию нулем и с этим значением передавался в библиотечные функции. Значение этого параметра после выполнения преобразования ФИО равно длине результата преобразования при успешном завершении операции. Если размер преобразованного ФИО превышает размер отведенного буфера, значение параметра равно размеру буфера (при этом результат преобразования усекается до размера буфера), и нулю - если задано ошибочное значение падежа. 6.2.1. GetFIOPadegfunction GetFIOPadeg(pLastName, pFirstName, pMiddleName: PChar; bSex: Boolean; nPadeg: LongInt; pResult: PChar; var nLen: LongInt): Integer; stdcall; Помещает в буфер (pResult) размера (nLen) результат склонения фамилии (pLastName), имени (pFirstName) и отчества (pMiddleName) рода (bSex) в заданный падеж (nPadeg). Значение функции – результат выполнения операции преобразования. Данная функция является основной в библиотеке и наиболее универсальной. В качестве параметров ей необходимо передать ФИО в виде трех строк (каждая из которых может быть пустой), явно указанный род, требуемое значение падежа, указатель на буфер результата и размер этого буфера (после преобразования этим параметром возвращается реальный размер результата). При таких условиях этой функцией можно склонять ФИО и его составляющие в любых комбинациях. Корректно обрабатываются фамилии с инициалами (Сидоров И.П.) – склоняться будет только фамилия (у Сидорова И.П.). Допускается использование инициалов, состоящих более чем из одного символа (Иванов Вс.Никод.). Кроме ФИО славянского типа эта функция может выполнять склонение корейских, китайских и им подобным имен. При этом первое слово в таком имени соответствует фамилии, второе – имени и третье – отчеству в наших терминах. Другими словами, при склонении Иванов Иван Иванович и Ли Си Цын не требуется перестановка составляющих ФИО. Поскольку имена подобного вида иногда записывают двумя словами (Ли Сицын), то при вызове функции склонения для такой формы записи необходимо первым параметром передать пустую строку. В подавляющем большинстве случаев эта функция пригодна и для склонения ФИО, записанного в формате "Фамилия Имя Имя" (Кеннеди Джон Фиджеральд). 6.2.2. GetFIOPadegASfunction GetFIOPadegAS(pLastName, pFirstName, pMiddleName: PChar; nPadeg: LongInt; pResult: PChar; var nLen: LongInt): Integer; stdcall; Помещает в буфер (pResult) размера (nLen) результат склонения фамилии (pLastName), имени (pFirstName) и отчества (pMiddleName) в заданный падеж (nPadeg) с автоматическим определением рода. Значение функции – результат выполнения операции преобразования. Функция предназначена для склонения ФИО, род которых неизвестен. Определение рода осуществляется по окончанию отчества. Корректно обрабатываются отчества, имеющие признак рода: Оглы (сын) или Кызы (дочь). Признак рода может записываться через дефис (Аскер-Оглы) или пробел (Аскер Оглы). 6.2.3 GetFIOPadegFSfunction GetFIOPadegFS(pFIO: PChar; bSex: Boolean; nPadeg: LongInt; pResult: PChar; var nLen: LongInt):Integer; stdcall; Помещает в буфер (pResult) размера (nLen) результат склонения фамилии имени и отчества, записанных одной строкой (pFIO), рода (bSex) в заданный падеж (nPadeg). Значение функции – результат выполнения операции преобразования. Функция выполняет преобразование ФИО, заданного одной строкой и требует явного указания рода. Порядок следования составляющих ФИО в строке параметра – фамилия, имя, отчество. Эта функция, как и GetFIOPadeg, тоже допускает использование инициалов и может выполнять преобразование имен типа китайских. Для корректной работы функции необходимо наличие трех компонент ФИО (китайские имена разрешено задавать двумя словами). В ряде случаев правильно обрабатываются ФИО, записанные в формате "Фамилия Имя [Имя]". 6.2.4. GetFIOPadegFSASfunction GetFIOPadegFSAS(pFIO: PChar; nPadeg: LongInt; pResult: PChar; var nLen: LongInt):Integer; stdcall; Помещает в буфер (pResult) размера (nLen) результат склонения фамилии имени и отчества, записанных одной строкой (pFIO), в заданный падеж (nPadeg) с автоматическим определением рода. Значение функции – результат выполнения операции преобразования. Функция предназначена для склонения ФИО, заданных одной строкой, род которых неизвестен. Определение рода осуществляется по окончанию отчества. Функция корректно обрабатывает отчества, имеющие признак рода: Оглы (сын) или Кызы (дочь). Признак рода может записываться через дефис (Аскер-Оглы) или пробел (Аскер Оглы). 6.2.5. GetIFPadegfunction GetIFPadeg(pFirstName, pLastName: PChar; bSex: Boolean; nPadeg: LongInt; pResult: PChar; var nLen: LongInt): Integer; stdcall; Помещает в буфер (pResult) размера (nLen) результат склонения имени (pFirstName) и фамилии (pLastName) рода (bSex) в заданный падеж (nPadeg). Значение функции – результат выполнения операции преобразования. Функция предназначена для склонения пар "Имя Фамилия" (Марк Твен) и требует явного указания рода. Эта функция также пригодна для склонения имен собственных типа Джон Фиджеральд Кеннеди. В этом случае Джон Фиджеральд следует передавать одним параметром, как имя. Разделитель слов в параметре – пробел. 6.2.6. GetIFPadegFSfunction GetIFPadegFromStr(pIF: PChar; bSex: Boolean; nPadeg: LongInt; pResult: PChar; var nLen: LongInt): Integer; stdcall; Помещает в буфер (pResult) размера (nLen) результат склонения имени и фамилии (pIF), записанных одной строкой, рода (bSex) в указанный падеж (nPadeg). Значение функции – результат выполнения операции преобразования. Функция предназначена для склонения пар "Имя Фамилия" (Марк Твен), записанных одной строкой, и требует явного указания рода. Эта функция также пригодна для склонения имен собственных типа Джон Фиджеральд Кеннеди. При использовании данной функции следует иметь в виду, что фамилией считается последнее слово параметра, а все предыдущие – именами и склоняются соответствующим образом. 6.2.7. GetNominativePadegfunction GetNominativePadeg(pFIO, pResult: PChar; var nLen: LongInt): Integer; stdcall; Помещает в буфер (pResult) размера (nLen) восстановленный именительный падеж для ФИО, записанного одной строкой (pFIO) в произвольном падеже. Значение функции – результат выполнения операции преобразования. Функция выполняет восстановление именительного падежа для ФИО, заданного в произвольном падеже в формате "Фамилия Имя Отчество". Значение, возвращаемое функцией, может быть равно 0 или -3, причем 0 не означает, что восстановление именительного падежа выполнено грамматически правильно, а лишь индицирует, что функция отработала без ошибок. Более подробно о восстановлении именительного падежа сказано в разделе "Восстановление именительного падежа". 6.3. Функции, возвращающие результат типа ShortStringВ библиотеку включены 5 функций с типом результата ShortString, четыре из которых служат для преобразования ФИО в некоторый падеж, а пятая – для восстановления именительного падежа. Некорректное задание падежа или рода при вызове функций склонения приводит к выводу предупреждающего сообщения при соответствующем значении параметра реестра ErrorInfo с указанием ошибочного значения. Отметим, что тип этих функций и параметров ограничивает применение их в программах на VB (VBA), вследствие различия в механизме передачи строковых данных. Для автоматического определения рода в этих функциях в качестве параметра cSex следует задавать #0. Последнее утверждение не относится к функциям склонения пар "Имя Фамилия" GetIF и GetIFFromStr, которые требуют только явного указания рода. 6.3.1. GetFIOfunction GetFIO(pLastName, pFirstName, pMiddleName: ShortString; cSex: Char; nPadeg: LongInt): ShortString; stdcall; Возвращает строкой результат склонения фамилии (pLastName), имени (pFirstName) и отчества (pMiddleName) рода (cSex) в заданный падеж (nPadeg). По своим характеристикам аналогична функции GetFIOPadeg (GetFIPPadegAS при cSex = #0). 6.3.2. GetFIOFromStrfunction GetFIOFromStr(pFIO: ShortString; cSex: Char; nPadeg: LongInt): ShortString; stdcall; Возвращает строкой результат склонения фамилии, имени и отчества, записанных одной строкой (pFIO), заданного рода (cSex) в указанный падеж (nPadeg). По своим характеристикам аналогична функции GetFIOPadegFS (GetFIPPadegAS при cSex = #0). 6.3.3. GetIFfunction GetIF(pFirstName, pLastName: ShortString; cSex: Char; nPadeg: LongInt): ShortString; stdcall; Возвращает строкой результат склонения имени (pFirstName) и фамилии (pLastName) заданного рода (cSex) в указанный падеж (nPadeg). По своим характеристикам аналогична функции GetIFPadeg. 6.3.4. GetIFFromStrfunction GetIFFromStr(pIF: ShortString; cSex: Char; nPadeg: LongInt): ShortString; stdcall; Возвращает строкой результат склонения имени и фамилии, записанных одной строкой (pIF), заданного рода (cSex) в указанный падеж (nPadeg). По своим характеристикам аналогична функции GetIFPadegFS. 6.3.5. GetNominativefunction GetNominative(pFIO: ShortString): ShortString; Возвращает строкой результат восстановления именительного падежа для ФИО, записанного одной строкой (pFIO), в произвольном падеже в формате "Фамилия Имя Отчество". По своим характеристикам аналогична функции GetNominativePadeg. 6.4. Функции типа BooleanВ библиотеке присутствует одна функция такого типа. 6.4.1. UpdateExceptionsfunction UpdateExceptions: Boolean; stdcall; Служит для принятия изменений, сделанных в файле словаря исключений во время работы приложения, использующего библиотеку. Значение, возвращаемое этой функцией, содержит информацию о том, что словарь исключений найден и программа с ним работает (True). В противном случае функция возвратит значение False. Предлагаемая версия программы совместима с продуктами Microsoft Office 97/2000/XP. Примеры объявления библиотечных функций GetFIOPadegFSAS и GetNominativePadeg, а также глобальной функции MakePadeg приведены в файле Declen.bas. Реализация функции MakePadeg предусматривает вывод предупреждения с указанием неправильного значения падежа при некорректном его задании. Обращение к остальным функциям DLL производится аналогично. 7.1. Использование в Microsoft WordМакросы, основой которых является функция MakePadeg, для использования программы в Microsoft Word находятся в файле MacroWrd.bas. Кроме того, в поставку входит шаблон Declen.dot. Поместите его в каталог "\Program Files\Microsoft Office\Шаблоны" или другой, содержащий шаблоны для MS Office. Создайте документ на основе этого шаблона ("Пуск->Создать документ Microsoft Office"). Напечатайте в именительном падеже ФИО полностью, выделите его и нажмите в панели инструментов "Склонение ФИО" любой падеж (для ФИО записанного в произвольном падеже необходимо выбрать "Именительный"). Если выделено менее трех слов, преобразования не произойдет. 7.2. Использование в Microsoft ExcelМакросы, основой которых является функция MakePadeg, для использования программы в Microsoft Excel находятся в файле MacroExl.bas. Для преобразования сделайте активной ячейку, содержащую фамилию, имя и отчество и выполните макрос необходимого падежа (для ФИО, записанного в произвольном падеже необходимо выполнить макрос "Именительный"). Если ячейка содержит менее трех слов, преобразования не произойдет. Как отмечалось выше, настоящая версия программы дополнена функцией для восстановления именительного падежа для ФИО, заданного в произвольном падеже в формате "Фамилия Имя Отчество". К сожалению, нам не удалось получить точности восстановления именительного падежа, сравнимой с точностью преобразования в некоторый падеж. Это связано, в частности, с тем, что запись, допустим, родительного падежа для разных фамилий (Перцева и Перцевая) могут совпадать (Перцевой). Подобную коллизию не в состоянии разрешить даже человек. Кроме того, окончаниями некоторых фамилий в склонении могут быть гласные: "ы", "и", "у", "ю", "е". Как известно, фамилии, имеющие такие окончания, относятся к несклоняемым и поэтому при восстановлении невозможно определить является ли такая фамилия несклоняемой или получила такое окончание в результате склонения. Однако если фамилия с таким окончанием присутствует в словаре исключений, то восстановление происходит без проблем. Значительно повысить точность восстановления именительного падежа можно с помощью некоторой базы ФИО. В файле Declen.bas приведен текст функции NominativeByBase, использующей для восстановления именительного падежа локальную базу данных. Суть алгоритма сводится к следующему: получив ФИО для восстановления, выполняется запрос к базе данных на выборку ФИО, подобных заданному. Затем каждое из полученных ФИО последовательно преобразуется во все допустимые падежи и результат преобразования сравнивается с исходным ФИО. При полном совпадении считаем, что именительным падежом ФИО будет очередная выборка из базы. Если совпадения не удалось достичь, то именительный падеж восстанавливается экспортируемой функцией DLL. Такой подход, кроме повышения точности, может расширить спектр ФИО для которых возможно восстановление именительного падежа за счет включения в обработку ФИО с инициалами и ФИО, записанных в формате "Имя Фамилия" (естественно, при наличии в базе поля, определяющего род, и после соответствующей коррекции кода функции). При этом, использование некоторого признака (в примере - Exact) позволяет определить восстановлено ли ФИО с использованием базы данных или нет. Во втором случае можно выводить диалоговое окно с предложением проверить и откорректировать, при необходимости, результат восстановления и запросом на запись именительного падежа ФИО в базу данных. В большинстве случаев функция правильно восстанавливает именительный падеж для ФИО китайского типа, заданного двумя или тремя словами. Заметим, что приведенный алгоритм является примером и не учитывает возможность существования "полных" однофамильцев при необходимости точной идентификации. Кроме того, используя этот алгоритм восстановления именительного падежа, не следует забывать о возможном увеличении временных затрат. Словарь исключений предназначен для коррекции алгоритма преобразования составляющих ФИО, учета региональных и семейных особенностей склонения, а также для исключения неоднозначности некоторых правил. Он представляет собой текстовый файл со структурой, подобной структуре INI – файлов и содержит восемь секций в которые помещаются соответствующие компоненты ФИО, преобразование которых при склонении не должно происходить или происходить несколько иначе. Секции словаря имеют следующие имена и назначения: Первые пять секций допускают использование масок, общая часть компонент ФИО в которых обозначается символом звездочка. Например, для исключения из преобразования японских фамилий на –ава (Куросава) для обоих родов достаточно в секцию [LastName] поместить строку: *ава. Отметим, что пользоваться масками следует с известной осторожностью. Так, запись строки *ь в секцию женских имен [LastNameW], исключит из преобразования все женские имена на –ь, в том числе и Любовь. Поставляемый файл словаря исключений содержит тот минимум информации, который позволяет исправить замечания, выявленные при тестировании предыдущей версии программы. Его использование и дальнейшее пополнение целиком зависит от желания пользователей, поскольку сколнение/несклонение некоторых фамилий и имен зависит от региональных и семейных традиций, что невозможно учесть в алгоритме. Обращение к файлу словаря производится один раз при инициализации программы (первом обращении к функциям библиотеки), поэтому если в процессе работы приложения произошло изменение содержимого словаря, необходимо выполнить вызов функции UpdateExceptions для того, чтобы изменения вступили в силу, или перезапустить приложение, использующее программу. Предлагаемая программа может применяться в приложениях, требующих преобразования имен собственных в форму различных падежей. В частности, в системах автоматизированной подготовки приказов, формирования различных справок, обработки почтовой корреспонденции и пр. Приведенные ниже правила
склонения имен собственных
сформулированы по материалам
следующих источников: Не склоняются: Склоняются: Особенности склонения на –а: В программе реализован славянский вариант преобразования ФИО и, поскольку алгоритмически невозможно определить корни фамилии (славянская, русская, украинская), употребляется ли она сама по себе в качестве фамилии и т.д., при кодировании допущены некоторые отступления от приведенных правил. Например, склоняются все фамилии на –а и –я, причем в фамилиях на –а с предшествующей шипящей предполагается, что ударение никогда не падает на конец слова. Поэтому для правильного преобразования (вернее не преобразования) фамилии иностранного происхождения на ударные –а или –я (Дюма, Золя) следует помещать в соответствующую секцию словаря исключений, а в случаях зависимости окончания от положения ударения – применять ручную корректировку. Если Вы можете дополнить приведенные правила - напишите нам (желательно с точной ссылкой на источник) и мы постараемся реализовать Ваши дополнения. Последние два файла имеют одинаковое содержание и отличаются только форматом.
Со всем к Вам уважением. Плахов С.В. S.Plahov@vaz.ru Покаташкин Г.Л. pgl@gsu.unibel.by Загрузить файл можно здесь:
|