Процентный ранг совпадений с использованием сопоставления расстояния Левенштейна

Я пытаюсь сопоставить один поисковый термин со словарем возможных совпадений, используя алгоритм расстояния Левенштейна. Алгоритм возвращает расстояние, выраженное как количество операций, необходимых для преобразования строки поиска в совпадающую строку. Я хочу представить результаты в ранжированном процентном списке лучших «N» (, скажем, 10 )совпадений.

Поскольку строка поиска может быть длиннее или короче, чем отдельные строки словаря, какой будет подходящая логика для выражения расстояния в процентах, которая качественно отражала бы, насколько близок «в процентах» каждый результат к строке запроса., где 100 % указывает на точное совпадение.

Я рассмотрел следующие варианты.:

Q = query string
M = matched string
PM = Percentage Match
Option 1. PMi = (1 - Lev_distance(Q, Mi)/Strlen(Q)) * 100
Option 2. PMi = (1 - Lev_distance(Q, Mi)/max(Strlen(Q), strlen(Mi))) * 100

Вариант 1 имеет возможность отрицательных процентов в случае, если расстояние больше, чем длина строки поиска, где строка совпадения длинная. Например, запрос "ABC" соответствует запросу "ABC Corp." приведет к отрицательному проценту совпадения.

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

Единственный другой способ, который я могу придумать, - это отказаться от сравнения расстояния lev _с любой длиной строки, а вместо этого представить сравнительные расстояния верхних «N» совпадений в виде обратного процентиля ранга (100 -процентиль -ранг ).

Есть мысли? Есть ли лучшие подходы? Я должен что-то упустить, поскольку расстояние Левенштейна, вероятно, является наиболее распространенным алгоритмом для нечетких совпадений, и это должно быть очень распространенной проблемой.

26
задан user1368587 1 May 2012 в 22:46
поделиться