Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

DX.MISC.Склонение фамилий.

49 views
Skip to first unread message

Sergey V. Plahov

unread,
Jul 5, 2000, 3:00:00 AM7/5/00
to
Привет!

Предлагаю Вашему вниманию нашу библиотеку склонения фамилий.
Вышлю всем желающим. Полный архив ~50kB(в нем исходники, проект для
комписяции DLL, скомпилированная DLL, шаблон для Word'а, readme.txt,
RulesFIO.txt). Сюда выложить не могу, помимо правил, отказывает шлюз.
Прочитайте приведенный далее readme.txt.
Пишите, обсудим.

Yours faithfully, Sergey V. Plahov. mailto:S.Pl...@vaz.ru
Engineer. Training center of joint-stock company "AutoVAZ"

===== begin readme.txt =====
FIOPadeg, version 1.0, 2000 г.

(c) Copyright 2000
Sergey V. Plahov aka Seer
Gennady Pokatashkin
Tolik Gusin aka Stalker

Нет ничего настолько исправного, чтобы в нем не было ошибок.
/Ф. Петрарка/


0. Введение
-----------

Правила склонения или не склонения фамилий, имен и отчеств в русском
языке
описаны в файле "RulesFIO.txt".
Идеальным считается случай, когда мы имеем фамилию, полное имя, отчество
без сокращений и явное указание пола. Если не имеем пола его однозначно
определяем по окончанию отчества.
Корректно обрабатывается фамилия с инициалами (Сидоров И.П.), склонятся,
бу-
дет только фамилия (у Сидорова И.П.), естественно, при явно указанном поле.
"Двуспальные" фамилии (и даже "трехспальные", если такие есть)
склоняются по
установленным правилам. В общем случае, будут верно склоняться "N-спальные"
с
любым N. Единственное требование фамилия должна идти через дефис:
Лебедев-Кумач,
Уткин-Задунайский-Краматорский.


1. Описания процедур и функций модуля FIOPadeg.pas
--------------------------------------------------

Модуль склоняет фамилии, полные имена и отчества (ФИО) по правилам
русского
языка. Это обычный модуль Object Pascal'я, никаких специальных мер установки
не
предусматривается.
Для успешной компиляции Вы должны использовать библиотеку RXLib. Если Вы
ее
не используете, то нужно заменить все вызовы функции ExtractWord на вызов
функ-
ции A_ExtractWord (функция описана в этом модуле) и подправить список
аргумен-
тов. В последнем случае исключается возможность использования в качестве
разде-
лителей фамилии, имени и отчества точки и табуляции. Разделителем в этом
случае
может быть только единичный пробел.
Далее прокомментированы только функции, описанные в разделе interface
данно-
го модуля.

1) function GetFIO(cLastName, cFirstName, cMiddleName, cSex: String;
nPadeg: Integer): String;
Собственно функция склонения фамилии, имени и отчества.

Аргументы:
cLastName - фамилия,
cFirstName - имя,
cMiddleName - отчество,
сSex - пол, (допустимые значения "м", "ж" и "", в последнем случае
пол
будет определен по отчеству),
nPadeg - падеж (допустимые значения 1..6).
1-именительный,
2-родительный,
3-дательный,
4-винительный,
5-творительный,
6-предложный.

Просто передайте в качестве аргументов ФИО в именительном падеже,
укажите
пол или пустую строку, если пол неизвестен и получите ФИО в том падеже,
какой
задали аргументом nPadeg.


2) function GetFIOFromStr(FIO: String; cSex: String; nPadeg: Integer):
String;
Функция аналагична GetFIO, за исключением того, что принимает ФИО,
записан-
ное одной строкой.


3) function NonDeclension(AnyWord: String; Male: Boolean; IsLastName:
Boolean): Boolean;
Функция проверки на допустимость склонения фамилии или имени.

Аргументы:
AnyWord - фамилия или имя,
Male - род (True - мужской; False - женский),
IsLastName - True если передается фамилия, False во всех прочих случаях.

Внутренняя функция, но может использоваться для определения склоняемости
фа-
милии или имени в приложениях.


4) function GetSex(cMiddleName: String): Char;
Функция определения пола по отчеству.

Тоже внутренняя функция и тоже может использоваться в приложениях.
Передаете
отчество, получаете пол в виде буквы "м" или "ж". Корректно обрабатывает
отчест-
ва, оканчивающиеся на Оглы (сын) и Кызы (дочь).


5) procedure SeparateFIO(cFIO: String; var cLastName, cFirstName,
cMiddleName: String);
Процедура разделения переданных в одной строке (cFIO) через пробел
фамилии,
имени и отчества на отдельные фамилию (cLastName), имя (cFirstName) и
отчество
(cMiddleName).

Аргументы:
cFIO - фамилия, имя, отчество одной строкой через пробелы
cLastName - фамилия,
cFirstName - имя,
cMiddleName - отчество

Если приложению доступно ФИО, записанное одной строкой через пробелы,
ис-
пользуйте эту функцию перед вызовом GetFIO, а лучше обращайтесь к функции
GetFIOFromStr.


2. Описания процедур и функций модуля Syllable.pas
--------------------------------------------------

В разделе implementation модуля FIOPadeg есть ссылка на Syllable; Из
этого
модуля используются набор:

Vocalic: Set of Char = ['а','о','у','ы','э','я','е','ё','ю','и'];,
содержащий
гласные буквы

и функция

function CountSyllable(AnyWord: String): Integer;, определяющая количество
слогов в переданном ей слове по количеству гласных.

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

Для использования в Delphi 1/2/3/4/5.


