import jieba
import math
from scipy import spatial
import numpy as np
class
cosine_similarity_of_text
:def
__init__
(self,strings1=
none
,strings2=
none
,model=
'fitnumpy'):
self.strings1 , self.strings2 = strings1 , strings2
self.strings1_cut, self.strings2_cut = self.cut(strings1)
, self.cut(strings2)
self.strings1_cut_code ,self.strings2_cut_code = self.cut_code(self.strings1_cut)
, self.cut_code(self.strings2_cut)
self.frequency_of_word1 = self.frequency_of_word(self.strings1_cut,self.strings1_cut_code)
self.frequency_of_word2 = self.frequency_of_word(self.strings2_cut,self.strings2_cut_code)
if model ==
'numpy'
: self.fit = self.full_npcosine(np.array(self.frequency_of_word1)
,np.array(self.frequency_of_word2)
)elif model ==
'python'
: self.fit =self.full_pycosine(self.frequency_of_word1, self.frequency_of_word2)
.__next__(
)def
cut(self,strings)
:'''
分詞:param strings:
:return:
'''return
[i for i in jieba.cut(strings, cut_all=
true
)if i !='']
defword_set
(self)
:'''
並集詞彙表
:return:
'''return
set(self.strings1_cut)|(
set(self.strings2_cut)
)def
word_dict
(self)
:'''
建立字典
:return:
'''return
defcut_code
(self,cut)
:'''
單文詞語編碼
:param cut:
:return:
'''return
(self.word_dict(
)[word]
for word in cut)
deffrequency_of_word
(self,string_cut,string_cut_code)
:'''
統計詞頻生成詞向量
:param string_cut:
:param string_cut_code:
:return:
'''dict_ = self.word_dict(
) string_cut_code = string_cut_code
string_cut_code =[0
]*len(dict_)
for word in string_cut:
string_cut_code[dict_[word]]+=
1return
(string_cut_code)
deffull_pycosine
(self,vector1,vector2)
:'''
python資料結構計算余弦相似度
:param vector1:
:param vector2:
:return:
'''sum=
0 sqrt1 =
0 sqrt2 =
0for i in
range
(len
(vector1)):
sum+= vector1[i]
* vector2[i]
sqrt1 +=
pow(vector1[i],2
) sqrt2 +=
pow(vector2[i],2
)try
: result =
yield
round
(float
(sum)/
(math.sqrt(sqrt1)
* math.sqrt(sqrt2)),
2)except zerodivisionerror:
result =
0.0return result
deffull_npcosine
(self,vector1,vector2)
:'''
scipy方法建立ndarray結構的余弦相似度
:param vector1:
:param vector2:
:return:
'''return spatial.distance.cosine(vector1,vector2)
def__del__
(self)
:pass
if __name__ ==
'__main__'
: strings1 =
'從數學上看,余弦相似度衡量的是投射到乙個多維空間中的兩個向量之間的夾角的余弦。當在多維空間中繪製余弦相似度時,余弦相似度體現的是每個向量的方向關係(角度),而非幅度。如果你想要幅度,則應計算歐幾里德距離。'
strings2 =
'余弦相似度很有優勢,因為即使兩個相似的檔案由於大小而在歐幾里德距離上相距甚遠(比如文件**現很多次的某個詞或多次**過同一部電影的某使用者),它們之間也可能具有更小的夾角。夾角越小,則相似度越高。'
fit = cosine_similarity_of_text(strings1, strings2,model=
'numpy'
)print
(fit.fit)
余弦相似度
余弦距離 歐氏距離和傑卡德相似性度量的對比分析 1 余弦距離 余弦距離,也稱為余弦相似度,是用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小的度量。向量,是多維空間中有方向的線段,如果兩個向量的方向一致,即夾角接近零,那麼這兩個向量就相近。而要確定兩個向量方向是否一致,這就要用到餘弦定理...
余弦相似度
基於餘弦定理計算相似度的應用很多,比如推薦系統中的協同過濾,計算文字的相似性等等。它用計算兩者空間向量的夾角來表示兩者的相似性。先看一下餘弦定理的公式 wu v u ivi u2i v 2i 上訴公式表示uv兩者的相似度,ui表示u在i緯度的數值。在使用者行為資料 使用者只有操作和未操作兩種狀態,也...
余弦相似度
余弦距離,也稱為余弦相似度,是用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小的度量。相比距離度量,余弦相似度更加注重兩個向量在方向上的差異,而非距離或長度上。公式如下 python實現如下 import numpy as np from scipy.spatial.distance i...