文字相似度的設計與實現

2021-07-26 07:29:50 字數 3857 閱讀 2129

摘要:本文主要設計並實現了乙個文字相似度系統,該系統主要功能計算文件之間的相似度,通過使用向量空間模型(vsm,vector space model)及余弦相似度計算公式計算文件之間的相似度,資料預處理過程中加入word2vec模型進行語義擴充,從而能夠匹配到更多相關文件。

向量空間模型(vsm, vector spacemodel)由salton等人於20世紀70年代年提出[1,2]。向量空間模型的主要思想是將文字內容的處理簡化為向量空間中的向量運算,這樣將空間上的相似度轉化為語義上的相似度。當文件被表示為文件空間的向量時,便可通過計算向量之間的相似性來度量文件間的相似性。文字處理中最常用的相似性度量方式是余弦距離。

向量空間模型的基本思想:

給定一篇文件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年發布的一款基於深度學習的開源工具包,主要用於將單詞以向量形式表示[3]。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 listreaddic(string path)

}br.close();

br.close();

} catch (exception e)

return list; }

}

public class stringhandler 

} catch (ioexception e)

return list;

}/**

* input:arr

* 使用word2vec將字元陣列內容擴充

*/public listextendword(word2vec w, listlist)

while(iter.hasnext())

}} return templist;

}/**

* input:list,stopwordspath

* 刪除停用詞,通過讀取stopwordspath中的停用詞表,將list中的停用詞刪除,並返回去除停用詞後的list

*/public listdeletestopwords(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]salton g, lesk m e. computer evaluation of indexing and text processing[j].journal of the acm, 1968, 15(1):8-36.

[2]salton. the smart retrieval system—experiments in automatic documentprocessing[c]// prentice-hall, inc upper saddle river. prentice-hall, inc.1971.

文字相似度

這種相似度計算方式相對簡單,原理也易於理解,就是計算單詞集合之間的交集和並集大小的比例,該值越大,表示兩個文字越相似。在涉及到大規模平行計算時,該方法效率上有一定的優勢。jaccard 相似度公式 舉例 句子a 我喜歡看電視,不喜歡看電影。句子b 我不喜歡看電視,也不喜歡看電影。分詞去噪後 a 我,...

余弦相似度 高維資料 文字相似度的設計與實現

摘要 本文主要設計並實現了乙個文字相似度系統,該系統主要功能計算文件之間的相似度,通過使用向量空間模型 vsm,vector space model 及余弦相似度計算公式計算文件之間的相似度,資料預處理過程中加入word2vec模型進行語義擴充,從而能夠匹配到更多相關文件。向量空間模型 vsm,ve...

文字相似度 自己實現文字相似度演算法(餘弦定理)

最近由於工作專案,需要判斷兩個txt文字是否相似,於是開始在網上找資料研究,因為在程式中會把文字轉換成string再做比較,所以最開始找到了這篇關於 距離編輯演算法 blog寫的非常好,受益匪淺。於是我決定把它用到專案中,來判斷兩個文字的相似度。但後來實際操作發現有一些問題 直接說就是查詢一本書中的...