Научная статья на тему 'Кодировка символов переменной длины в алгоритме Дамерау–Левенштейна'

Кодировка символов переменной длины в алгоритме Дамерау–Левенштейна Текст научной статьи по специальности «Математика»

CC BY
641
149
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
СТРОКОВАЯ МЕТРИКА / КОДИРОВКА СИМВОЛОВ ПЕРЕМЕННОЙ ДЛИНЫ / ЮНИКОД / АЛГОРИТМ ДАМЕРАУ–ЛЕВЕНШТЕЙНА / ОБРАБОТКА ЕСТЕСТВЕННЫХ ЯЗЫКОВ / DAMERAU–LESHSHTEIN ALGORITHM / STRING METRIC / VARIABLE LENGTH CHARACTER ENCODING / UNICODE / NATURAL LANGUAGE PROCESSING

Аннотация научной статьи по математике, автор научной работы — Сидоркина Ирина Геннадьевна, Килеев Вячеслав Васильевич

Предложена модификация алгоритма Дамерау–Левенштейна для работы с кодировками переменной длины. Кодировки переменной длины отличаются тем, что один символ может кодироваться несколькими байтами, что требует дополнительных действий при работе с такими символами. Модификация алгоритма заключается в вычислении фактической длины символа и осуществлении операции сравнения не отдельных байт, а последовательности байт, кодирующих один символ. Данная модификация необходима для многих систем, работающих с естественными языками, в частности для систем верификации орфографии и грамматики. Среди языков, для которых будет полезна данная модификация и для которых отсутствуют однобайтовые кодировки, можно выделить восточные финно-угорские языки, такие, как марийский, удмуртский, коми.

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по математике , автор научной работы — Сидоркина Ирина Геннадьевна, Килеев Вячеслав Васильевич

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

VARIABLE LENGTH CHARACTER ENCODING IN DAMERAU–LEVENSHTEIN ALGORITHM

The paper is considering modification of Damerau–Levenshtein algorithm to work with variable length character encodings. Variable length character encodings are distinguished by the symbols that could be encoded in several bytes that requires additional actions to be done during the work with such symbols. Modification of the algorithm consists of calculation of actual symbol length and making comparison not of the bytes but of sequences of bytes, which encode one symbol. This modification is required for many systems that work with natural languages especially for spell and grammar verification systems. Among the languages for which this modification would be useful, it is possible to mention eastern Finno-Ugric languages such as Mari, Udmurt and Komi.

Текст научной работы на тему «Кодировка символов переменной длины в алгоритме Дамерау–Левенштейна»

5. Славутская Е.В., Абруков В.С., Славутский Л.А. Интеллектуальный анализ данных психодиагностики школьников npeAno^ocTKOBoro возраста // Вестник Чувашского университета. 2012. № 3. С. 226-231.

6. Goyal M. Applications of Data Mining in Higher Education // International journal of computer science. 2012. Vol. 9(2). P. 113.

7. Kovacic Z.J. Predicting student success by mining enrolment data // Journal of research in higher education. 2012. Vol. 15. P. 54.

8. Ranjan J. Effective educational process: a data-mining approach // Journal of information and knowledge management systems. 2007. Vol. 37(4). P. 502.

ПЕТРОВА МАРИНА ВЕНИАМИНОВНА - магистрант кафедры прикладной физики и нанотехнологий, Чувашский государственный университет, Россия, Чебоксары (vasilkovam@mail. ru).

PETROVA MARINA VENIAMINOVNA - master student of Applied Physics and Nanotechnology Chair, Chuvash State University, Russia, Cheboksary.

АНУФРИЕВА ДАРЬЯ АЛЕКСАНДРОВНА - магистрант кафедры прикладной физики и нанотехнологий, Чувашский государственный университет, Россия, Чебоксары (dashko-08@mail. ru).

ANUFRIEVA DARYA ALEXANDROVNA - master student of Applied Physics and Nanotechnology Chair, Chuvash State University, Russia, Cheboksary.

УДК 083.73 ББК 32.811.4

И.Г. СИДОРКИНА, В.В. КИЛЕЕВ

