tf·idf 在Elasticsearch 數(shù)據(jù)中的應(yīng)用

前期研究了使用 Elasticsearch term vectors API 的方法,從 ES 中提取文檔的詞頻、文檔頻率等。其參數(shù)如下

  • sum_doc_freq:該字段中所有詞的文檔頻率之和,即包含該詞的文檔數(shù)之和。
  • doc_count:該字段中包含詞的文檔數(shù),即索引文檔總數(shù)。
  • sum_ttf:該字段中所有詞的總詞頻之和,即該詞在所有文檔中出現(xiàn)的次數(shù)之和。
  • doc_freq:該詞的文檔頻率,即包含該詞的文檔數(shù),即文檔頻率。
  • ttf:該詞的總詞頻,即該詞在所有文檔中出現(xiàn)的次數(shù)。
  • term_freq:該詞在當(dāng)前文檔中出現(xiàn)的次數(shù)。

其中sum_ttf 是指一個(gè)詞匯在整個(gè)索引中出現(xiàn)的總次數(shù),ttf 是指一個(gè)詞匯在某個(gè)字段中出現(xiàn)的總次數(shù)。這些值可以用來衡量一個(gè)詞匯的重要性或相關(guān)性 。
計(jì)算 tf·idf 用到的參數(shù)是 term_freq,doc_count,doc_freq,然而計(jì)算時(shí)發(fā)現(xiàn)這些參數(shù)用于計(jì)算詞的重要性還不夠靈活。

1. 詞頻的計(jì)算

首先,如果只是計(jì)算詞在文檔內(nèi)的重要性,直接使用
term_freq*log(doc_count/doc_freq)
這個(gè)表達(dá)式中,term_freq 是 ES 在文檔中統(tǒng)計(jì)一個(gè)詞出現(xiàn)的次數(shù),實(shí)際的 tf·idf 計(jì)算中,tf 要求使用 term_freq/N 來計(jì)算詞在文檔中出現(xiàn)的頻率,N 是文檔總詞量,但是同一篇文檔內(nèi),由于比較詞頻時(shí) N不變,所以計(jì)算時(shí)可以省略。
但是我偏偏還想計(jì)算一天內(nèi),各詞的重要性,即丟掉文檔緯度,增加日期維度,這樣的話,tf 的計(jì)算就不可以丟掉 N,即tf 最終計(jì)算得到的是小于1的小數(shù),而不是大于1的整數(shù)。ES返回的參數(shù)中,無法得到 N,這樣就無法計(jì)算實(shí)際的詞頻了嗎?
我想到的方法是求同篇文檔的 sum(term_freq) ≈ N

2. 標(biāo)題與正文的權(quán)重分配

最開始,我將標(biāo)題的權(quán)重設(shè)置為正文的 3 倍,即 boost = 3,一開始的處理方法是將標(biāo)題中的詞頻 * boost ,與正文的詞頻相加得到該詞在文檔中的詞頻,然而在 ES 中,我將標(biāo)題與正文拆分為了2個(gè)字段,標(biāo)題的文檔頻率與正文的文檔頻率不同,如何統(tǒng)一也是問題,我的處理方法是求平均值。
然而這么處理,雖然可以實(shí)現(xiàn)讓標(biāo)題中出現(xiàn)的詞在重要性計(jì)算中提高該詞在文檔中的重要性,但實(shí)際計(jì)算得到的數(shù)據(jù)讓我感覺到,將標(biāo)題與正文合在一起計(jì)算并不是最合理的。
接下來我將標(biāo)題與正文的 tf·idf 單獨(dú)分別計(jì)算,將得到的結(jié)果賦予不同權(quán)重,按照8/2分,給標(biāo)題詞得分 * 0.8,正文詞得分 * 0.2,這樣的得分可以用在按日期做為緯度計(jì)算 tf·idf 的分?jǐn)?shù)中。

?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

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