Java基于余弦方法實現(xiàn)的計算相似度算法示例
本文實例講述了Java基于余弦方法實現(xiàn)的計算相似度算法。分享給大家供大家參考,具體如下:
(1)余弦相似性
通過測量兩個向量之間的角的余弦值來度量它們之間的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。從而兩個向量之間的角度的余弦值確定兩個向量是否大致指向相同的方向。所以,它通常用于文件比較。
相關介紹可參考百度百科:余弦相似性
(2)算法實現(xiàn)的中未使用權重(IDF ---逆文檔頻率),使用詞項的出現(xiàn)次數(shù)作為向量空間的值。
import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class SimilarDegreeByCos { /* * 計算兩個字符串(英文字符)的相似度,簡單的余弦計算,未添權重 */ public static double getSimilarDegree(String str1, String str2) { //創(chuàng)建向量空間模型,使用map實現(xiàn),主鍵為詞項,值為長度為2的數(shù)組,存放著對應詞項在字符串中的出現(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); } } //計算相似度 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)); } }
更多關于java算法相關內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結構與算法教程》、《Java操作DOM節(jié)點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設計有所幫助。
- Java數(shù)據(jù)結構之稀疏矩陣定義與用法示例
- Android Java實現(xiàn)余弦匹配算法示例代碼
- JAVA實現(xiàn)基于皮爾遜相關系數(shù)的相似度詳解
- java字符串相似度算法
- Java實現(xiàn)的求逆矩陣算法示例
- java實現(xiàn)任意矩陣Strassen算法
- Java矩陣連乘問題(動態(tài)規(guī)劃)算法實例分析
- Java實現(xiàn)輸出回環(huán)數(shù)(螺旋矩陣)的方法示例
- java實現(xiàn)的n*n矩陣求值及求逆矩陣算法示例
- Java編程實現(xiàn)鄰接矩陣表示稠密圖代碼示例
- Java實現(xiàn)的計算稀疏矩陣余弦相似度示例
相關文章
IntelliJ IDEA 2023.2正式發(fā)布新UI和Profiler轉(zhuǎn)正(最新推薦)
北京時間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并指定返回類型的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06Shell重啟SpringBoot項目腳本的示例代碼(含服務守護)
本文介紹了如何使用?Bash?腳本來管理和守護運行服務,將展示一個示例腳本,該腳本可以停止、啟動和守護運行一個服務,并提供了相應的解釋和用法說明,文章通過代碼示例介紹的非常詳細,需要的朋友可以參考下2023-11-11spring中實現(xiàn)容器加載完成后再執(zhí)行自己的方法
這篇文章主要介紹了spring中實現(xiàn)容器加載完成后再執(zhí)行自己的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02