КОДИРОВКА СИМВОЛОВ ПЕРЕМЕННОЙ ДЛИНЫ В АЛГОРИТМЕ ДАМЕРАУ-ЛЕВЕНШТЕЙНА

Ключевые слова: строковая метрика, кодировка символов переменной длины, Юникод, алгоритм Дамерау-Левенштейна, обработка естественных языков.

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

I.G. SIDORKINA, V.V. KILEEV VARIABLE LENGTH CHARACTER ENCODING IN DAMERAU-LEVENSHTEIN ALGORITHM Key words: string metric, variable length character encoding, Unicode, Damerau-Leven-shtein algorithm, natural language processing.

The paper is considering modification of Damerau-Levenshtein algorithm to work with variable length character encodings. Variable length character encodings are distinguished by the symbols that could be encoded in several bytes that requires additional actions to be done during the work with such symbols. Modification of the algorithm consists of calculation of actual symbol length and making comparison not of the bytes but of sequences of bytes, which encode one symbol. This modification is required for many systems that work with natural languages especially for spell and grammar verification systems. Among the languages for which this modification would be useful, it is possible to mention eastern Finno-Ugric languages such as Mari, Udmurt and Komi.

Актуальность решения задачи построения эффективного алгоритма [3] определяется задачами, которые перед этим алгоритмом ставятся. Так в теории информа-

ции, расстояние Дамерау-Левенштейна является мерой разницы двух строк. Эта мера показывает, какое минимальное количество строковых операций при реализации алгоритма необходимо совершить, чтобы получить из одной строки другую. За строку принимается любая конечная последовательность символов.

Строковыми операциями являются: вставка одного символа, удаление одного символа, замена одного символа на другой, перестановка двух соседних символов местами (транспозиция). Расстояние Дамерау [6] предполагает возможными для выполнения все четыре строковые операции, но между двумя строками может быть совершена максимум одна операция. В то время как расстояние Левенштейна [7] предполагает только три строковые операции (за исключением транспозиции), но их количество может быть и более одного. Расстояние Дамерау-Левенштейна не только объединяет эти две отдельные меры в одну и позволяет подсчитывать все четыре строковые операции, но и может учитывать их многократное применение.

Данная мера широко применяется в алгоритмах компьютерной лингвистики, в частности в системах проверки орфографии и грамматики текстов [1], и во всевозможных нечетких моделях [2]. Тексты на языках с большим количеством носителей могут быть записаны однобайтовыми кодировками, для записи текстов на языках, не имеющих подобных кодировок, используются кодировки из международного стандарта Юникод, среди которых одной из самых распространенных является кодировка UTF-8, в которой символы (буквы) могут занимать от 1 до 6 байт. Переменная длина символов требует особого внимания при вычислении меры разницы двух строк, так как работа символа осуществляется не на уровне одного байта, а на уровне последовательности нескольких байт, что требует соответствующей модификации алгоритма Дамерау-Левенштейна.

Описание алгоритма. Работу алгоритма можно представить диаграммой деятельности (см. рис. 1). В данном алгоритме выполняются следующие операции над строками: вычисление длины строки, получение символа в і-й позиции, сравнение двух символов. В однобайтовых кодировках данные операции легко выполнимы, так как длина всех символов фиксирована и равна одному байту.

Суть алгоритма заключается в построении матрицы H размера str1.length+2 х str2.length+2. Нумерация строк и столбцов в этой матрице начинается с 0. По столбцам, начиная с первой строки - это воображаемое первое слово str1, по строкам, начиная с первого столбца - воображаемое второе слово str2. Значение каждой ячейки H[ij] показывает разницу между двумя строками str1[0:i-1] и str2[0:/-1], где str1[0:i-1] - подстрока строки str1, содержащая символы с 0-го до (і-1)-го. Значение каждой новой ячейки высчитывается на основе значений предыдущих ячеек, пока алгоритм не дойдет до последней ячейки H[str1.length+1, str2.length+1].

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

