天天看點

[推薦系統]餘弦計算相似度度量

餘弦計算相似度度量

相似度度量(similarity),即計算個體間的相似程度,相似度度量的值越小,說明個體間相似度越小,相似度的值越大說明個體差異越大。

對于多個不同的文本或者短文本對話消息要來計算他們之間的相似度如何,一個好的做法就是将這些文本中詞語,映射到向量空間,形成文本中文字和向量資料的映射關系,通過計算幾個或者多個不同的向量的差異的大小,來計算文本的相似度。下面介紹一個詳細成熟的向量空間餘弦相似度方法計算相似度

向量空間餘弦相似度(cosine similarity)

餘弦相似度用向量空間中兩個向量夾角的餘弦值作為衡量兩個個體間差異的大小。餘弦值越接近1,就表明夾角越接近0度,也就是兩個向量越相似,這就叫"餘弦相似性"。

[推薦系統]餘弦計算相似度度量

上圖兩個向量a,b的夾角很小可以說a向量和b向量有很高的的相似性,極端情況下,a和b向量完全重合。如下圖:

[推薦系統]餘弦計算相似度度量

如上圖二:可以認為a和b向量是相等的,也即a,b向量代表的文本是完全相似的,或者說是相等的。如果a和b向量夾角較大,或者反方向。如下圖

[推薦系統]餘弦計算相似度度量

如上圖三: 兩個向量a,b的夾角很大可以說a向量和b向量有很底的的相似性,或者說a和b向量代表的文本基本不相似。那麼是否可以用兩個向量的夾角大小的函數值來計算個體的相似度呢?

向量空間餘弦相似度理論就是基于上述來計算個體相似度的一種方法。下面做詳細的推理過程分析。

想到餘弦公式,最基本計算方法就是國中的最簡單的計算公式,計算夾角

[推薦系統]餘弦計算相似度度量
[推薦系統]餘弦計算相似度度量

圖4

的餘弦定值公式為:

[推薦系統]餘弦計算相似度度量

但是這個是隻适用于直角三角形的,而在非直角三角形中,餘弦定理的公式是

[推薦系統]餘弦計算相似度度量

圖5

三角形中邊a和b的夾角 的餘弦計算公式為:

[推薦系統]餘弦計算相似度度量

公式(2)

在向量表示的三角形中,假設a向量是(x1, y1),b向量是(x2, y2),那麼可以将餘弦定理改寫成下面的形式:

[推薦系統]餘弦計算相似度度量

圖6

向量a和向量b的夾角 的餘弦計算如下

[推薦系統]餘弦計算相似度度量

擴充,如果向量a和b不是二維而是n維,上述餘弦的計算法仍然正确。假定a和b是兩個n維向量,a是  ,b是  ,則a與b的夾角 的餘弦等于:

[推薦系統]餘弦計算相似度度量

餘弦值越接近1,就表明夾角越接近0度,也就是兩個向量越相似,夾角等于0,即兩個向量相等,這就叫"餘弦相似性"。

【下面舉一個例子,來說明餘弦計算文本相似度】

    舉一個例子來說明,用上述理論計算文本的相似性。為了簡單起見,先從句子着手。

         句子a:這隻皮靴号碼大了。那隻号碼合适

句子b:這隻皮靴号碼不小,那隻更合适

怎樣計算上面兩句話的相似程度?

基本思路是:如果這兩句話的用詞越相似,它們的内容就應該越相似。是以,可以從詞頻入手,計算它們的相似程度。

第一步,分詞。

句子a:這隻/皮靴/号碼/大了。那隻/号碼/合适。

句子b:這隻/皮靴/号碼/不/小,那隻/更/合适。

第二步,列出所有的詞。

這隻,皮靴,号碼,大了。那隻,合适,不,小,很

第三步,計算詞頻。

句子a:這隻1,皮靴1,号碼2,大了1。那隻1,合适1,不0,小0,更0

句子b:這隻1,皮靴1,号碼1,大了0。那隻1,合适1,不1,小1,更1

第四步,寫出詞頻向量。

  句子a:(1,1,2,1,1,1,0,0,0)

  句子b:(1,1,1,0,1,1,1,1,1)

到這裡,問題就變成了如何計算這兩個向量的相似程度。我們可以把它們想象成空間中的兩條線段,都是從原點([0, 0, ...])出發,指向不同的方向。兩條線段之間形成一個夾角,如果夾角為0度,意味着方向相同、線段重合,這是表示兩個向量代表的文本完全相等;如果夾角為90度,意味着形成直角,方向完全不相似;如果夾角為180度,意味着方向正好相反。是以,我們可以通過夾角的大小,來判斷向量的相似程度。夾角越小,就代表越相似。

使用上面的公式(4)

[推薦系統]餘弦計算相似度度量

計算兩個句子向量

句子a:(1,1,2,1,1,1,0,0,0)

和句子b:(1,1,1,0,1,1,1,1,1)的向量餘弦值來确定兩個句子的相似度。

計算過程如下:

[推薦系統]餘弦計算相似度度量

計算結果中夾角的餘弦值為0.81非常接近于1,是以,上面的句子a和句子b是基本相似的

由此,我們就得到了文本相似度計算的處理流程是:

    (1)找出兩篇文章的關鍵詞;

 (2)每篇文章各取出若幹個關鍵詞,合并成一個集合,計算每篇文章對于這個集合中的詞的詞頻

 (3)生成兩篇文章各自的詞頻向量;

 (4)計算兩個向量的餘弦相似度,值越大就表示越相似。

繼續閱讀