20-余弦相似度及其R實現(xiàn)

1 余弦相似度

余弦相似度 (Cosine Similarity) 通過計算兩個向量的夾角余弦值來評估他們的相似度猾蒂。將向量根據(jù)坐標值,繪制到向量空間中是晨,求得他們的夾角肚菠,并得出夾角對應(yīng)的余弦值,此余弦值就可以用來表征這兩個向量的相似性罩缴。夾角越小蚊逢,余弦值越接近于1,它們的方向越吻合箫章,則越相似烙荷。


余弦定理

以二維空間為例,上圖的a和b是兩個向量檬寂,我們要計算它們的夾角θ终抽。余弦定理告訴我們,可以用下面的公式求得:


三角形的余弦公式

余弦的這種計算方法對n維向量也成立桶至。假定A和B是兩個n維向量昼伴,A是 [A1, A2, …, An] ,B是 [B1, B2, …, Bn] 镣屹,則A與B的夾角θ的余弦等于:
N維向量的余弦定理

2 余弦相似度算法

在文本處理中圃郊,要使用余弦相似度算法,首先得將文本向量化女蜈,將詞用“詞向量”的方式表示可謂是將 Deep Learning 算法引入 NLP 領(lǐng)域的一個核心技術(shù)持舆。自然語言處理轉(zhuǎn)化為機器學(xué)習(xí)問題的第一步都是通過一種方法將這些文本數(shù)學(xué)化。其思路如下:

  • 1鞭光、將兩段文本(或者只是兩句話)分詞吏廉;
  • 2、清理標點符號和一些停用詞后(可選)惰许,列出兩段文本中的所有出現(xiàn)的詞席覆;
  • 3、對每一個詞進行數(shù)字編碼汹买;
  • 4佩伤、根據(jù)這個統(tǒng)一的編碼,將兩段文本根據(jù)詞頻還原為數(shù)字向量晦毙,即詞頻向量化生巡;
  • 5、使用余弦定理計算兩個向量的余弦值见妒,得到兩段文本的相似度孤荣。

舉例:
句子A:這只皮靴號碼大了。那只號碼合適。
句子B:這只皮靴號碼不小盐股,那只更合適钱豁。

sA <- "這只皮靴號碼大了。那只號碼合適疯汁。"
sB <- "這只皮靴號碼不小牲尺,那只更合適。"

1幌蚊、中文分詞:
使用結(jié)巴分詞對上面兩個句子分詞后谤碳,分別得到兩個詞集:

library(jiebaR)
wk <- worker()
listA <- segment(sA,wk);listA
[1] "這"   "只"   "皮靴" "號碼" "大"   "了"   "那"   "只"   "號碼" "合適"
listB <- segment(sB,wk);listB
[1] "這"   "只"   "皮靴" "號碼" "不小" "那"   "只"   "更"   "合適"

2、列出所有詞溢豆,將listA和listB放在一個set中蜒简,構(gòu)成詞包:

# 對listA和listB求并集
set <- union(listA,listB);set
[1] "這"   "只"   "皮靴" "號碼" "大"   "了"   "那"   "合適" "不小" "更"

3、使用詞集分別對listA和listB計算詞頻漩仙。

listAcode <- rep(0,length(set))
freqA <- freq(listA)
for(i in 1:length(set)) {
  for(j in 1:length(freqA$char)) {
    if(set[i]==freqA$char[j]) listAcode[i] = freqA$freq[j]
  }
}
> listAcode
[1] 1 2 1 2 1 1 1 1 0 0

listBcode <- rep(0,length(set))
freqB <- freq(listB)
for(i in 1:length(set)) {
  for(j in 1:length(freqB$char)) {
    if(set[i]==freqB$char[j]) listBcode[i] = freqB$freq[j]
  }
}
> listBcode
[1] 1 2 1 1 0 0 1 1 1 1

4臭蚁、對listA和listB進行oneHot編碼后得到的結(jié)果如下:
listAcode = [1, 2, 1, 2, 1, 1, 1, 1, 0, 0]
listBcode = [1, 2, 1, 1, 0, 0, 1, 1, 1, 1]
5、得出兩個句子的詞頻向量之后讯赏,就變成了計算兩個向量之間夾角的余弦值,值越大相似度越高冷尉。

cosθ <- sum(listAcode * listBcode) / (sqrt(sum(listAcode ^ 2)) * sqrt(sum(listBcode ^ 2)));cosθ
> [1] 0.805823

6漱挎、兩個向量的余弦值為0.805823,接近1雀哨,說明兩句話相似度很高磕谅。

3 計算步驟總結(jié)

兩個句子的相似度計算步驟如下:
1.通過中文分詞,把完整的句子分成獨立的詞集合雾棺;
2.求出兩個詞集合的并集(詞包)膊夹;
3.計算各自詞集的詞頻并將詞頻向量化;
4.代入余弦公式就可以求出文本相似度捌浩。
注意放刨,詞包確定之后,詞的順序是不能再修改的尸饺,不然會影響到向量的變化进统。

