国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android Java實現余弦匹配算法示例代碼

2019-12-12 04:27:59
字體:
來源:轉載
供稿:網友

 Java實現余弦匹配算法

最近在做一個通訊交友的項目,項目中有一個這樣的需求,通過用戶的興趣愛好,為用戶尋找推薦興趣相近的好友。其實思路好簡單,把用戶的興趣愛好和其他用戶的興趣愛好進行一個匹配,當他們的愛好相似度比較高的時候就給雙方進行推薦。那么如何進行比較是一個問題,其實我們可以通過余弦匹配算法來對用戶的興趣愛好進行比較,根據計算出來的值來得到一個興趣愛好相近好友列表,并進行排序。

因為我做的項目是Android端的,所以算法是通過Java實現的,廢話不過多說了,下面是算法的實現:

package com;  import java.util.HashMap; import java.util.Iterator; import java.util.Map;  /**  * 余弦匹配算法  *  */ public class SimilarDegreeByCos {       /**    * 計算兩個字符串的相似度,簡單的余弦計算,未添權重     * @param str1    * @param str2    * @return 返回計算的相識度    */    public static double getSimilarDegree(String str1, String str2)     {      //創建向量空間模型,使用map實現,主鍵為詞項,值為長度為2的數組,存放著對應詞項在字符串中的出現次數       Map<String, int[]> vectorSpace = new HashMap<String, int[]>();       int[] itemCountArray = null;//為了避免頻繁產生局部變量,所以將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 = "陽光活潑 跑步 羽毛球";       String str2 = "愛美食 跑步 籃球 足球 冰棒球 騎馬 游泳";       String str3 = "90后 動漫 旅游 愛美女";       String str4 = "陽光活潑 愛游戲 愛代碼 碼農";       String str5 = "羽毛球 羽毛球 羽毛球 羽毛球";       String str6 = "陽光活潑 跑步 羽毛球";              System.out.println("str1和str2相識度:" + SimilarDegreeByCos.getSimilarDegree(str1, str2));       System.out.println("str1和str3相識度:" + SimilarDegreeByCos.getSimilarDegree(str1, str3));       System.out.println("str1和str4相識度:" + SimilarDegreeByCos.getSimilarDegree(str1, str4));       System.out.println("str1和str5相識度:" + SimilarDegreeByCos.getSimilarDegree(str1, str5));       System.out.println("str1和str6相識度:" + SimilarDegreeByCos.getSimilarDegree(str1, str6));     }   } 

效果:

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 松溪县| 台湾省| 桂阳县| 拉孜县| 东源县| 长白| 石门县| 安新县| 玉树县| 栾城县| 灵璧县| 临沂市| 皮山县| 永平县| 绵阳市| 武清区| 运城市| 巫山县| 咸丰县| 红桥区| 左贡县| 稷山县| 潞西市| 北流市| 轮台县| 马公市| 潼南县| 绵竹市| 巴林左旗| 赣榆县| 丰台区| 华安县| 绩溪县| 西平县| 河北省| 龙泉市| 陇南市| 汉沽区| 恩施市| 汾阳市| 大洼县|