Java基于余弦方法實(shí)現(xiàn)的計(jì)算相似度算法示例
本文實(shí)例講述了Java基于余弦方法實(shí)現(xiàn)的計(jì)算相似度算法。分享給大家供大家參考,具體如下:
(1)余弦相似性
通過測(cè)量?jī)蓚€(gè)向量之間的角的余弦值來度量它們之間的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。從而兩個(gè)向量之間的角度的余弦值確定兩個(gè)向量是否大致指向相同的方向。所以,它通常用于文件比較。
相關(guān)介紹可參考百度百科:余弦相似性
(2)算法實(shí)現(xiàn)的中未使用權(quán)重(IDF ---逆文檔頻率),使用詞項(xiàng)的出現(xiàn)次數(shù)作為向量空間的值。
import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class SimilarDegreeByCos { /* * 計(jì)算兩個(gè)字符串(英文字符)的相似度,簡(jiǎn)單的余弦計(jì)算,未添權(quán)重 */ public static double getSimilarDegree(String str1, String str2) { //創(chuàng)建向量空間模型,使用map實(shí)現(xiàn),主鍵為詞項(xiàng),值為長(zhǎng)度為2的數(shù)組,存放著對(duì)應(yīng)詞項(xiàng)在字符串中的出現(xiàn)次數(shù) Map<String, int[]> vectorSpace = new HashMap<String, int[]>(); int[] itemCountArray = null;//為了避免頻繁產(chǎn)生局部變量,所以將itemCountArray聲明在此 //以空格為分隔符,分解字符串 String strArray[] = str1.split(" "); for(int i=0; i<strArray.length; ++i) { if(vectorSpace.containsKey(strArray[i])) ++(vectorSpace.get(strArray[i])[0]); else { itemCountArray = new int[2]; itemCountArray[0] = 1; itemCountArray[1] = 0; vectorSpace.put(strArray[i], itemCountArray); } } strArray = str2.split(" "); for(int i=0; i<strArray.length; ++i) { if(vectorSpace.containsKey(strArray[i])) ++(vectorSpace.get(strArray[i])[1]); else { itemCountArray = new int[2]; itemCountArray[0] = 0; itemCountArray[1] = 1; vectorSpace.put(strArray[i], itemCountArray); } } //計(jì)算相似度 double vector1Modulo = 0.00;//向量1的模 double vector2Modulo = 0.00;//向量2的模 double vectorProduct = 0.00; //向量積 Iterator iter = vectorSpace.entrySet().iterator(); while(iter.hasNext()) { Map.Entry entry = (Map.Entry)iter.next(); itemCountArray = (int[])entry.getValue(); vector1Modulo += itemCountArray[0]*itemCountArray[0]; vector2Modulo += itemCountArray[1]*itemCountArray[1]; vectorProduct += itemCountArray[0]*itemCountArray[1]; } vector1Modulo = Math.sqrt(vector1Modulo); vector2Modulo = Math.sqrt(vector2Modulo); //返回相似度 return (vectorProduct/(vector1Modulo*vector2Modulo)); } /* * */ public static void main(String args[]) { String str1 = "gold silver truck"; String str2 = "Shipment of gold damaged in a fire"; String str3 = "Delivery of silver arrived in a silver truck"; String str4 = "Shipment of gold arrived in a truck"; String str5 = "gold gold gold gold gold gold"; System.out.println(SimilarDegreeByCos.getSimilarDegree(str1, str2)); System.out.println(SimilarDegreeByCos.getSimilarDegree(str1, str3)); System.out.println(SimilarDegreeByCos.getSimilarDegree(str1, str4)); System.out.println(SimilarDegreeByCos.getSimilarDegree(str1, str5)); } }
更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
- Java數(shù)據(jù)結(jié)構(gòu)之稀疏矩陣定義與用法示例
- Android Java實(shí)現(xiàn)余弦匹配算法示例代碼
- JAVA實(shí)現(xiàn)基于皮爾遜相關(guān)系數(shù)的相似度詳解
- java字符串相似度算法
- Java實(shí)現(xiàn)的求逆矩陣算法示例
- java實(shí)現(xiàn)任意矩陣Strassen算法
- Java矩陣連乘問題(動(dòng)態(tài)規(guī)劃)算法實(shí)例分析
- Java實(shí)現(xiàn)輸出回環(huán)數(shù)(螺旋矩陣)的方法示例
- java實(shí)現(xiàn)的n*n矩陣求值及求逆矩陣算法示例
- Java編程實(shí)現(xiàn)鄰接矩陣表示稠密圖代碼示例
- Java實(shí)現(xiàn)的計(jì)算稀疏矩陣余弦相似度示例
相關(guān)文章
IntelliJ IDEA 2023.2正式發(fā)布新UI和Profiler轉(zhuǎn)正(最新推薦)
北京時(shí)間2023年7月26日,IntelliJ IDEA 2023.2正式發(fā)布,IntelliJ IDEA 2023.2 引入 AI Assistant(AI助手),通過一組由 AI 提供支持的功能助力開發(fā),今天給大家分享IntelliJ IDEA 2023.2正式發(fā)布新UI和Profiler轉(zhuǎn)正,感興趣的朋友一起看看吧2023-10-10JPA如何使用entityManager執(zhí)行SQL并指定返回類型
這篇文章主要介紹了JPA使用entityManager執(zhí)行SQL并指定返回類型的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Java實(shí)現(xiàn)動(dòng)態(tài)數(shù)字時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)動(dòng)態(tài)數(shù)字時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12Shell重啟SpringBoot項(xiàng)目腳本的示例代碼(含服務(wù)守護(hù))
本文介紹了如何使用?Bash?腳本來管理和守護(hù)運(yùn)行服務(wù),將展示一個(gè)示例腳本,該腳本可以停止、啟動(dòng)和守護(hù)運(yùn)行一個(gè)服務(wù),并提供了相應(yīng)的解釋和用法說明,文章通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11spring中實(shí)現(xiàn)容器加載完成后再執(zhí)行自己的方法
這篇文章主要介紹了spring中實(shí)現(xiàn)容器加載完成后再執(zhí)行自己的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02