我正在尝试使用 Levenshtein 距离算法将单个搜索词与可能匹配的字典进行匹配。该算法返回一个距离,表示为将搜索字符串转换为匹配字符串所需的操作数。我想在排名前“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-percentile-rank)。
有什么想法吗?有更好的方法吗?我一定遗漏了一些东西,因为 Levenshtein 距离可能是最常见的模糊匹配算法,这一定是一个非常常见的问题。