ElasticSearch | 相關(guān)性算分 | TF-IDF

相關(guān)性算分 | Relevance

  • 搜索的相關(guān)性算分,描述了一個(gè)文檔和查詢語(yǔ)句的匹配程度,ES 會(huì)對(duì)每一個(gè)匹配查詢條件的文檔進(jìn)行算分 _score;
  • 相關(guān)性算分是一篇文檔針對(duì)某個(gè)關(guān)鍵詞來說的相關(guān)度高低的一個(gè)分?jǐn)?shù);
  • 打分的本質(zhì)算排序,需要把最符合用戶需求的文檔排在前面,ES 5 之前,默認(rèn)的相關(guān)性算分采用 TF-IDF,現(xiàn)在采用 BM 25;

詞頻 | TF | Term Frequency

Term Frequency
  • 詞在一篇文檔中出現(xiàn)的頻率;
  • 詞出現(xiàn)的次數(shù) / 文檔的總詞數(shù)
文檔和關(guān)鍵詞相關(guān)性的簡(jiǎn)單度量方式
  • 度量一條查詢和結(jié)果文檔相關(guān)性的簡(jiǎn)單方法:簡(jiǎn)單的將文檔中每一個(gè)關(guān)鍵詞的 TF 相加,比如搜索的關(guān)鍵詞為:"區(qū)塊鏈 的 應(yīng)用",那么一篇文檔和關(guān)鍵詞的相關(guān)性 = TF(區(qū)塊鏈)+ TF(的)+ TF(應(yīng)用);
Stop Word
  • “的”在文檔中出現(xiàn)了很多次,但是對(duì)貢獻(xiàn)相關(guān)度幾乎沒有用處,不應(yīng)該考慮這樣的 TF;

逆文檔頻率 | IDF

DF | Document Frequency
  • 檢索詞在文檔中出現(xiàn)的頻率;
    • “區(qū)塊鏈”在相對(duì)少的在文檔中出現(xiàn);
    • “應(yīng)用”在相對(duì)比較多的文檔中出現(xiàn);
    • “Stop Word”在大量的文檔中出現(xiàn);
IDF | Inverse Document Frequency
  • 簡(jiǎn)單說 = log(全部文檔數(shù) / 檢索詞出現(xiàn)過的文檔數(shù));
  • IDF 可以衡量出關(guān)鍵詞的重要程度,IDF 值越大的關(guān)鍵詞越重要;
TF - IDF
  • TF-IDF 本質(zhì)上就是將 TF 求和變成了加權(quán)求和:TF(區(qū)塊鏈) * IDF(區(qū)塊鏈) + TF(應(yīng)用) * IDF(應(yīng)用) + TF(的) * IDF(的)

TF-IDF | 概念

  • TF-IDF 被公認(rèn)為信息檢索領(lǐng)域最重要的發(fā)明;
  • 除了在信息檢索,在文獻(xiàn)分類和其他相關(guān)領(lǐng)域有著非常廣泛的應(yīng)用;

BM 25

  • 從 ES 5 開始,默認(rèn)算法改為了 BM 25;
  • 和經(jīng)典的 TF-IDF 相比,當(dāng) TF 無限增加時(shí),BM 25 算分會(huì)趨于一個(gè)數(shù)值;
  • 在創(chuàng)建索引的時(shí)候,可以對(duì)相關(guān)性的算分做定制;

BM 25 | 實(shí)例分析一下

Boost 是啥
  • 放大因子,默認(rèn)是 2.2;
  • 文檔中一個(gè)字段的得分:TF * IDF * Boost
  • 不同的字段的重要性是不同的,比如 movie 的 title 和 overview 字段,通常認(rèn)為 title
    字段在搜索的算分中的地位更重要,那么就可以放大 title 的 Boost,title 一旦命中后,更大的 Boost 使得 title 字段的算分更高,可以這樣用:
GET /movie/_search
{
   "query":{
      "multi_match":{
         "query":"basketball with cartoom aliens",
         "fields:"["title^10","overview"]
      }
   }
}
IDF 的計(jì)算公式

IDF = log(1 + (N - n + 0.5) / (n + 0.5) )

  • N:有指定字段的文檔的數(shù)量;
  • n:包含關(guān)鍵詞的文檔數(shù);
TF 的計(jì)算公式

tf = freq / (freq + k1 * (1 - b + b * dl / avgdl ) )

  • freq:關(guān)鍵詞在字段中出現(xiàn)的次數(shù);
  • k1
  • b
  • dl:字段的長(zhǎng)度;
  • avgdl:字段的平均長(zhǎng)度;

TF - IDF | 舉幾個(gè)例子

數(shù)據(jù)準(zhǔn)備
PUT testscore
{
  "settings": {
    "number_of_shards": 1
  },
  "mappings": {
    "properties": {
      "content": {
        "type": "text"
      }
    }
  }
}


PUT testscore/_bulk
{ "index": { "_id": 1 }}
{ "content":"we use Elasticsearch to power the search" }
{ "index": { "_id": 2 }}
{ "content":"we like elasticsearch" }
{ "index": { "_id": 3 }}
{ "content":"The scoring of documents is caculated by the scoring formula" }
{ "index": { "_id": 4 }}
{ "content":"you know, for search" }
id 為 2 的文檔出現(xiàn)在 1 的前面
  • 兩個(gè)文檔的 IDF 都是 log(4/2);
  • id 為 1 的文檔的 TF 是 1/7;id 為 2 的文檔的 TF 是 1/3;所以 id 為 2 的文檔的 TF-IDF 比 1 的高,所以排在了前面;
POST /testscore/_search
{
  "query": {
    "match": {
      "content": "elasticsearch"
    }
  }
}
通過 explain 查看 ES 對(duì)相關(guān)性算分中每個(gè)參數(shù)的計(jì)算結(jié)果
POST /testscore/_search
{
  "explain": true,
  "query": {
    "match": {
      "content": "elasticsearch"
    }
  }
}

Boosting Relevance

  • Boosting 是控制相關(guān)度的一種手段,在索引、字段或子查詢中都可以設(shè)置 Boosting 的值;
參數(shù) boost 的含義
  • 當(dāng) boost > 1 時(shí),打分的相關(guān)度相對(duì)提升;
  • 當(dāng) 0 < boost < 1 時(shí),打分的權(quán)重相對(duì)性降低;
  • 當(dāng) boost > 0 時(shí),貢獻(xiàn)負(fù)分;
舉個(gè)栗子
POST testscore/_search
{
    "query": {
        "boosting" : {
            "positive" : {
                "term" : {
                    "content" : "elasticsearch"
                }
            },
            "negative" : {
                 "term" : {
                     "content" : "like"
                }
            },
            "negative_boost" : 0.2
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容