1,$TF-IDF$算法
$TF$是指歸一化后的詞頻,$IDF$是指逆文檔頻率。給定一個文檔集合$D$,有$d_1, d_2, d_3, ......, d_n \in D$。文檔集合總共包含$m$個詞(注:一般在計算$TF-IDF$時會去除如“的”這一類的停用詞),有$w_1, w_2, w_3, ......, w_m \in W$。我們現在以計算詞$w_i$在文檔$d_j$中的$TF-IDF$指為例。$TF$的計算公式為:
$ TF = \frac{freq(i, j)} {max_{len}(j)} $
在這里$freq(i, j)$ 為$w_i$在$d_j$中出現的頻率,$max_{len}(j)$為$d_j$長度。
$TF$只能時描述詞在文檔中的頻率,但假設現在有個詞為”我們“,這個詞可能在文檔集$D$中每篇文檔中都會出現,並且有較高的頻率。那么這一類詞就不具有很好的區分文檔的能力,為了降低這種通用詞的作用,引入了$IDF$。
$IDF$的表達式如下:
$IDF = \log (\frac {len(D)} {n(i)})$
在這里$len(D)$表示文檔集合$D$中文檔的總數,$n(i)$表示含有$w_i$這個詞的文檔的數量。
得到$TF$和$IDF$之后,我們將這兩個值相乘得到$TF-IDF$的值:
$TF-IDF = TF * IDF$
$TF$可以計算在一篇文檔中詞出現的頻率,而$IDF$可以降低一些通用詞的作用。因此對於一篇文檔我們可以用文檔中每個詞的$TF-IDF$組成的向量來表示該文檔,再根據余弦相似度這類的方法來計算文檔之間的相關性。
2,$BM25$算法
$BM25$算法通常用來做搜索相關性評分的,也是ES中的搜索算法,通常用來計算$query$和文本集合$D$中每篇文本之間的相關性。我們用$Q$表示$query$,在這里$Q$一般是一個句子。在這里我們要對$Q$進行語素解析(一般是分詞),在這里以分詞為例,我們對$Q$進行分詞,得到$q_1, q_2,......, q_t$這樣一個詞序列。給定文本$d \in D$,現在以計算$Q$和$d$之間的分數(相關性),其表達式如下:
$Score(Q, d) = \sum_{i = 1}^t w_i * R(q_i, d)$
上面式子中$w_i$表示$q_i$的權重,$R(q_i, d)$為$q_i$和$d$的相關性,$Score(Q, d)$就是每個語素$q_i$和$d$的相關性的加權和。
$w_i$的計算方法有很多,一般是用$IDF$來表示的,但這里的$IDF$計算和上面的有所不同,具體的表達式如下:
$w_i = IDF(q_i) = \log \frac {N - n(q_i) + 0.5} {n(q_i) + 0.5}$
上面式子中$N$表示文本集合中文本的總數量,$n(q_i)$表示包含$q_i$這個詞的文本的數量,$0.5$主要是做平滑處理。
$R(q_i, d)$的計算公式如下:
$R(q_i, d) = \frac {f_i * (k_1 + 1)} {f_i + K} * \frac {qf_i * (k_2 + 1)} {qf_i + k_2}$
其中
$K = k_1 * (1 - b + b * \frac {dl} {avg dl})$
上面式子中$f_i$為$q_i$在文本$d$中出現的頻率,$qf_i$為$q_i$在$Q$中出現的頻率,$k_1, k_2, b$都是可調節的參數,$dl, avg dl$分別為文本$d$的長度和文本集$D$中所有文本的平均長度。
一般$qf_i = 1$,取$k_2 = 0$,則可以去除后一項,將上面式子改寫成:
$R(q_i, d) = \frac {f_i * (k_1 + 1)} {f_i + K}$
通常設置$k_1 = 2, b = 0.75$。參數$b$的作用主要是調節文本長度對相關性的影響。