Описание алгоритма и скрипт
Обсудить в форуме Комментариев 4
Оглавление
Расстояние Левенштейна (также редакционное расстояние или дистанция редактирования) — мера разницы двух строк относительно минимального количества операций вставки, удаления и замены, необходимых для перевода одной строки в другую или другими словами расстояние между строками.
В данной статье вводится понятие метрики, заданной на множестве строк и приводится пример функции, написанной на языке Python, вычисляющей расстояние между двумя строками.
Часто приходится иметь дело с информацией, представимой в виде последовательности символов, чисел и т.п., т.е. строковыми данными. При этом не менее часто в строковую информацию вносятся искажения, избежать которых очень трудно. Простейшим примером может служить любая более менее крупная база данных: почти навеняка в ней содержатся ошибки оператора, сделанные при наборе. Поэтому задача сравнения строк, определение степени их близости между собой, - задача весьма востребованная.
Практическая задача может быть представлена следующим образом. Имеем два набора данных, в нашем случае исходный - список названий населенных пунктов к которым нужно найти альтернативы, опорный - список правильных названий населенных пунктов. Исходный список может изобиловать ошибками и неточностями, необходимо посчитать расстояние от каждого вхождения исходного списка к опорным. Результат 0 может показывать, что в исходном списке есть абсолютный аналог в опорном, 1, что в опорном есть аналоги отличающиеся на 1 символ и т.д.
Метрика Левеншейна использовалась для перевода базы данных по населенным пунктам с Vmap0 на русский язык. В качестве опорной использовалась база данных КЛАДР.
Предположим, что имеется некоторое множество каких-либо элементов (например, множество символьных строк, или множество точек на плоскости или др.). Предположим, что было выбрано наугад два элемента заданного множества, и перед нами стоит задача установить, насколько они близки друг к другу. Если элементы заданного множества - точки евклидова пространства, то все решается просто: зная координаты точек, мы всегда можем определить расстояние между ними. А если множество состоит из более сложных объектов, у которых нет координат (как, например, строки)? Таким образом мы приходим к необходимости создания инструмента, позволяющего измерять расстояния между элементами множества. Таким инструментом является метрика - математическое обобщение понятия "расстояние".
Метрика - это фунция , которая берет на входе два элемента x и y исходного множества, и возвращает расстояние между этими элементами. Однако, функция
- это не любая функция, а удовлетворяющая определенным условиям:
Эти три условия называются аксиомами метрики, а множество, на котором задана функция , удовлетворяющая этим аксиомам - метрическим пространством.
Понятно, что на одном и том же множестве можно задать разные метрики и в результате будут получаться разные пространства. При этом, может оказаться так, что при одном выборе метрики , а при другом выборе для этих же точек будет выполняться противоположное неравенство:
. Поэтому при решении конкретной задачи, возможно, потребуется длительный процесс построения адекватной метрики.
На множестве строк может быть задано большое число метрик, соответствующих той или иной задаче. Здесь рассмотрим одну из такого рода метрик, называемую метрикой Левенштейна. Эту метрику применяют обычно для определения степени искажения строк. Мы не будем давать строгого определения метрики Левенштейна, лишь заметим, что, говоря простым языком, эта метрика представляет собой число опечаток, которые были сделаны при наборе строки test по сравнению с эталоном pattern. Например:
test | pattern | d(test,pattern) |
---|---|---|
abcd | acd | 1 |
abcd1 | abcd5 | 1 |
bcd | acd | 1 |
axyd | acd | 2 |
acbd | abcd | 2 |
xyz | abcd | 4 |
Для решения конкретной задачи можно использовать следующую программную реализацию на языке Питон.
Работа производится с файлами dbf. Для работы необходим скрипт dbfpy. Перед запуском программы необходимо установить dbfpy.
Для работы необходимо:
Пример результата можно посмотреть в файле out1-sample.dbf
Скачать исходный код на Pascal, DLL и скрипт на Avenue для использования библиотеки в Arcview GIS. Функция check принимает два строковых параметры и выдает целое число - результат.
Обсудить в форуме Комментариев 4
Последнее обновление: September 09 2021
Дата создания: 09.09.2009
Автор(ы): Дмитрий Колесов, Максим Дубинин
© GIS-Lab и авторы, 2002-2021. При использовании материалов сайта, ссылка на GIS-Lab и авторов обязательна. Содержание материалов - ответственность авторов. (подробнее).