以上是對兩個句子做相似度計算,如果是對兩篇文章做相似度計算浪听,步驟如下:
1.找出各自文章的關(guān)鍵詞并合成一個詞集合螟碎;
2.求出兩個詞集合的并集(詞包);
3.計算各自詞集的詞頻并將詞頻向量化迹栓;
4.代入余弦公式就可以求出文本相似度掉分。
句子的相似度計算只是文章相似度計算的一個子部分。文章的關(guān)鍵詞提取可以通過其他的算法來實現(xiàn)。

4 TF算法總結(jié)

詞頻TF(Term Frequency)酥郭,是一個詞語在文章或句子中出現(xiàn)的次數(shù)华坦。要在一篇很長的文章中尋找關(guān)鍵字(詞),就一般的理解褥民,一個詞對文章越關(guān)鍵在文章中出現(xiàn)的次數(shù)就越多季春,于是我們就采用“詞頻”進行統(tǒng)計。

但是這也不是絕對的消返,比如“地”载弄,“的”,“啊”等詞撵颊,它們出現(xiàn)的次數(shù)對一篇文章的中心思想是沒有幫助的宇攻,只是中文語法結(jié)構(gòu)的一部分而已。這類詞也被稱為“停用詞”倡勇,所以逞刷,在計算一篇文章的詞頻時,停用詞是應(yīng)該過濾掉的妻熊。

僅僅過濾掉停用詞就能解決問題嗎?也不一定夸浅。比如分析政府工作報告,“中國”這個詞語必定在每篇文章中都出現(xiàn)很多次扔役,但是對于每份報告的主干思想有幫助嗎帆喇?對比“反腐敗”、“人工智能”亿胸、“大數(shù)據(jù)”坯钦、“物聯(lián)網(wǎng)”等詞語,“中國”這個詞語在文章中應(yīng)該是次要的侈玄。

TF算法的優(yōu)點是簡單快速婉刀,結(jié)果比較符合實際情況。缺點是單純以“詞頻”做衡量標準序仙,不夠全面突颊,詞性和詞的出現(xiàn)位置等因素沒有考慮到,而且有時重要的詞可能出現(xiàn)的次數(shù)并不多诱桂。這種算法無法體現(xiàn)詞的位置信息洋丐,位置靠前的詞與位置靠后的詞,都被視為重要性相同挥等,這是不科學(xué)的友绝。

聯(lián)系到層次分析法的思想,可以賦予每個詞特定的權(quán)重肝劲,給那類最常見的詞賦予較小的權(quán)重迁客,相應(yīng)的較少見的詞賦予較大的權(quán)重郭宝,這個權(quán)重叫做“逆文檔頻率”(Inverse Doucument Frequency,縮寫為IDF)掷漱,它的大小與一個詞的常見程度成反比粘室。而TF-IDF值就是將詞頻TF和逆文檔頻率IDF相乘,值越大卜范,說明該詞對文章的重要性越高衔统。這就是TF-IDF算法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末海雪,一起剝皮案震驚了整個濱河市锦爵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奥裸,老刑警劉巖险掀,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異湾宙,居然都是意外死亡樟氢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門侠鳄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來埠啃,“玉大人,你說我怎么就攤上這事伟恶“悦茫” “怎么了?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵知押,是天一觀的道長。 經(jīng)常有香客問我鹃骂,道長台盯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任畏线,我火速辦了婚禮静盅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘寝殴。我一直安慰自己蒿叠,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布蚣常。 她就那樣靜靜地躺著市咽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抵蚊。 梳的紋絲不亂的頭發(fā)上施绎,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天溯革,我揣著相機與錄音,去河邊找鬼谷醉。 笑死致稀,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的俱尼。 我是一名探鬼主播抖单,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼遇八!你這毒婦竟也來了矛绘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤押蚤,失蹤者是張志新(化名)和其女友劉穎蔑歌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揽碘,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡次屠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了雳刺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劫灶。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖掖桦,靈堂內(nèi)的尸體忽然破棺而出本昏,到底是詐尸還是另有隱情,我是刑警寧澤枪汪,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布涌穆,位于F島的核電站,受9級特大地震影響雀久,放射性物質(zhì)發(fā)生泄漏宿稀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一赖捌、第九天 我趴在偏房一處隱蔽的房頂上張望祝沸。 院中可真熱鬧,春花似錦越庇、人聲如沸罩锐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涩惑。三九已至,卻和暖如春桑驱,著一層夾襖步出監(jiān)牢的瞬間境氢,已是汗流浹背蟀拷。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留萍聊,地道東北人问芬。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像寿桨,于是被迫代替她去往敵國和親此衅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,747評論 2 361