數學原理:
向量:空間中有兩個點原點o和點a,oa(o指向a)就是乙個向量,向量是有長度有方向的。
點積(內積): = ∑(oi*ai)
向量長度: ||a||= sqrt() = sqrt(∑a*a)
余弦公式: cos(α) = a*b / ||a||*||b|| = ∑ai*bi / sqrt(∑a*a)*sqrt(∑b*b)
應用舉例:文字新聞分類
原理:將爬出來的文章用jieba分詞庫分好詞,然後去除停用詞,再用map把詞頻進行統計,利用已分好類別的文章和當前待分類文章的詞條詞頻進行余弦相似度計算,根據計算結果將文章分類。
步驟:
1. 用爬蟲爬好一定數量的文章
2. 先開啟已知某類文章並用jieba庫進行分詞操作
file1 = open(filename) #先讀檔案
file_str = file1.read() #檔案字串
file_str = unicode(file_str,』utf-8』) #文字編碼轉成utf-8
file1.close() #關閉檔案
#jieba庫的使用之cut,將目標字串分解返回乙個生成器,第二個引數是是#否完全分割,預設false
seglist = jieba.cut(file_str,cut_all = false)
#jieba.cut_for_search(str) 是以搜尋引擎模式分割
strlist = 「,」.join(seglist)#將返回的分詞生成器轉換成字串中間用『,』分開
3. 載入停用詞檔案
file2 = open(tingyongci_file_at) #開啟停用詞檔案
#像操作剛才的待讀文字一樣進行處理 不過停用詞檔案每行乙個停用詞
所以停用詞以換行符為單位分割儲存到stop_str裡
file2_str = file2.read()
file2_str = unicode(file2_str,』utf-8』)
file2.close()
stop_str = file2_str.split(『\n』)
ps:什麼是停用詞,又有什麼作用?
如圖,就是這樣的無實際意義、大多起連線作用、去除並不影響語意理解的詞
4. 去除停用詞並將有用的詞條放到map中進行詞頻統計
t_allword = {} #不計數僅僅統計詞條
allword = {} #當前文章中所有出現的有效詞條map,並且已計數
for myword in strlist.split(','):
if not(myword.strip() in stop_str) and len(myword.strip()) > 1:
t_allword.setdefault(myword,0)
all_word.setdefault(myword,0)
all_word[myword] += 1
6. 將已知分類文章map和當前待分類文章map進行余弦相似度計算,也就是將map的key放到list裡,也就是對應每個詞條的詞頻,將文章特徵數位化也就可以進行余弦相似度計算了。
def cos_like(x,y): #計算余弦相似度函式
tx = np.array(x)
ty = np.array(y)
cos1 = np.sum(tx*ty)
cos21 = np.sqrt(sum(tx**2))
cos22 = np.sqrt(sum(ty**2))
returncos1/float(cos21*cos22)
完整**:
# -*- coding: utf-8 -*-
'''created on 2015-11-17
@author: haoran
'''import copy
import jieba
import numpy as np
from os import listdir
tingyongci_file_at = 'text_test/tingyongci.txt'
filename = 'text_test/junshi1.txt'
file2 = open(tingyongci_file_at)
file2_str = file2.read()
file2_str = unicode(file2_str,'utf-8')
file2.close()
stop_str = file2_str.split('\n') #停用詞列表
def cos_like(x,y):
tx= np.array(x)
ty= np.array(y)
cos1 = np.sum(tx*ty)
cos21 = np.sqrt(sum(tx**2))
cos22 = np.sqrt(sum(ty**2))
return cos1/float(cos21*cos22)
file1 = open(filename)
file_str = file1.read()
file_str = unicode(file_str,'utf-8')
file1.close()
seglist = jieba.cut(file_str,cut_all=false)
print type(seglist)
strlist = ",".join(seglist)
t_allword = {}
all_word = {}
for myword in strlist.split(','):
if not(myword.strip() in stop_str) and len(myword.strip()) > 1:
t_allword.setdefault(myword,0)
all_word.setdefault(myword,0)
all_word[myword] += 1
return t_allword,all_word
def ret_yangben_guanjianci(file_at,t_allword): #返回待測樣本的關鍵字map
ret_word = copy.deepcopy(t_allword)
file= open(file_at)
string = file.read()
string = unicode(string,'utf-8')
file.close()
#print string
fenci = jieba.cut(string)
for myword in fenci:
if not(myword.strip() in stop_str):
if ret_word.has_key(myword):
ret_word[myword]+=1
return ret_word
def compare_main(main_file,comp_file):
t_allword,all_word = ret_main_guanjianci(main_file)
alldata =
compdata =
t_word = ret_yangben_guanjianci(comp_file,t_allword)
for key in all_word.keys():
print alldata
print compdata
ans1 = cos_like(alldata,compdata)
print '%s文字和 %s文字相似度為 %f'%(main_file,comp_file,ans1)
futherfolder = 'text_test'
files = listdir(futherfolder)
n = len(files)
for i in range(0,n-1):
compare_main(futherfolder+'/'+files[3],futherfolder+'/'+files[i])
相似度演算法之余弦相似度
余弦距離,也稱為余弦相似度,是用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小的度量。余弦值越接近1,就表明夾角越接近0度,也就是兩個向量越相似,這就叫 余弦相似性 上圖兩個向量a,b的夾角很小可以說a向量和b向量有很高的的相似性,極端情況下,a和b向量完全重合。如下圖 如上圖二 可以認...
使用余弦相似度演算法計算文字相似度
在求相似度的時候經常會有以下一些方法,1.基於詞向量 2.基於字元的 3.基於概率統計的 4.基於詞嵌入模型的 在求文字相似度的時候經常會使用余弦相似度來求,下面來記錄一下余弦相似度的原理。余弦相似度量 計算個體間的相似度。相似度越小,距離越大。相似度越大,距離越小。假設有3個物品,item1,it...
利用余弦相似度做文字分類
利用余弦相似度做文字分類 在數學中余弦相似度的公式 cos a,b a b a b 而在文字上,我們的余弦相似度通常是這樣計算而成 文字a,b 共同出現的詞條數目 文字a 出現的詞條數目 文字b出現的詞條數目 處理兩個純文字的相似度可以這樣處理,但對於文字分類來說,我們更多使用的是 訓練集 與 測試...