簡介
計算查詢詞在指定欄位的上的BM25值,用于衡量查詢詞語欄位的相似性。BM25的計算公式可以簡單的描述如下:
其中: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);
}
};