如果没有“做高级的东西”,我可以更好地使这个搜索相关性功能?

时间:2009-05-27 15:00:25

标签: java search-engine

我的搜索引擎使用以下函数来计算相关性。

private static int calculateScore(String result, String searchStr, int modifier) 
{
    String[] resultWords = result.split(" ");
    String[] searchWords = searchStr.split(" ");

    int score = 0;
    for (String searchWord : searchWords) 
    {
        for (String resultWord : resultWords) 
        {
            if (resultWord.equals(searchWord))
                score += 10;
            else if (resultWord.startsWith(searchWord))
                score += 4;
            else if (resultWord.endsWith(searchWord))
                score += 3;
            else if (resultWord.contains(searchWord))
                score += 1;
        }

    }
    return score;
}

没有什么花哨的,而且我也没有足够的时间去做任何花哨的事情,但我是否有任何简单的改进可以让这个功能更好地提升相关的东西,并保持不相关的东西? 无需评论速度优化,这只是函数的“功能部分”:)

感谢。

7 个答案:

答案 0 :(得分:9)

不确定它是否算得上是花哨的,但是soundex comparison,可能会在你的音阶上获得+1分,会给排印错误和同音异义词带来一些相关性。

我建议使用stop word list来阻止或从根本上减少普通单词授予的相关性。如果有人正在寻找“马在屋顶上”,你想要给予“马”和“屋顶”相关性,而不是大规模地提升包含“the”的所有内容。

另一个简单的提升是将一大堆相关性授予包含整个搜索字符串的结果(大小写和标点符号不敏感)。

答案 1 :(得分:5)

经典的向量空间模型实际上是标准的,非常简单(在实现中)解决方案。

http://www.miislita.com/term-vector/term-vector-3.html

答案 2 :(得分:2)

你也应该在做出平等之前对案例进行规范化。

答案 3 :(得分:2)

如果Levenshtein Distance低于某个阈值,您可以为分数添加+1。

答案 4 :(得分:2)

如果您想让搜索算法更复杂一点,请查看cosine similarity。它非常容易实现,并且在实践中运行良好。

答案 5 :(得分:1)

你可以:

  • 剔除噪音词(a,a,at等等)
  • 更改可搜索文本相关性的权重 - 如果搜索词出现在文档的标题及其正文中,则标题可能更相关。
  • 根据您的resultWord文本,请考虑在文本的前面或后面添加单词的权重。
  • 使独特的搜索词匹配更有价值(您必须确定单词的唯一性)。

答案 6 :(得分:0)

很明显,但你想要小写一切。