我正在编写一个预测搜索,对于服务器性能要求(所有内容都已缓存),必须在客户端浏览器上运行。这些项目是电视节目和电影,并与标题、演员和导演姓名相匹配。执行搜索后,它会返回一个匹配项列表,每个结果有两个值:
匹配词数(n):用户可以输入 4 个词,但其中只有 2 个词匹配一个项目。越多越好。
Levenshtein 编辑距离添加(ld)。用户可以键入 3 个单词,但其中 2 个单词与索引的单词有拼写错误或其他小的差异。我使用编辑距离来查找最近的索引词。所有 Levenshtein 距离的相加作为邻近指标返回。越少越好。
要求
客户端。没有 Sphinx、Lucene 或任何其他服务器端解决方案。
速度超过准确性。该算法在每次击键时运行,我们不想让用户感到厌烦。保持大O不要那么大。
非递归的。每个项目相关性的计算不应依赖于其他项目的计算。我不想打败谷歌,只提供一个小集合中最好的结果。
有界形式 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 之间。
最后,问题
我想要的不是基于此响应并通过额外的编辑距离计算来改进搜索算法,而是通过为每个元素分配一个相关性值来改进返回元素的相关性排序。n
如果需要和以外的任何参数ld
并且易于计算,则可以使用。在我的解决方案中,我添加T
了用户提供的字数。