Литература С.А.Романенко, С.В.Савосин, А.В.Спицын,
1. Fowler M. Refactoring. Improving the П.Б. Фельдман. - СПб.:Изд-во СПбГЭТУ Design of Exiting Code. - Boston: Addison- «ЛЭТИ», 2002
Wesley, 1999. 3. А.Л. Калабин, E.H. Грязнов. Рефак-
2. Реинжиниринг и рефакторинг про- торинг исходного кода. Основные приемы// граммного обеспечения: Учеб. пособие/ Программные продукты и системы. 2013. №2
УДК 004.42 Х.С Ясулова, Дагестанский государственный
педагогический университет
ПОСТРОИТЕЛЬ КОМПЬЮТЕРНОГО СЛОВАРЯ
В статье приводится пример построителя, который выступает как источник информации и помощник при построении различных слов и выражений, основной функцией которой является построения компьютерного словаря.
Ключевые слова: «построитель», «математическая модель», «компьютерная модель», «граф», «сеть», «морфология», «синтаксис», «семантика», «словосочетание», «синтаксический анализатор», «морфологический анализатор» модели синтаксиса».
The article provides an example of a Builder that acts as a source of information and assistant to build different words and expressions which main function is building computer dictionary.
Keywords: builder, mathematical model, computer model", "graph", "network", "morphology", "syntax", "semantics", "phrase", "parser", "morphological analyser" model syntax".
Термин построитель (выражений, В русском языке имена и глаго-объектов и т.д.) широко используется в лы являются изменяемыми частями различных приложениях при визуаль- речи. Имена существительные име-ном программировании. Построитель ют наименьшее число форм, но не выступает как источник информации так просто по исходной форме слова и помощник при построении различ- определить все 12 его форм. Необхо-ных слов и выражений. Построитель димость в наличии такой процедуры компьютерного словообразовательного возникает в тех случаях, когда при словаря русского языка должен быть наборе или анализе текста встреча-важной составной частью (службой) ется слово, отсутствующее в слова-текстового редактора и любого ана- ре. Предположим, что таким словом лизатора предложений ЕЯ. оказалось имя «доска». Приложение
(программа) спрашивает у пользователя: Сохранить ли это слово в словаре? Да, мы хотим сохранить это слово в словаре, и не только его, а все 12 его форм.
Для пополнения словаря новым словом и всеми его формами необходимо решить следующие задачи:
• иметь в наличии все формы этого слова, включая и само слово;
• оптимально разместить их в одной словарной статье;
• иметь возможность выбрать любую из словоформ.
Нет надобности повторно описать структуру морфологического правила и словарной статьи, которые подробно описаны в Главе 2. Здесь рассматриваются вопросы программного обеспечения названных выше задач.
Одной из основных процедур, разумеется, является процедура, которая по исходной строке морфологического правила
в-и-р1,р2,... рк; (5.1)
строит все к словоформ этой парадигмы:
S1> S2> . . . Sk
(5.2)
Напомним, морфологическое правило для парадигмы 1 (6 падежных форм имени в единственном числе) имени «доска» имеет следующий вид: «доска-1-а,и,е,у,ой,е;».
По правилу (5.1) образуются словоформ следующим образом.
N1 := Length(s) - п;
S0 := Copy(s, 1, n1);
S[i] := s0 + p., i = 1..k.
Извлечение элементов строки sp = «s-n-p1,p2, . . . pk;» не представляет труда.
Procedure RuleToWordforms (spl: string; Var s: ArrStr_k);
{ Type ArrStr_k = array [1..k] of string}
Var
I: Integer;
S: string;
begin
i := Pos('-', sp); s := Copy(sp, 1, i - 1);
Delete(s, 1, i);
i := Pos('-', sp); n := Val(Copy(sp, 1, i - 1)); S1 := Copy(s, 1, n1);
Delete(sp, 1, i-1);
While sp[1] = ',' do
Begin
Delete(sp, 1, 1);
i := Pos(7, sp); p := Copy(sp, 1, i - 1);
Delete(sp, 1, i-1);
S[i] := s1 + p;
End;
End;
Следующей по важности процедурой является процедура обратная RuleToWordforms; она из последовательности словоформ (5.2) строит правило (5.1).
Процесс построения морфологического правила состоит из нескольких шагов:
• выделение общей левой части для всех слов из (5.1);
• вырезка общей левой части из всех слов (5.1) и формирование последовательности постфиксов;
• формирование морфологического правила.
Для выделения общей левой части для нескольких слов используется следующая процедура, выделяющая общую левую части для двух слов.
function LeftComm(s, t: string): string ; var
i: integer; begin i: = 1;
if (s='') or (t='') then begin ShowMessage('Слова не определены'); Exit; end;
while (s[i] = t[i]) and (i < length (s)) and (i < length(t)) do inc(i); if s[i] <> t[i] then dec(i); Result := copy(s, 1, i); end;
Если падежные формы имени хранятся в массиве WForms[1..6], то общая левая часть s для них определяется следующими командами:
s:= WForms[1];
for i := 2 to 6 do s := LeftComm(s, WForms [i]);
Предположим, что падежные формы имени хранятся в массивах: WForms1 [1..6] - формы единственного числа; WForms2 [1..6] - формы множественного числа. Следующая функция с параметром num = 1 или 2 формирует морфологическое правило, порождающее падежные формы имени единственного числа (num = 1) или множественного числа (num = 2).
function WFormsToPostFix(num: integer): string;
var
i, LenLeftComm: integer; s, t, parad: string; WFs: array[1..6] of string;
Begin if num = 1 then Begin
parad := '1130'; for i : = 1 to 6 do WFs[i] : = WForms1[i] end
else Begin
parad := '1230'; for i : = 1 to 6 do WFs[i] : = WForms2[i] end;
{Выделяется общая левая часть для всех словоформ } S := WForms1[1]; for i := 2 to 6 do s := Left Comm(s,WFs[i]);
LenLeftComm := Length(s);
{Далее формируется последовательность постфиксов}
S := '';
for i := 1 to 6 do begin t := WFs[i];
Delete(t, 1, LenLeftComm); S := s + t + ','; end;
щихся списка ComboBox для выбора рода имени и его одушевленности.
После того как определены имя и его род и одушевленность, можно воспользоваться кнопками Button с надписями: «Формы ед. числа» и «Формы мн. числа». После нажатия на эти ко-
{Формируется мандные кнопки под ними появятся
морфологическое правило}
t := IntToStr(LenLeftComm); if LenLeftComm < 10 then t : =
'0'+t;
Result := WFs[i] + parad + t + s; end;
многострочные редакторы Memo, в которых будут отображены падежные формы рассматриваемого слова.
В качестве падежных форм имени можно брать его исходную форму и предложить пользователю от-
редактировать формы имени. Можно Теперь пора обозначить элемен- изучить правила склонения имен и ты Формы (Form1), в которых будут попытаться программно отобразить отображаться рассматриваемое имя формы имени и, тем самым, облег-
и его формы.
На Forml расположены три па-
чить работу пользователю.
Разработка процедур, образую-
нели. В левой части нижней панели щих падежные формы имени, яв-можно открыть словарь языка, а в ляется самой трудоемкой частью
правой части отображается словарная статья рассматриваемого сло-
построителя словарной статьи. Здесь ничего не надо изобретать.
ва. В верхней части Forml располо- Нужна кропотливая работа по из-жены две панели: на панели справа учению правила склонения имен и
находятся элементы для распознавания словоформы, а на панели
реализации их в виде процедур. Под каждым редактором Memo
слева - элементы для добавления расположена командная кнопка «Го-
нового слова в словарь. Именно, тово». При нажатии на кнопку «Гото-
эта функция проекта рассматрива- во» выписывается морфологическое
ется ниже. правило (листинг соответствующей
На верхней части панели нахо- процедуры приводится ниже), по
дится элемент Edit (однострочный которому можно будет строить все
редактор), в котором записывает- шесть форм, указанных в соответ-
ся исходное слово. Справа от самого ствующем редакторе. Строящаяся
слова расположены два раскрываю- словарная статья будет отображена
на нижней панели напротив надписи: «Словарная статья».
Командная кнопка «Записать в словарь» используется для добавления в словарь полученной словарной статьи.
Командная кнопка «Словарь» используется для показа (Show) и скрытия (Hide) словаря.
var
i, LenLeftComm: integer; s, t: string; begin
if MmNum1.Count < 6 then begin
ShowMessage('Hет словоформ'); Exit; End;
{Если в редакторе MmNum1 перечислены формы имени,
то они переписываются в массив WForms1[1..6]}
for i: = 1 to 6 do WForms1[i]: = MmNum1.Lines[i-1];
{Строка s, представляющая собой последовательность
постфиксов для словоформ из WForms1, формируется функцией WFormsToPostFix(WForms1)}
s:= WFormsToPostFix(WForms1);
{Далее к строке s приписывается само слово DictFormNW и код парадигмы <1130 и получается морфологическое правило}
Рис. 2. Процедура построения s := DictFormNW + '1130' + s;
морфологических правил Label6.Caption:= DictFormNW;
Листинг процедуры для построе- end; ния морфологического правила.
Падежные формы единственного procedure TForm1.Button 4 Click числа имени DictFormNW находи-(Sender: TObject); лись в редакторе MmNum1, поэтому
Рис.1. Построитель компьютерного словаря
приведенная выше процедура строила морфологическое правило, образующее формы имени в единственном числе.
Падежные формы множественного числа имени DictFormNW находятся в редакторе MmNum2, поэтому следующая процедура строит морфологическое правило, образующее формы имени в множественном числе.
procedure TForml.Button 5 Click (Sender: TObject); var
i, LenLeftComm: integer; s, t: string; begin
if MmNum2.Count < 6 then begin
ShowMessage('Hет словоформ');
Exit;
End;
for i: = 1 to 6 do WForms2[i]: = MmNum1.Lines[i-1];
s:= WFormsToPostFix(WForms2); s := DictFormNW + '1230' + s; Label6.Caption:= DictFormNW; end;
Функция WFormsToPostFix (s: array[1..6] of string) также очень проста имеет следующий вид.
function WFormsToPostFix(WFs: array[1..6] of string): string; var
i, LenLeftComm: integer;
s, t: string;
Begin
S := WForms1[1]; { s -
исходная форма имени }
for i :=2 to 6 do s := LeftComm(s, WFs[i]);
{ s - общая левая часть словоформ WFs[1..6] }
LenLeftComm := Length(s); s:= '';
for i :=1 to 6 do begin t := WFs[i];
Delete(t, 1, LenLeftComm); S := s + t + ','; end;
{ s - последовательность постфиксов, вырезанных из
каждой формы WFs[1..6] и разделенных запятой }
t := IntToStr(LenLeftComm); if LenLeftComm < 10 then t := '0' + t + ':';
Result := t + s; end;
Из приведенных процедур видно, что построитель словарной статьи достаточно простая программа, если под построителем подразумевать программу, которая из словоформ WFs[1..6] строить соответствующее правило для восстановления элементов WFs[1..6]. Например, если
WFs[1..6] = (доска, доски, доске, доску, доской, доске)
то WFormsToPostFix(WFs) = '04:а,и,е,у,ой,е'.
Однако рассмотренные выше процедуры составляют менее 5% от общего объема программы-построителя словарной статьи. Программа усложняется настолько, насколько точно она сможет «угадать» формы отсутствующего в словаре слова. Работа пользователя упрощается настолько, насколько точно программа «угадает» формы имени. Морфология имен в русской грамматике настолько сложна множеством исключительных случаев, что их перечисление и реализация занимает много времени и увеличивает объем кода программы.
Кроме процедур, формирующих морфологические правила, образующие формы имен, в программе-построителе словарной статьи должны присутствовать процедуры, оптимизирующие работу со словарем.
Таким образом, разработка построителя компьютерного словаря может быть интересна как начинающему, так и опытному программисту.
Литература
1. Ножов И.М. Морфологическая и синтаксическая обработка текста (модели и программы) М., 2003, Канд. диссертация.
2. Слобин Д., Грин Дж.. Психолингвистика. М., «Прогресс», 1976, 350 с.
3. Тестелец Я.Г.. Введение в общий синтаксис. М., Российский государственный гуманитарный университет, 2001, 798 с.
4. Тузов В.А. Математическая модель языка. - Л., Изд-во ЛГУ, 1984.
5. Тузов В.А. Синтаксическая структура русского языка. //Вестник СПбГУ. Сер.1, 1997, вып.1 (№17).
6. Харари Ф. Теория графов. М., «Мир», 1874, 344 с.
7. Шихиев Ф.Ш. Формализация и сетевая формулировка задачи синтаксического анализа. Канд. диссертация.