3. Динамически подключаемая библиотека (DLL)
--------------------------------------------

В поставку входит скомпилированный файл PADEG.DLL с разделом экспорта:
exports
GetFIOPadeg Name 'GetFIOPadeg',
GetFIOPadegAutoSex Name 'GetFIOPadegAS',
GetFIOPadegFromStr Name 'GetFIOPadegFS',
GetFIOPadegFromStrAutoSex Name 'GetFIOPadegFSAS',
Get_FIO Name 'GetFIO',
Get_FIO_FromStr Name 'GetFIOFromStr',
Non_Declension Name 'NonDeclension';
end.

И объявлениями следующих функций:

procedure GetFIOPadeg(pLastName, pFirstName, pMiddleName: PChar;
bSex: Boolean; nPadeg: LongInt; Result: PChar;
var nLen: LongInt); stdcall;

procedure GetFIOPadegAutoSex(pLastName, pFirstName, pMiddleName: PChar;
nPadeg: LongInt; Result: PChar;
var nLen: LongInt); stdcall;

procedure GetFIOPadegFromStr(pFIO: PChar; bSex: Boolean; nPadeg: LongInt;
Result: PChar; var nLen: LongInt); stdcall;

procedure GetFIOPadegFromStrAutoSex(pFIO: PChar; nPadeg: LongInt; Result:
PChar; var nLen: LongInt); stdcall;

function Get_FIO(pLastName, pFirstName, pMiddleName: ShortString;
Sex: Char; nPadeg: LongInt): ShortString; stdcall;

function Get_FIO_FromStr(pFIO: ShortString; Sex: Char;
nPadeg: LongInt): ShortString; stdcall;

function Non_Declension(AnyWord: ShortString; Male: Boolean;
IsLastName: Boolean): Boolean; stdcall;


GetFIOPadeg, GetFIOPadegAutoSex и Get_FIO это, по сути, аналоги функции
GetFIO, но помимо типа параметров (PChar), GetFIOPadeg и GetFIOPadegAutoSex
объявлены как процедуры возвращающие ФИО в параметре Result: PChar.
Процедуры
GetFIOPadegFromStr и GetFIOPadegFromStrAutoSex аналоги двух предыдущих для
входных данных представленных одной строкой. Кроме того, в процедурах
GetFIOPadegAutoSex и GetFIOPadegFromStrAutoSex выполняется автоматическое
определние пола по отчеству. Функция Get_FIO принимает параметры и
возвращает
результат как ShortString, поскольку ФИО с более чем 255 символами едва ли
встречаются.

Функция Non_Declension - аналог NonDeclension.


4. Для пользователей продуктов MS Office
----------------------------------------

Данная библиотека позволяет осуществлять склонение ФИО в приложниях на
VBA
(в частности в офисных приложениях MS Access, Word, Exel).
Прилагаем шаблон (declen.dot) c макросами склонения для Word'а.
Поместите его в каталог "\Program Files\Microsoft Office\Шаблоны", а
библиотеку Padeg.dll в "\Windows\System" (\WinNT\SYSTEM32\) для Windows NT.
Создайте документ на основе шаблона declen.dot ("Пуск->Создать документ
MicroSoft Office"). Напечатейте ФИО полностью, выделите и нажмите в панели
инструментов "Склонение ФИО" любой падеж.

Пример объявления функций для Access:

Declare Sub GetFIOPadeg Lib "Padeg.dll" _
(ByVal pLastName As String, ByVal pFirstName As String, _
ByVal pMiddleName As String, ByVal bSex As Boolean, ByVal nPadeg As
Long, _
ByVal Result As String, ByRef nLen As Long)

и ее использования:

Function GetFIO(ByVal cLastName As String, ByVal cFirstName As String, _
ByVal cMiddleName As String, ByVal bSex As Boolean, _
ByVal nPadeg As Long) As String
Dim tmpS As String
Dim nLen As Long
tmpS = String(255, 0)
GetFIOPadeg cLastName, cFirstName, cMiddleName, bSex, nPadeg, tmpS, nLen
GetFIO = Mid(tmpS, 1, nLen)
End Function
(tested)

Обращение к остальным процедурам DLL выполняется аналогично.


5. Наконец-то
-------------
Как сказал Геннадий: "... легче написать 100кб кода, чем 10кб отчета".
Теперь о недостатках.
Не решено склонение некоторых фамилий оканчивающиеся на "-ец" и "-а" в
тво-
рительном падеже. Дело в том, что вид окончания там зависит от ударения и
скло-
нение выполняется в предположении, что ударение никогда не падает на
окончание.
Есть предложение ставить апостроф (') после ударной гласной для обозначения.
Только кто его будет ставить..? Это во-первых. А во-вторых, анализ на
апостроф в
данной версии не реализован.
Кто посоветует алгоритм определения ударения с использованием
минимальной
базы (а лучше без оной) тому орден с большое чайное блюдце. ;-)) К тому же
смеем
надеяться, что Вам редко будет нужен творительный падеж в деловых
документах.
Не реализовано склонение фамилий, состоящих из нескольких слов, типа
корей-
ских, вьетнамских, бирманских (Цой Хен, Фам Ван Донг, У Ку Линг, Игуен Ван
Хиву)

Вернитесь в начало этого файла, прочитайте еще раз эпиграф, сильно не
ругай-
тесь, но присылайте _ценные_ замечания и предложения.

Со всем к Вам уважением.
Плахов С.В. mailto:S.Pl...@vaz.ru
Покаташкин Г.Л. mailto:p...@gsu.uniibel.by
Гусин А. mailto:stalke...@yahoo.com
===== End readme.txt =====


0 new messages