轉(zhuǎn)載:使用余弦相似度算法計算文本相似度

原文地址:https://www.cnblogs.com/airnew/p/9563703.html
在工作中一直使用余弦相似度算法計算兩段文本的相似度和兩個用戶的相似度。一直弄不明白多維的余弦相似度公式是怎么推導(dǎo)來的。今天終于花費時間把公式推導(dǎo)出來,其實很簡單,都是高中學(xué)過的知識,只是很多年沒用了,都還給老師了。本文還通過一個例子演示如果使用余弦相似度計算兩段文本的相似度。

余弦函數(shù)在三角形中的計算公式為:


在直角坐標(biāo)系中,向量表示的三角形的余弦函數(shù)是怎么樣的呢?下圖中向量a用坐標(biāo)(x1,y1)表示,向量b用坐標(biāo)(x2,y2)表示。


這是2維空間中余弦函數(shù)的公式,那么多維空間余弦函數(shù)的公式就是:


余弦相似度

余弦相似度量:計算個體間的相似度。

相似度越小,距離越大。相似度越大,距離越小。

假設(shè)有3個物品,item1,item2和item3,用向量表示分別為:

item1[1,1,0,0,1],

item2[0,0,1,2,1],

item3[0,0,1,2,0],

即五維空間中的3個點。用歐式距離公式計算item1、itme2之間的距離,以及item2和item3之間的距離,分別是:


由此可得出item1和item2相似度小,兩個之間的距離大(距離為7),item2和itme3相似度大,兩者之間的距離小(距離為1)。


余弦相似度算法:一個向量空間中兩個向量夾角間的余弦值作為衡量兩個個體之間差異的大小,余弦值接近1,夾角趨于0,表明兩個向量越相似,余弦值接近于0,夾角趨于90度,表明兩個向量越不相似。


余弦相似度

余弦相似度量:計算個體間的相似度。

相似度越小,距離越大。相似度越大,距離越小。


余弦相似度算法:一個向量空間中兩個向量夾角間的余弦值作為衡量兩個個體之間差異的大小,余弦值接近1,夾角趨于0,表明兩個向量越相似,余弦值接近于0,夾角趨于90度,表明兩個向量越不相似。


下面我們介紹使用余弦相似度計算兩段文本的相似度。思路:1、分詞;2、列出所有詞;3、分詞編碼;4、詞頻向量化;5、套用余弦函數(shù)計量兩個句子的相似度。


句子A:這只皮靴號碼大了。那只號碼合適。

句子B:這只皮靴號碼不小,那只更合適。

1、分詞:

使用結(jié)巴分詞對上面兩個句子分詞后,分別得到兩個列表:

listA=[‘這‘, ‘只‘, ‘皮靴‘, ‘號碼‘, ‘大‘, ‘了‘, ‘那‘, ‘只‘, ‘號碼‘, ‘合適‘]

listB=[‘這‘, ‘只‘, ‘皮靴‘, ‘號碼‘, ‘不小‘, ‘那‘, ‘只‘, ‘更合‘, ‘合適‘]


2、列出所有詞,將listA和listB放在一個set中,得到:

set={'不小', '了', '合適', '那', '只', '皮靴', '更合', '號碼', '這', '大'}

將上述set轉(zhuǎn)換為dict,key為set中的詞,value為set中詞出現(xiàn)的位置,即‘這’:1這樣的形式。

dict1={'不小': 0, '了': 1, '合適': 2, '那': 3, '只': 4, '皮靴': 5, '更合': 6, '號碼': 7, '這': 8, '大': 9},可以看出“不小”這個詞在set中排第1,下標(biāo)為0。


3、將listA和listB進(jìn)行編碼,將每個字轉(zhuǎn)換為出現(xiàn)在set中的位置,轉(zhuǎn)換后為:

listAcode=[8, 4, 5, 7, 9, 1, 3, 4, 7, 2]

listBcode=[8, 4, 5, 7, 0, 3, 4, 6, 2]

我們來分析listAcode,結(jié)合dict1,可以看到8對應(yīng)的字是“這”,4對應(yīng)的字是“只”,9對應(yīng)的字是“大”,就是句子A和句子B轉(zhuǎn)換為用數(shù)字來表示。


4、對listAcode和listBcode進(jìn)行oneHot編碼,就是計算每個分詞出現(xiàn)的次數(shù)。oneHot編號后得到的結(jié)果如下:

listAcodeOneHot = [0, 1, 1, 1, 2, 1, 0, 2, 1, 1]

listBcodeOneHot = [1, 0, 1, 1, 2, 1, 1, 1, 1, 0]

下圖總結(jié)了句子從分詞,列出所有詞,對分詞進(jìn)行編碼,計算詞頻的過程

5、得出兩個句子的詞頻向量之后,就變成了計算兩個向量之間夾角的余弦值,值越大相似度越高。

listAcodeOneHot = [0, 1, 1, 1, 2, 1, 0, 2, 1, 1]

listBcodeOneHot = [1, 0, 1, 1, 2, 1, 1, 1, 1, 0]

根據(jù)余弦相似度,句子A和句子B相似度很高。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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