天天看點

【基礎1】文本分析-詞頻與餘弦相似度

通過計算兩段文本的相似度,我們可以:

  • 對垃圾文本(比如小廣告)進行批量屏蔽;
  • 對大量重複資訊(比如新聞)進行删減;
  • 對感興趣的相似文章進行推薦,等等。

那麼如何計算兩段文本之間的相似程度?我們已經了解到夾角餘弦這個算法,其思想是:

  • 将兩段文本變成兩個可愛的小向量;
  • 計算這兩個向量的夾角餘弦cos(θ):
    • 夾角餘弦為1,也即夾角為0°,兩個小向量無縫合體,則相似度100%
    • 夾角餘弦為0,也即夾角為180°,小向量可憐的兩兩不相見,則相似度為0%
【基礎1】文本分析-詞頻與餘弦相似度

本文會具體介紹如何計算文本的夾角餘弦相似度,包括兩部分:

  • 向量的夾角餘弦如何計算
  • 如何構造文本向量:詞頻與詞頻向量

1. 向量的夾角餘弦如何計算

【基礎1】文本分析-詞頻與餘弦相似度

在扯到文本之前,這個要先介紹一下。

餘弦定理告訴我們(不記得的翻看書本):

【基礎1】文本分析-詞頻與餘弦相似度

然而對于兩個向量a、b的夾角餘弦呢?

【基礎1】文本分析-詞頻與餘弦相似度

它的公式為:

【基礎1】文本分析-詞頻與餘弦相似度

分子就是2個向量的内積,分母是兩個向量的模長乘積。

用兩個向量的坐标即可計算出來,簡單了解一下這個推導:

【基礎1】文本分析-詞頻與餘弦相似度

這是兩個二維向量,如果是兩個n維向量的夾角餘弦相似度,隻要記得,分子依然是向量内積,分母是兩個向量模長乘積。

知道了向量的夾角餘弦相似度計算方法,現在隻要想辦法将文本變成向量就可以了。

2. 詞頻與詞頻向量

文本是由詞組成的,我們一般通過計算詞頻來構造文本向量——詞頻向量。

比如有一句話:

我是數說君,我愛你們,你們愛我嗎?

這段文本是由幾個詞組成的:

我/ 是/ 數說君  我/ 愛/ 你們 你們/ 愛/ 我/ 嗎

其中“我”出現了3次,“是”出現一次......依次計算,我們就可以構造如下詞頻向量:

我3, 是1, 數說君1, 愛2, 你們2, 嗎1 → (3,1,1,2,2,1)

這就是一個6維向量了。

需要注意的是,如果這時候有另一段文本需要跟它比較,比如就是:

我是數說君,我愛你們,你們愛我吧?

這時候我們應該這樣分詞:

我3, 是1, 數說君1, 愛2, 你們2, 嗎0, 吧1 → (3,1,1,2,2,0,1)

這裡“嗎”這個次元也需要加上,相應的,别忘了第一句話中也要加上“吧”這個次元:

我3, 是1, 數說君1, 愛2, 你們2, 嗎1, 吧0 → (3,1,1,2,2,1,0)

這就是兩個7維向量了,現在可以将這兩個文本向量進行夾角餘弦的相似度比較,帶入上面的公式:

兩個向量内積=3*3+1+1+2*2+2*2=19

兩個向量模長乘積=sqrt(9+1+1+4+4+1)*sqrt(9+1+1+4+4+1)=20

兩個向量夾角餘弦相似度=19/20=95%

是以這兩段文本的相似度為95%。

這裡有2個問題值得提一下:

(1)當兩個詞頻向量進行比較的時候,次元會擴大。

比如剛剛例子中,彼此沒有出現的“嗎”、“吧”兩個次元會加進來,保證比較的兩段文本次元統一。那麼問題來了,如果兩段很長的文本進行比較(比如上萬字的文章),豈不是次元要擴增很多倍?而且矩陣會非常稀疏,就是很多取值都是0,計算開銷大且效率低,怎麼辦?

是以需要尋求一種有效的特征降維方法,能夠在不損傷核心資訊的情況下降低向量空間的維數,比如TF-IDF算法。這就是後面會介紹的。

(2)英文文本的比較

與中文不同的是,英文不需要分詞,因為英文天然就是由一個一個詞組組成的。

I Love Shushuojun  → I/ Love/ Shushuojun

轉載自:https://mp.weixin.qq.com/s/dohbdkQvHIGnAWR_uPZPuA

繼續閱讀