Алгоритм определения примерного расстояния
редактирования
|
Сначала я реализовал алгоритм "суммированного поиска подстрок". Одна из строк разбивается на подстроки (идет два цикла "один в другом": в первом цикле задается длина подстроки, а во втором цикле задается длина подстроки). После этого подстрока ищется во второй строке. Результат работы функции - число от 0 до 100 (100 - полное совпадение).
Функция работала и показывала неплохие результаты. Но было какое-то неудовлетворение скоростью работы (число анекдотов-то растет!). Поэтому через год была разработана вторая версия функции. Метод можно назвать "половинное деление строки на подстроку". На данный момент работает второй вариант. Не устраивает коридор "похоже-непохоже". Сейчас анекдоты считаются "одинаковые" при >30%, а неодинаковые при <20%. Даже в этом случае (как я подозреваю) алгоритм может ошибаться (т.е. алгоритм выдал процент совпадения 34, а анекдоты разные..). Во многих случаях практически одинаковые анекдоты имеют процент совпадений 80, хотя любой человек даст 100%!
Это первый вариант алгоритма, переписанный на JavaScript. Сначала создается функция-шаблон, которая использует "пристегнутые" константы (например так: "this._BiggestWordWindow"). В конце создается функция поиска, которая использует функцию-шаблон. В функции stringSimilarWindow определяются константы. Например: stringSimilarWindow._Step = 2; Это позволяет легко создавать функции нечеткого поиска с разным временем работы (за счет разного качества поиска) |
Это первый вариант алгоритма. Код функции написан на FoxPro. Некоторые
пояснения.
Запись m.i эквивалентна простому i В дополнение могу сказать, что из строк убраны все двойные пробелы, знаки препинания и прочие малозначащие символы (это сделано для увеличения скорости работы функции) |
Переработанный (второй) вариант алгоритма. Код функции написан на FoxPro. Некоторые пояснения. Функция TXTS вызывает функцию RAST. А функция RAST начинает вызывать рекуррентно саму себя. При этом длина строки уменьшается в 2 раза. AllTrim
- убирает все начальные и конечные пробелы в строке. Substr
- выдирает подстроку из строки Int-
целая часть числа $
- это тоже функция! Определяет, есть ли подстрока внутри строки.
Запись m.i эквивалентна простому i
|
Кстати, как оказалось, второй вариант (несмотря на его простоту) дает не менее надежные результаты (а ногда даже более надежные) нежели первый метод. Попытался я усовершенствовать первый метод за счет того, что учитывал позацию найденного буквосочетания в одном и втором тексте. Получилось еще хуже.... Уж не знаю и почему. Т.е. на многих анекдотах функция работала нормально. На некоторых анекдотах функция стала работать лучше, но было много анекдотов, на которых функция давала явный сбой (т.е. функция выдает низкий коэффициент сопадения, а на самом деле анекдоты одинаковые - отличаются только имена).
Во втором варианте можно попытаться изменить коэффициент 0.48 на (например) 0.45.
Предлагаю обсудить! Также можно посмотреть обсуждение в FIDO7
Страницы по теме "поиск расстояния редактирования":
|
||
Поиск
в Метаботе
(Русский текст) |
||
Поиск
в Google
(Английский текст) |
||
Обработка
текстов
|
А вот, что Google
выдал при поиске в FIDO!
|
Дата последней модификации страницы: 30.11.2012 12:31
Что еще есть у Владимира Чаплинского... (Back)
|
|