摘要
本文主要設計並實現了乙個文字相似度系統,該系統主要功能計算文件之間的相似度,通過使用向量空間模型(vsm,vector space model)及余弦相似度計算公式計算文件之間的相似度,資料預處理過程中加入word2vec模型進行語義擴充,從而能夠匹配到更多相關文件。
向量空間模型(vsm, vector space model)由salton等人於20世紀70年代年提出。向量空間模型的主要思想是將文字內容的處理簡化為向量空間中的向量運算,這樣將空間上的相似度轉化為語義上的相似度。當文件被表示為文件空間的向量時,便可通過計算向量之間的相似性來度量文件間的相似性。文字處理中最常用的相似性度量方式是余弦距離。
向量空間模型的基本思想:
給定一篇文件d=d(t1,t2,…ti,…,tn),若ti在文件中既可以重複出現又存在先後次序,因此分析起來會較為困難。針對上述情況,暫不考慮ti的順序,並要求ti互異,此時可將t1,t2,…ti,…,tn看作n維座標,每一維對應相應值wi,因此d(w1,w2,…,wi,…,wn)便可以看作乙個n維向量。
向量空間模型只是將文件轉換為方便計算的格式,若進行相似度計算,還需使用相似度計算公式進行計算。本文使用余弦相似度計算公式。
余弦相似度計算公式廣泛應用於文字資料之間的相似度計算過程中。其數學表達如下:
計算過程如下:
其基本思想為:將文件輸入系統,對文件進行資料預處理操作,資料預處理完成後使用向量空間模型將片語轉化為向量,之後使用余弦相似度計算公式求解文件之間的相似度,最終將計算後的結果展示出來。
資料預處理階段,包括分詞、取停用詞、word2vec語義擴充套件,其流程如下圖2所示:
在word2vec語義擴充套件階段,word2vec是google於2023年發布的一款基於深度學習的開源工具包,主要用於將單詞以向量形式表示。word2vec首先使用語料訓練模型,待模型訓練結束後,將新的單詞輸入模型進行**,模型可按相關度排序將最相近的**單詞展現給使用者,通常而言,會將top30展示給使用者。
針對文件語義擴充,系統會先使用搜狗新聞語料訓練cbow模型,待模型訓練結束後,將本檔中的單詞輸入cbow模型進行**,最終將**結果擴充回文件中,用於向量空間模型。
通過比較兩次的score值可得出,通過word2vec能夠提高文字相似度的計算分值。
其中n(diclist1)是所求文件中包含的句子個數,公式的主要思路即將每句話的最大匹配相似度疊加後求取平均值。
相應**如下:
/** * 程式執行入口 * @throws ioexception */ public static void main(string args) throws ioexception /** * 程式執行入口 * @throws ioexception */ public static void main(string args) throws ioexception
資料預處理階段如下:
public class filehandler else if (line.contains("。")) else if (line.contains(".")) else if (line.contains(";")) else int i,n; n = strarr.length; for(i = 0;i < n;i++) } } catch (exception e) return doclist; } /** * input:path * output:list * 讀取詞典資訊,以list返回詞典 */ public list readdic(string path) } br.close(); br.close(); } catch (exception e) return list; }}public class stringhandler } catch (ioexception e) return list; } /** * input:arr * 使用word2vec將字元陣列內容擴充 */ public list extendword(word2vec w, listlist) while(iter.hasnext()) } } return templist; } /** * input:list,stopwordspath * 刪除停用詞,通過讀取stopwordspath中的停用詞表,將list中的停用詞刪除,並返回去除停用詞後的list */ public list deletestopwords(listlist, string path2) } } catch (exception e) return temp; }}
模型計算階段如下:
public class model catch (ioexception e) if (temp > max) } similararr[i] = max; locarr[i] = loc; } tool.output(doclist1, doclist2, locarr, similararr); } /** * input:str1,str2 計算2個字串之間的相似度 */ public double getsimilar(string str1, string str2, word2vec w) throws ioexception } // 對str2處理 n = list2.size(); for (i = 0; i < n; ++i) } // 計算相似度 iter = vectorspace.entryset().iterator(); while (iter.hasnext()) vector1modulo = math.sqrt(vector1modulo); vector2modulo = math.sqrt(vector2modulo); // 返回相似度 ret = (vectorproduct / (vector1modulo * vector2modulo)); return ret; }}
使用余弦相似度計算文字相似度
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...
文字相似度 自己實現文字相似度演算法(餘弦定理)
最近由於工作專案,需要判斷兩個txt文字是否相似,於是開始在網上找資料研究,因為在程式中會把文字轉換成string再做比較,所以最開始找到了這篇關於 距離編輯演算法 blog寫的非常好,受益匪淺。於是我決定把它用到專案中,來判斷兩個文字的相似度。但後來實際操作發現有一些問題 直接說就是查詢一本書中的...