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