BM25

简介

计算查询词在指定字段的上的BM25值,用于衡量查询词语字段的相似度。BM25的计算公式可以简单的描述如下:

1其中:tf(i) 表示term在所求字段上出现的次数

idf(i) 表示term的逆向文件频率 (inverse document frequency, IDF)

f(ngram) = ngram > 1 ? ngram*C : 1

K: 控制term frequency 影响的参数因子

C: 控制检索单元权重的参数B: 控制field length影响的参数BM25提供了多个函数,方便用户控制计算公式中的各个参数,方便用户对BM25进行定制。

函数列表

函数原型

函数简介

BM25 create(OpsScorerInitParams params, CString indexName, CString fieldName)

构造BM25对象

void setGroupScoreMergeOp(CString opName)

设置多个query group结果的merge方式,可以是sum和max,默认为sum

void setParamK(double paramK)

设置参数K的值

void setParamB(double paramB)

设置参数B的值

void setParamC(double paramC)

设置参数C的值

void setFieldAvgLength(double avgFieldLength)

设置平均字段长度

double evaluate(OpsScoreParams params)

计算查询词分词词组在字段上分布的紧密程度

函数详情

BM25 create(OpsScorerInitParams params, CString indexName, CString fieldName)

创建BM25对象,需要指定待匹配的索引名称和字段名称。参数列表:params — 初始化输入参数,详情请参考OpsScorerInitParams手册。indexName — 指定的索引名,必须为常量。fieldName — 索引下的字段名,该字段需要为TEXT或者SHORT_TEXT,并且分词类型为中文基础分词、自定义分词、单字分词、英文分词、模糊分词,必须是常量。

void setGroupScoreMergeOp(CString opName)

设置多个查询分组之间分数组合规则,目前仅支持max、sum,如果没有设置默认多个group分数进行sum。该函数必须在算分插件初始化阶段调用。查询分组是指经过查询分析处理之后对原始查询词进行的扩展,默认只有一个查询分组。参数列表:opName — 多个查询分组分数组合规则,目前支持max与sum。

void setParamK(double paramK)

设置参数K的值,该函数必须在算分插件初始化阶段调用。参数列表:paramK — K的值,默认为2.0。

void setParamB(double paramB)

设置参数B的值,该函数必须在算分插件初始化阶段调用。参数列表:paramB — B的值,默认为0.1。

void setParamC(double paramC)

设置参数C的值,该函数必须在算分插件初始化阶段调用。参数列表:paramC — C的值,默认为0.7。

void setFieldAvgLength(double avgFieldLength)

设置平均字段长度,该函数必须在算分插件初始化阶段调用。参数列表:avgFieldLength — 平均字段长度,默认为20。

double evaluate(OpsScoreParams params)

计算查询词在指定索引的指定字段上的BM25分数。参数列表:params — 算分输入参数,详情请参考OpsScoreParams手册。返回值:返回查询词在字段上的BM25分数,取值范围为[0, 1]。代码示例:

package users.scorer;
import com.aliyun.opensearch.cava.framework.OpsScoreParams;
import com.aliyun.opensearch.cava.framework.OpsScorerInitParams;
import com.aliyun.opensearch.cava.features.similarity.fieldmatch.BM25;

class BasicSimilarityScorer {
    BM25 _f1;
    boolean init(OpsScorerInitParams params) {
        _f1 = BM25.create(params, "text_index", "text");
        _f1.setParamK(3);
        _f1.setParamB(0.5);
        _f1.setParamC(1.2);
        _f1.setFieldAvgLength(30);
        return true;
    }

    double score(OpsScoreParams params) {
        return _f1.evaluate(params);
    }
};