【发布时间】:2011-06-17 05:51:56
【问题描述】:
我正在编写一个预测搜索,为了满足服务器性能要求(所有内容都已缓存),它必须在客户端浏览器上运行。这些项目是电视节目和电影,并与标题、演员和导演姓名相匹配。执行搜索后,它会返回一个匹配项列表,每个结果有两个值:
匹配词数 (n):用户可以输入 4 个词,但其中只有 2 个词匹配一个项目。越多越好。
Levenshtein Edit Distance 加法 (ld)。用户可以键入 3 个单词,但其中 2 个单词与索引单词有拼写错误或其他小的差异。我使用编辑距离来查找最近的索引词。所有 Levenshtein 距离的相加作为邻近指标返回。越少越好。
要求
客户端。没有 Sphinx、Lucene 或任何其他服务器端解决方案。
速度超过准确性。该算法在每次击键时运行,我们不想让用户感到厌烦。保持big O不要那么big。
非递归。每个项目相关性的计算不应依赖于其他项目的计算。我不想打败谷歌,只提供小集合中最好的结果。
有界形式 0 到 1、0 到 100 或类似的形式。不是必需的,但能够显示“相关百分比”是加分项。
想法优于实现。我正在寻找比特定实现更好的算法/公式。
我的方法
根据指数衰减(如放射性半衰期分解),我提出了这个公式。
地点:
-
T是用户提供的字数。 -
n是匹配词的数量。 -
ld是这个匹配词的 Levenshtein 距离加法。
在伪代码中。
function lambda(n, ld) {
lambda = (n/T) * e^(-ld * 1/n);
return lambda;
}
一点解释:
-ld * 1/n是相关性度量核心。如果ld较低且n较大,则它接近于零(-0 边),表明此结果更相关。n/T是一个准确率。匹配词与所有词。通过考虑总用户输入来优化先前的相关性。
对于负幂,指数函数将结果限制在 0 和 1 之间。
最后是问题
我想要的不是改进搜索算法,基于this response 进行额外的编辑距离计算,而是通过为每个元素分配一个相关性值来改进返回元素的相关性排序。如果需要除n 和ld 之外的任何参数并且易于计算,则可以使用。在我的解决方案中,我添加了T,即用户提供的字数。
【问题讨论】:
-
ld是否介于 0 和 1 之间? -
@ffriend 不,不是。是介于 0 和 T*MAX_LD 之间的整数值,其中 MAX_LD 是设置的阈值。 'color' 和 'colour' 之间的 LD 为 1,'house' 和 'noses' 之间的 LD 为 3。
-
我明白了,你不使用词干,所以'house'和'houses'是两个不同的词,使用Levenshtein距离来解决这个问题?
-
对,由于客户端限制,没有词干
标签: javascript algorithm search client-side relevance