Android Java实现余弦匹配算法示例代码

网友投稿 224 2023-06-27


Android Java实现余弦匹配算法示例代码

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 vectorSpace = new HashMap();

int[] itemCountArray = null;//为了避免频繁产生局部变量,所以将itemCountArray声明在此

//以空格为分隔符,分解字符串

String strArray[] = str1.split(" ");

for(int i=0; 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);

}

}

WRUISFM strArray = str2.split(" ");

for(int i=0; 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));

}

}

效果:

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

{

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);

}

}

WRUISFM strArray = str2.split(" ");

for(int i=0; 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));

}

}

效果:

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

{

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));

}

}

效果:

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:微信小程序 欢迎界面开发的实例详解
下一篇:Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException
相关文章

 发表评论

暂时没有评论,来抢沙发吧~