2

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

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;
}

没什么花哨的,而且我也没有足够的时间去做任何花哨的事情,但是我可以做任何简单的改进来使该功能更好地增加相关内容并降低不相关的内容吗?速度优化无需赘述,这只是功能的“功能部分”:)

谢谢。

4

7 回答 7

9

不确定它是否算得上花哨,但是soundex 比较,大概在你的量表上获得 +1 分,将与印刷的未遂事件和同音字有一点相关性。

我建议使用停用词列表来防止或从根本上减少从常用词授予的相关性。如果有人在搜索“the horse is on the roof”,您希望授予与“horse”和“roof”的相关性,而不是大量提高包含“the”的所有内容。

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

于 2009-05-27T15:03:47.280 回答
5

经典的向量空间模型实际上是标准的不错且相当简单(在实现中)的解决方案。

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

于 2009-05-27T15:05:48.400 回答
2

在你做你的平等之前,你也应该规范化大小写。

于 2009-05-27T15:05:53.547 回答
2

如果Levenshtein 距离低于某个阈值,您可以将 +1 添加到分数。

于 2009-05-27T15:07:42.653 回答
2

如果您想让您的搜索算法更复杂一点,请查看cosinesimilarity。它很容易实现并且在实践中效果很好。

于 2009-05-27T15:08:26.037 回答
1

你可以:

  • 剔除干扰词(the、a、at 等...)
  • 更改可搜索文本相关性的权重 - 如果搜索词出现在文档的标题及其正文中,则标题可能更相关。
  • 根据您的 resultWord 文本,考虑为文本中较早或较晚的单词添加权重。
  • 使唯一的搜索词匹配更有价值(您必须确定是什么让一个词独一无二)。
于 2009-05-27T15:09:39.903 回答
0

很明显,但是您希望将所有内容都小写。

于 2009-05-27T15:06:06.307 回答