1 余弦相似度
余弦相似度 (Cosine Similarity) 通過計算兩個向量的夾角余弦值來評估他們的相似度猾蒂。將向量根據(jù)坐標值,繪制到向量空間中是晨,求得他們的夾角肚菠,并得出夾角對應(yīng)的余弦值,此余弦值就可以用來表征這兩個向量的相似性罩缴。夾角越小蚊逢,余弦值越接近于1,它們的方向越吻合箫章,則越相似烙荷。
以二維空間為例,上圖的a和b是兩個向量檬寂,我們要計算它們的夾角θ终抽。余弦定理告訴我們,可以用下面的公式求得:
余弦的這種計算方法對n維向量也成立桶至。假定A和B是兩個n維向量昼伴,A是 [A1, A2, …, An] ,B是 [B1, B2, …, Bn] 镣屹,則A與B的夾角θ的余弦等于:
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算法。