algorithm - 根据术语的位置对文本字符串进行排名

标签 algorithm sorting ranking

我基本上需要一些数学知识来根据以下指标对短输入句子进行排名:

1) 术语相对于句子开头的距离(注意:相对术语距离,没有编辑距离!)。 对于搜索“a”的示例,句子“a b”的排名应该高于“b a”,因为 a 更接近句子的开头。

2) 术语之间的距离。 例如搜索“a”和“b”时,“ccc a b”的排名应该高于“a ccc b”,因为 a 和 b 彼此更接近。

3) 基于术语顺序的排名。 例如搜索 a AND b 时,“a b”的排名应该高于“b a”,因为这是正确的顺序。尽管如此,b a 也应该在结果集中,因此它也必须按较低的权重排名。

4) 单词本身是未加权的。这是与广泛常见的内容以及我可以轻松找到信息的内容的主要区别。但在我的例子中,所有术语都具有相同的权重,无论它们在文档中出现/计数或其他什么。

我已完成研究,但未找到匹配项。您知道什么排名算法会匹配,或者至少接近这个吗?

最佳答案

  1. 计算每个搜索词在主题字符串中的位置。
  2. 计算所有字词在搜索字符串中的平均位置。
  3. 计算主题字符串和搜索词列表中平均位置之间的绝对差值。
  4. 计算词条位置相对于平均值的绝对差值。
decimal Rank(string subject, IList<string> terms)
{
    // Isolate all the words in the subject.
    var words = Regex.Matches(subject, @"\w+")
        .Cast<Match>()
        .Select(m => m.Value.ToLower())
        .ToList();

    // Calculate the positions
    var positions = new List<int>();
    var sumPositions = 0;
    foreach (var term in terms)
    {
        int pos = words.IndexOf(term.ToLower());
        if (pos < 0) return decimal.MaxValue;
        positions.Add(pos);
        sumPositions += pos;
    }

    // Calculate the difference in average positions
    decimal averageSubject = (decimal) sumPositions / terms.Count;
    decimal averageTerms = (terms.Count - 1) / 2m; // average(0..n-1)
    decimal rank = Math.Abs(averageSubject - averageTerms);

    for (int i = 0; i < terms.Count; i++)
    {
        decimal relativePos1 = positions[i] - averageSubject;
        decimal relativePos2 = i - averageTerms;
        rank += Math.Abs(relativePos2 - relativePos1);
    }

    return rank;
}

我使用较低的值表示更好的匹配,因为测量与完美匹配的距离比测量每个匹配的分数更容易。

示例

Subject     Terms       Rank
"a b"       "a"         0.0
"b a"       "a"         1.0
"ccc a b"   "a", "b"    1.0
"a ccc b"   "a", "b"    1.5
"a b"       "a", "b"    0.0
"b a"       "a", "b"    2.0

关于algorithm - 根据术语的位置对文本字符串进行排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17163829/

相关文章:

java - 为什么这个算法使用Java中的按位与运算符?

string - 字符串集中最长的前缀+后缀组合

r - 获取组中3个最常见的元素,连接关系并忽略不太常见的值

lucene - Solr lucene 和 "similar"关键字

algorithm - 命名实体识别的排名算法有哪些,哪个最好?

PHP 自定义编码函数没有给出所需的结果

java - 为什么 Collections.sort (dateList,Collections.reverseOrder()) 会抛出 NPE

swift 2.1 错误 "Binary operator || cannot be applied to two Bool operands"

algorithm - 需要帮助识别整数排序算法

ranking - 投票算法: how to calculate rank?