1. 使用simhash計算文字相似度
2. 使用余弦相似度計算文字相似度
3. 使用編輯距離計算文字相似度
4. jaccard係數計算文字相似度
余弦相似性:兩個向量的夾角越接近於0,其餘弦值越接近於1,表面兩個向量越相似。
向量夾角余弦計算:co
sα=x
1⋅x2
+y1⋅
y2x1
2+y1
2×x2
2+y2
2cos
α=x1
2+y
12
×x22
+y2
2x
1⋅x
2+y
1⋅y
2文字相似度計算大致流程:
對於兩段文字a和b,對其進行分詞,得到兩個詞列表:a=
[t1,
t2,⋯
,ti]
a=[t
1,t
2,⋯
,ti
]b=[
t1,t
2,⋯,
tj]b
=[t1
,t2
,⋯,
tj]
對兩個詞列表進行合併去重,得到輸入樣本中的所有詞:t(
a,b)
=t(a
)+t(
b)=[
t1,t
2,⋯,
tk]t
(a,b
)=t(
a)+t
(b)=
[t1
,t2
,⋯,t
k]計算特徵值:
選取詞頻作為特徵值。f(
a)=[
fa1,
fa2,
⋯,fa
k]f(
a)=[
fa1
,fa
2,
⋯,fa
k]
f(b)
=[fb
1,fb
1,⋯,
fbk]
f(b)
=[fb
1,
fb1
,⋯,
fbk
]向量化a⃗=
(fa1
,fa2
,⋯,f
ak)a
=(fa
1,
fa2
,⋯,
fak
)b⃗
=(fb
1,fb
2,⋯,
fbk)
b=(f
b1
,fb2
,⋯
,fbk
)計算余弦值:co
sα=∑
i=1k
fai⋅
fbi∑
i=1k
(fai
)2⋅∑
i=1k
(fbi
)2co
sα=∑
i=1k
(fa
i)
2⋅∑
i=1k
(fb
i)
2∑i
=1k
fai
⋅fb
i
樣本1( a ):今天天氣真好,適合去逛街,也適合曬太陽。
樣本2( b ):今天天氣不錯,適合去玩,也適合去曬太陽。
樣本3( c ):小明不喜歡和小紅玩,因為小明不喜歡太陽。
分詞:
a=
[今天, 天氣, 真好, 適合, 去, 逛街, 也, 適合, 曬太陽]
b=[今天, 天氣, 不錯, 適合, 去, 玩, 也, 適合, 去, 曬太陽]
c=[小明, 不, 喜歡, 和, 小, 紅, 玩, 因為, 小明, 不, 喜歡, 太陽]
合併並去重:
[今天, 天氣, 真好, 適合, 去, 逛街, 也, 曬太陽, 小明, 不, 喜歡, 和, 小, 紅, 玩, 因為, 太陽, 不錯]
特徵值(詞頻)計算:
f
(a)=
[今天:
1, 天氣:
1, 真好:
1, 適合:
2, 去:
1, 逛街:
1, 也:
1, 曬太陽:
1, 小明:
0, 不:
0, 喜歡:
0, 和:
0, 小:
0, 紅:
0, 玩:
0, 因為:
0, 太陽:
0, 不錯:0]
f(b)
=[今天:
1, 天氣:
1, 真好:
0, 適合:
2, 去:
2, 逛街:
0, 也:
1, 曬太陽:
1, 小明:
0, 不:
0, 喜歡:
0, 和:
0, 小:
0, 紅:
0, 玩:
1, 因為:
0, 太陽:
0, 不錯:1]
f(c)
=[今天:
1, 天氣:
1, 真好:
0, 適合:
2, 去:
2, 逛街:
0, 也:
1, 曬太陽:
1, 小明:
2, 不:
2, 喜歡:
2, 和:
1, 小:
1, 紅:
1, 玩:
2, 因為:
1, 太陽:
1, 不錯:
1]
向量化:a⃗
=(1,
1,1,
2,1,
1,1,
1,0,
0,0,
0,0,
0,0,
0,0,
0)a=
(1,1
,1,2
,1,1
,1,1
,0,0
,0,0
,0,0
,0,0
,0,0
)b⃗=
(1,1
,0,2
,2,0
,1,1
,0,0
,0,0
,0,0
,1,0
,0,1
)b=(
1,1,
0,2,
2,0,
1,1,
0,0,
0,0,
0,0,
1,0,
0,1)
c⃗=(
1,1,
0,2,
2,0,
1,1,
2,2,
2,1,
1,1,
2,1,
1,1)
c=(1
,1,0
,2,2
,0,1
,1,2
,2,2
,1,1
,1,2
,1,1
,1)計算余弦:co
sa⃗b
⃗=0.8058229640253802co
sab=
0.80
5822
9640
2538
02co
sa⃗c
⃗=0.0cos
ac=0
.0co
sb⃗c
⃗=0.06299407883487121co
sbc=
0.06
2994
0788
3487
121a
⃗b⃗a
b的夾角的余弦更趨近於1,所以相似度更高。
余弦相似度對於短文本的相似度計算還是比較準確的,但是對於大文字計算時,速度不如simhash快。
字元數simhash耗時/ms
余弦相似度耗時/ms
201.7
0.4200
4.21.8
2000
20.0
10.7
20000
24.1
34.0
200000
176.7
668.5
另外測試了10000個字元,步長100的線性資料,繪製結果如下:
當字元數量大約大於3000時,simhash的效率高於余弦相似度的相率。(中間有段時間突增是因為啟動了其他程式,占用了cpu導致的)
所以短文本使用余弦相似度來計算文字相似度還是比較適合的。而對於準確度來說,這兩種方法的準確度差不多,最主要的還是取決於特徵值或者的計算方式。通過簡單的詞頻計算作為特徵值,雖然簡單,但是僅僅只能通過詞語本身來衡量其特性,而沒有語境(即上下文)來更準確的確定乙個詞的特徵。因此也演變出了一些新的優化方法或者模型,例如td-idf等等,後面再陸續總結下。
all efforts, only for myself, no longer for others
使用余弦相似度演算法計算文字相似度
在求相似度的時候經常會有以下一些方法,1.基於詞向量 2.基於字元的 3.基於概率統計的 4.基於詞嵌入模型的 在求文字相似度的時候經常會使用余弦相似度來求,下面來記錄一下余弦相似度的原理。余弦相似度量 計算個體間的相似度。相似度越小,距離越大。相似度越大,距離越小。假設有3個物品,item1,it...
使用餘弦定理計算文字相似度
文字相似度 學過向量代數的人都知道,向量實際上是多維空間中有方向的線段。如果兩個向量的方向一致,即夾角接近零,那麼這兩個向量就相近。而要確定兩個向量方向是否一致,這就要用到餘弦定理計算向量的夾角了。餘弦定理對我們每個人都不陌生,它描述了三角形中任何乙個夾角和三個邊的關係,換句話說,給定三角形的三條邊...
計算文字相似度
計算文字相似度 推薦2收藏 簡單講解 文字相似度計算在資訊檢索 資料探勘 機器翻譯 文件複製檢測等領域有著廣泛的應用。比如 控制,我們假設你開發了乙個微博 並且已經把世界上罵人的句子都已經收錄進了資料庫,那麼當乙個使用者發微博時會先跟罵人句子的資料庫進行比較,如果符合裡面的句子就不讓使用者發出。通常...