В качестве примера кодировки переменной длины в данной статье рассматривается кодировка UTF-8, входящая в стандарт Юникод. В этой кодировке один символ может занимать от 1 до 6 байт. Принцип кодирования UTF-8 можно выразить табл. 1.

Буквы латинского алфавита и знаки препинания располагаются в блоке символов под названием C0 Controls and Basic Latin [4], имеют коды от U+0000 до U+007F, занимают один байт. А кириллические буквы русского и марийского алфавитов располагаются в блоке Cyrillic [5] и имеют коды от U+0400 до U+04FF, при этом кодируются двумя байтами. Коды некоторых букв представлены в табл. 2.

Задать временную переменную strtemp как конкатенацию строк strl и str2

Добавить все символы строки 5^^етр в качестве ключей в ассоциативный массив 5с1 и задать им значение О

Задать переменную inf значением strl. Iength+str2. length

Инициализировать двумерный массив Н размером strl.length+2, str2.length+2

Задать нулевой столбец и нулевую строку массива Н значениями inf

(Задать переменной i значение l)

Инициализировать ассоциативный массив sd

(Задать переменной i значение l)

(Задать переменной db значение О) (Задать переменной j значение l)

[ Задать переменной ¡1 значение^ ^ ключа 5^2Ц-1] массива sd )

(Задать переменнойД значение ^ переменной db________________)

Совпадают ли значені Strl[i-1] и Str2[j-1]

Задать ячейке массива Н в строке ¡+1 и столбце ]+1 значение минимума ячеек

[¡+1,]], [Ц+1]

і < strl.length і,

нет

Задать ячейке в первом столбце и строке под номером I значение ¡-1

Увеличить і на 1 ---------1

(Задать

переменной jзначение

І < str2.length

1 ,

Задать ячейке массива Н в строке ¡+1 и столбце ]+1 значение ячейки в строке] и столбце]

Задать ячейке в первой строке и столбце под номером] значение ]-1

( Увеличитьjна 1 )

Задать ячейке массива Н в строке ¡+1 и столбце ]+1 значение минимума ячейки [¡+1^+1] и значения ячейки [1+1,]+1] + (н1-1)+1+(Н1-1)

j <= str2.leng1

i <= strl.lenj

Увеличить i на единицу -------------—

Увеличить] на единицу)—

Задать значение ключа strl[i-l] массива sd значение i

Результат - значение ячейки в строке strl.length+1 и столбце str2.length+l массива Н

Рис. 1. Диаграмма деятельности оригинального алгоритма

Принцип кодирования UTF-8

Таблица 1

Количество бит в коде Первый код диапазона Последний код диапазона Коли- чество байт Байт 1 Байт 2 Байт 3 Байт 4 Байт 5 Байт 6

7 U+0000 U+007F 1 Oxxxxxxx

11 U+0080 U+07FF 2 110xxxxx 10xxxxxx

16 U+0800 U+FFFF 3 1110xxxx 10xxxxxx 10xxxxxx

21 U+10000 U+1FFFFF 4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

26 U+200000 U+3FFFFFF 5 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

31 U+4000000 U+7FFFFFFF 6 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

Таблица 2

Значения кодов некоторых букв и символов Юникод в кодировке иТГО

Буква/символ Код буквы/символа Юникод в шестнадцатеричной системе Код UTF-8 в двоичной системе

- U+002D 00101101

A U+0041 01000001

Z U+005A 01011010

a U+0061 01100001

z U+007A 01111010

Е U+0401 1101000010000001

А U+0410 1101000010010000

Я U+042F 1101000010101111

а U+0430 1101000010110000

п U+043F 1101000010111111

Р U+0440 1101000110000000

я U+044F 1101000110001111

ё U+0451 1101000110010001

Н U+04A4 1101001010100100

к U+04A5 1101001010100101

А U+04D2 1101001110010010

а U+04D3 1101001110010011

О U+04E6 1101001110100110

О U+04E7 1101001110100111

Y U+04F0 1101001110110000

У U+04F1 1101001110110001

ы U+04F8 1101001110111000

ы U+04F9 1101001110111001

