利用余弦相似度做文字分類:
在數學中余弦相似度的公式:cos(a,b)=a*b/(|a|+|b|),
而在文字上,我們的余弦相似度通常是這樣計算而成:
(文字a,b
共同出現的詞條數目)/
(文字a
出現的詞條數目+
文字b出現的詞條數目)
處理兩個純文字的相似度可以這樣處理,但對於文字分類來說,我們更多使用的是「訓練集」與「測試集」的概念,具體我們會抽取訓練集的詞條,形成語料庫,然後統計這些語料庫中的詞條在測試集中出現的頻數以及在訓練集中出現的頻數,形成詞條詞頻特徵碼,進而計算相似度。
在現實中,文字a
,b都出現相同而不重要的詞條,如:「的,地,我們,你」等。我們的解決的方案可以是,建立停用詞庫,對文字先預處理,去除文字的不重要詞條。或者,用tf-idf
,textrank
等演算法提取重要的特徵詞。而我在多次實驗中發現,文字中較為重要的往往集中於實體名詞,也就是說,我們可以提取帶有vn
,n等詞性的詞條,然後統計相同出現的數目,計算余弦相似度。
具體的步驟如下:
步驟一:提取文字
提取文字的詞條我是用結巴分詞,因為我的環境是linux
平台,所以只需sudopip-install jieba
即可,**如下:
import jieba
import jieba.posseg as pseg
f1=open(sampfn) #
開啟訓練集文字
test_words={}
all_words={}
try:
f1_text= f1.read()
f1_text= unicode(f1_text,'utf-8') #
文字解碼為utf-8
,支援中文
finally:
f1.close()
f1_seg_list=pseg.cut(f1_text) #
將文字分詞,得到每乙個詞條以及其詞性
for w in f1_seg_list:
if 'n' in w.flag : #
抽取實體名詞
test_words.setdefault(w.word,0) #
構建語料庫字典
all_words.setdefault(w.word,0) #
建立訓練集詞條字典,並統計詞條詞頻
all_words[w.word]+=1
ftest1= open(ftest1fn) #
開啟測試樣本1
mytest1_words= copy.deepcopy(test_words) #
複製語料庫
try:
ftest1_text= ftest1.read()
ftest1_text= unicode(ftest1_text,'utf-8')
finally:
ftest1.close()
ftest1_seg_list=pseg.cut(ftest1_text) #
將文字分詞,得到每乙個詞條以及其詞性
for w in ftest1_seg_list:
if 'n' in w.flag :
if mytest1_words.has_key(w.word):
mytest1_words[w.word]+=1 #
統計語料庫中的詞條在測試集中的頻數
步驟二:形成詞條詞頻特徵碼
sampdata= #
特徵碼用列表,方便使用numpy
計算test1data=
for key in all_words.keys():
訓練集的特徵碼
測試集的特徵碼
test1simi=get_cossimi(sampdata,test1data) #
計算余弦相似度
步驟三:計算余弦相似度
我們可以借助numpy
類,這是乙個專門計算複雜數學公式的類,具體的函式如下:
def get_cossimi(x,y):
myx=np.array(x) #
將列表轉化為陣列,更好的數學理解是向量
myy=np.array(y) #
將列表轉化為陣列,更好的數學理解是向量
cos1=np.sum(myx*myy) #cos(a,b)=a*b/(|a|+|b|)
cos21=np.sqrt(sum(myx*myx))
cos22=np.sqrt(sum(myy*myy))
return cos1/(float(cos21*cos22))
利用餘弦定理計算文字的相似度
usr bin env python coding utf 8 from future import division import jieba.analyse from math import sqrt class similarity def init self,target1,target2,...
使用余弦相似度計算文字相似度
1.使用simhash計算文字相似度 2.使用余弦相似度計算文字相似度 3.使用編輯距離計算文字相似度 4.jaccard係數計算文字相似度 余弦相似性 兩個向量的夾角越接近於0,其餘弦值越接近於1,表面兩個向量越相似。向量夾角余弦計算 co s x 1 x2 y1 y2x1 2 y1 2 x2 2...
使用余弦相似度演算法計算文字相似度
在求相似度的時候經常會有以下一些方法,1.基於詞向量 2.基於字元的 3.基於概率統計的 4.基於詞嵌入模型的 在求文字相似度的時候經常會使用余弦相似度來求,下面來記錄一下余弦相似度的原理。余弦相似度量 計算個體間的相似度。相似度越小,距離越大。相似度越大,距離越小。假設有3個物品,item1,it...