Я пытаюсь сопоставить один поисковый запрос со словарем возможных совпадений, используя алгоритм расстояния Левенштейна. Алгоритм возвращает расстояние, выраженное как количество операций, необходимых для преобразования строки поиска в совпавшую строку. Я хочу представить результаты в ранжированном процентном списке лучших "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_distance с любой длиной строки, а вместо этого представить сравнительные расстояния между верхними совпадениями "N" как обратный процентильный ранг (100-процентильный ранг).
Есть предположения? Есть ли подходы лучше? Мне должно быть что-то не хватает, поскольку расстояние Левенштейна, вероятно, является наиболее распространенным алгоритмом для нечетких совпадений, и это должно быть очень распространенной проблемой.