Если работать со строками, закодированными в кодировке с переменной длиной символов, таким же образом, как и с однобайтовыми кодировками, это приведет к некорректным результатам работы алгоритма Дамерау-Левенштейна. Это наглядно демонстрируют результаты эксперимента, представленные в табл. 3.

Таблица 3

Результаты эксперимента, демонстрирующие неправильность работы алгоритма Дамерау-Левенштейна с кодировками с переменной длиной символов

на примере иТЕ-8

№ теста Строка 1 Строка 2 Результат работы алгоритма Дамерау- Левенштейна Пра- виль- ный резуль- тат Комментарий

1 report report 0 0 Одинаковые строки

2 repoort report 1 1 Вставка одного символа

3 repot report 1 1 Удаление одного символа

4 deport report 1 1 Замена символа

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

5 reprot report 1 1 Транспозиция. Несуществующее слово

6 export report 2 2 Несколько операций одновременно: вставка символа и удаление символа или можно еще как транспозиция и замена

7 корно корно 0 0 Одинаковые строки

8 кор-но корно 1 1 Вставка одного символа. Длина символа -один байт

Окончание табл. 3

№ теста Строка 1 Строка 2 Результат работы алгоритма Дамерау- Левенштейна Пра- виль- ный резуль- тат Комментарий

9 корено корно 2 1 Вставка одного символа, так как длина символа два байта

10 корно кор-но 1 1 Удаление одного символа. Длина символа -один байт

11 коно корно 2 1 Удаление одного символа, так как длина символа два байта

12 коёно коЕно 2 1 Замена символа. Оба байта разные

13 кобно коОно 1 1 Замена символа. Отличие только в одном байте

14 корно корко 2 1 Замена символа. Оба байта разные

15 коано копно 1 1 Замена символа. Отличие во втором байте, первые байты одинаковые, поэтому результат правильный

16 корно копно 2 1 Замена символа. Два байта отличаются

17 кояно корно 1 1 Замена символа. Первые байты одинаковые, отличие только во втором байте

18 ко-но корно 2 1 Замена символа. Двубайтовый символ заменяется на однобайтовый

19 коапо копао 2 1 Транспозиция. Отличается только один байт

20 корпо копро 4 1 Транспозиция. Отличие в двух байтах

21 кояро коряо 2 1 Транспозиция. Отличие в одном байте

22 ко-рно кор-но 2 1 Транспозиция. Меняются местами однобайтовый и двубайтовый символы

Как видно из табл. 3, алгоритм получает правильные результаты только для строк, написанных на латинице, где все символы находятся в блоке C0 Controls and Basic Latin [4] и имеют длину один байт. В случае, если длина символа более одного байта, результат работы алгоритма неверный.

Предлагаемые изменения в алгоритме. Модификация работы алгоритма Да-мерау-Левенштейна для обеспечения работы с кодировками символов переменной длины в текстах на марийском и других языках заключается в следующем. Во-первых, предлагается ввести четыре дополнительные функции для работы со строками переменной длины:

int char_len (char ch) - определяет фактический размер символа в байтах, по первому байту символа;

bool cmp_char (const char* strl, int posl, int char_len1, int str_len1, const char* str2, int pos2, int char_len2, int str_len2) - сравнение двух символов в заданных позициях в двух разных строках;

int str_len (const char* str, int byte_len) - определение фактической длины строки в символах, а не в байтах;

string get_char (string str, int pos) - получение символа в заданной позиции, символ возвращается как строка, которая может содержать от одного до шести байт.

Ниже на рис. 2 приводится пример задания этих четырех функций для кодировки UTF-8 на языке С++.

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

