【发布时间】:2012-05-11 10:29:12
【问题描述】:
我正在尝试使用 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 距离可能是最常见的模糊匹配算法,这一定是一个非常常见的问题。
【问题讨论】:
-
你的第一个选项怎么样,但是当结果为负时,然后简单地返回 0? PS:我在这里也发布了问题math.stackexchange.com/questions/1776860/…
-
我不明白 Option2 有什么问题,因为我已经实现了与您在其上描述的完全相同的逻辑并且似乎可以正常工作。你能解释清楚吗?
标签: distance percentage ranking levenshtein-distance