BM25(Best Match25)是在信息检索系统中根据提出的query对document进行评分的算法。

    TF-IDF
    算法是一个可用的算法,但并不太完美。而BM25算法则是在此之上做出改进之后的算法。

    1. 当两篇描述“人工智能”的文档A和B,其中A出现“人工智能”100次,B出现“人工智能”200次。两篇 文章的单词数量都是10000,那么按照 TF-IDF 算法,A的 tf 得分是:0.01,B的 tf 得分是0.02。 得分上B比A多了一倍,但是两篇文章都是再说人工智能, tf 分数不应该相差这么多。可见单纯统 计的 tf 算法在文本内容多的时候是不可靠的
    2. 多篇文档内容的长度长短不同,对 tf 算法的结果也影响很大,所以需要将文本的平均长度也考虑 到算法当中去。

    基于上面两点,BM25算法做出了改进:

    • k1:词语频率饱和度(term frequency saturation)它用于调节饱和度变化的速率。它的值一般 介于 1.2 到 2.0 之间。数值越低则饱和的过程越快速。(意味着两个上面A、B两个文档有相同的 分数,因为他们都包含大量的“人工智能”这个词语都达到饱和程度)。在ES应用中为1.2

    • b:字段长度归约,将文档的长度归约化到全部文档的平均长度,它的值在 0 和 1 之间,1 意味着 全部归约化,0 则不进行归约化。在ES的应用中为0.75


    k1 用来控制公式对词项频率 tf 的敏感程度。((k1 + 1) * tf) / (k1 + tf) 的上限是 (k1+1),也即饱和值。当 k1=0 时,不管 tf 如何变化,BM25 后一项都是 1;随着 k1 不断增大,虽然上限值依然是 (k1+1),但到 达饱和的 tf 值也会越大;当 k1 无限大时,BM25 后一项就是原始的词项频率。一句话,k1 就是衡量 高频 term 所在文档和低频 term 所在文档的相关性差异,在我们的场景下,term 频次并不重要,该

    值可以设小。ES 中默认 k1=1.2,可调整为 k1=0.3。

    b 单个文档长度对相关性的影响力与它和平均长度的比值有关系,用来控制文档长度 L 对权值的惩罚程 度。b=0,则文档长度对权值无影响,b=1,则文档长度对权值达到完全的惩罚作用。ES 中默认

    b=0.75,可调整为 b=0.1。

    ES中调整BM25

    1. DELETE /my_index
    2. PUT /my_index
    3. {
    4. "settings": {
    5. "similarity": {
    6. "my_bm25": {
    7. "type": "BM25",
    8. "b": 0.1,
    9. "k1": 0.3
    10. }
    11. }
    12. },
    13. "mappings": {
    14. "doc": {
    15. "properties": {
    16. "title": {
    17. "type": "text",
    18. "similarity": "my_bm25"
    19. }
    20. }
    21. }
    22. }
    23. }
    24. PUT /my_index
    25. {
    26. "settings": {
    27. "similarity": {
    28. "my_bm25": {
    29. "type": "BM25",
    30. "b": 0.1,
    31. "k1": 0.3
    32. }
    33. }
    34. },
    35. "mappings": {
    36. "properties": {
    37. "title": {
    38. "type": "text",
    39. "similarity": "my_bm25"
    40. }
    41. }
    42. }
    43. }
    44. GET /my_index