int char len(char ch) { if (((ch»7) & 1) = 0) { return 1;

if (((ch»5) & 7) == 6) { return 2;

if (((ch»4) & 15)== 14) { return 3;

if (((ch»3) & 31) == 30) { return 4;

if (((ch»2) & 63) == 62) { return 5;

if (((ch»l) & 127)== 126) { return 6;

bool cmp char(const char* strl, int posl, int char lenl, int str lenl, const char* str2, int pos2,

int char len2, int str len2)

{

if (char lenl !=char len2) { return false;

}

if (str_lenl<posl+char_lenl || str len2<pos2+char len2) { return false;

}

for (unsigned chari=0; i<char lenl; i++) { if (strl[posl+i]!=str2[pos2+i]) { return false;

}

}

return true;

int str len(const char* str, int byte len) { int len=0; int pos=0;

while (pos<byte len) {

char tek len=char len(str[pos]);

pos+=tek_len;

len++;

}

return len;

string get char(string str, int pos) {

return str.substr(pos,char len(str.c str()[pos]));

}

Рис. 2. Пример задания функций для работы с кодировкой переменной длины UTF-8 на языке программирования С++

Рис. 3. Диаграмма деятельности модифицированного алгоритма

Изменения, внесенные в диаграмму, отображены полужирным шрифтом. Блоки, обозначающие действия, дополнительно выделены серым цветом фона. В случае, если работа происходит с другой кодировкой с переменной длиной символов (не с UTF-8), необходимо переопределить всего одну функцию char_len.

Выводы. Алгоритм Дамерау-Левенштейна широко применяется в компьютерной лингвистике, в частности в системах верификации орфографии и грамматики, а также в лингвистических моделях.

Этот алгоритм хорошо справляется с однобайтными кодировками, но представление текстов на некоторых языках возможно только с использованием кодировок с переменной длиной символов, в частности тексты на марийском языке можно представить только в кодировках стандарта Юникод.

В результате вычисления реальной длины символа предложенная модификация алгоритма Дамерау-Левенштейна, реализованного в компьютерной системе, позволяет определить меру разницы двух строк, закодированных не только в однобайтовых кодировках, но и в кодировках с переменной длиной символов в текстах на многих языках, в том числе и финно-угорской группы.

Литература

1. Килеев В.В. Компоненты архитектуры компьютерной системы верификации орфографии финно-угорских языков // Программные системы и вычислительные методы. 2012. № 1. С. 37-42.

2. Килеев В.В., Сидоркина И. Г. Анализ лингвистических конструкций формальной модели языка для верификации грамматики финно-угорского текста // Известия КабардиноБалкарского научного центра РАН. 2013. Вып. 1. С. 14-20.

3. Коробейников А.Г., Кудрин П.А., Сидоркина И.Г. Алгоритм распознавания трехмерных изображений с высокой детализацией // Вестник Марийского государственного технического университета. Сер. Радиотехнические и инфокоммуникационные системы. 2010. № 2(9). С. 91-98.

4. C0 Controls and Basic Latin [Electronic resource]. URL: http://www.unicode.org/ charts/PDF/U0000.pdf.

5. Cyrillic [Electronic resource]. URL: http://www.unicode.org/charts/PDF/U0400.pdf.

6. Damerau F.J. A technique for computer detection and correction of spelling errors // Communications of the ACM. 1964. Vol. 7, Issue 3. P. 171-176.

7. Levenshtein V.I. Binary codes capable of correcting deletions, insertions, and reversals // Soviet Physics Doklady: Proceedings ofthe Academy of Sciences of USSR, Physics section. 1996. Vol. 10.

СИДОРКИНА ИРИНА ГЕННАДЬЕВНА - доктор технических наук, профессор, декан факультета информатики и вычислительной техники, Поволжский государственный технологический университет, Россия, Йошкар-Ола (igs592000@mail.ru).

SIDORKINA IRINA GENNADYEVNA - doctor of technical sciences, professor, dean of Computer Science and Computer Engineering Faculty, Volga State University of Technology, Russia, Yoshkar-Ola.

КИЛЕЕВ ВЯЧЕСЛАВ ВАСИЛЬЕВИЧ - аспирант кафедры информационновычислительных систем, Поволжский государственный технологический университет, Россия, Йошкар-Ола (slavakileev@yandex.ru).

KILEEV VIATCHESLAV VASILYEVICH - post-graduate student of Data-Processing Systems Chair, Volga State University of Technology, Russia, Yoshkar-Ola.

i Надоели баннеры? Вы всегда можете отключить рекламу.