Encoding windows-1251

Алгоритм определения примерного расстояния редактирования
Что еще есть у Владимира Чаплинского... (Back)
Заинтересовавшись поиском одинаковых анекдотов в своей большой коллекции, я составил программу на FoxPro, которая ищет дубликаты анекдотов. Для такой программы нужен алгоритм, который определяет степень сходства двух текстов. Порывшись в интернете (это было в 2003 году), я не нашел готового результата (искал я только в русской части). Но некоторые страницы натолкнули меня на мысли, которые я здесь и привожу.

Сначала я реализовал алгоритм "суммированного поиска подстрок". Одна из строк разбивается на подстроки (идет два цикла "один в другом": в первом цикле задается длина подстроки, а во втором цикле задается длина подстроки). После этого подстрока ищется во второй строке. Результат работы функции - число от 0 до 100 (100 - полное совпадение).

Функция работала и показывала неплохие результаты. Но было какое-то неудовлетворение скоростью работы (число анекдотов-то растет!). Поэтому через год была разработана вторая версия функции. Метод можно назвать "половинное деление строки на подстроку". На данный момент работает второй вариант. Не устраивает коридор "похоже-непохоже". Сейчас анекдоты считаются "одинаковые" при >30%, а неодинаковые при <20%. Даже в этом случае (как я подозреваю) алгоритм может ошибаться (т.е. алгоритм выдал процент совпадения 34, а анекдоты разные..). Во многих случаях практически одинаковые анекдоты имеют процент совпадений 80, хотя любой человек даст 100%!

Это первый вариант алгоритма, переписанный на JavaScript.

Сначала создается функция-шаблон, которая использует "пристегнутые" константы (например так: "this._BiggestWordWindow"). В конце создается функция поиска, которая использует функцию-шаблон. В функции stringSimilarWindow определяются константы. Например: stringSimilarWindow._Step = 2;

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

Интерактивный пример работы.

 

Это первый вариант алгоритма.

Код функции написан на FoxPro. Некоторые пояснения.
AllTrim - убирает все начальные и конечные пробелы в строке.
Substr - выдирает подстроку из строки
$ - это тоже функция! Определяет, есть ли подстрока внутри строки.
(Если есть, то результат True)

Запись m.i эквивалентна простому i

В дополнение могу сказать, что из строк убраны все двойные пробелы, знаки препинания и прочие малозначащие символы (это сделано для увеличения скорости работы функции)

 

Переработанный (второй) вариант алгоритма.

Код функции написан на FoxPro. Некоторые пояснения.

Функция TXTS вызывает функцию RAST. А функция RAST начинает вызывать рекуррентно саму себя. При этом длина строки уменьшается в 2 раза.

AllTrim - убирает все начальные и конечные пробелы в строке.

Substr - выдирает подстроку из строки

Int- целая часть числа

$ - это тоже функция! Определяет, есть ли подстрока внутри строки.
(Если есть, то результат True)

Запись m.i эквивалентна простому i

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

Во втором варианте можно попытаться изменить коэффициент 0.48 на (например) 0.45.

Предлагаю обсудить! Также можно посмотреть обсуждение в FIDO7

Страницы по теме "поиск расстояния редактирования":
Поиск в Метаботе
(Русский текст)
Анализ строк (Itman): часть 1-3 часть 4.2
Поиск в Google
(Английский текст)
Обработка текстов

Дата последней модификации страницы: 30.11.2012 12:31

Что еще есть у Владимира Чаплинского... (Back)

Автор страницыВладимир Чаплинский
Альтернативный адрес vladimir_c@mail.ru

 

Сайт создан в системе uCoz