Java基于余弦方法实现的计算相似度算法示例

网友投稿 540 2023-04-22


Java基于余弦方法实现的计算相似度算法示例

本文实例讲述了java基于余弦方法实现的计算相似度算法。分享给大家供大家参考,具体如下:

(1)余弦相似性

通过测量两个向量之间的角的余弦值来度量它们之间的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。所以,它通常用于文件比较。

相关介绍可参考百度百科:余弦相似性

(2)算法实现的中未使用权重(IDF ---逆文档频率),使用词项的出现次数作为向量空间的值。

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

public class SimilarDegreeByCos

{

/*

* 计算两个字符串(英文字符)的相似度,简单的余弦计算,未添权重

*/

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

}

}

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

}

vector1http://Modulo = 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算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

{

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

{

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

}

vector1http://Modulo = 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算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

{

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

}

vector1http://Modulo = 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算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。


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

上一篇:微信小程序movable view移动图片和双指缩放实例代码
下一篇:系统平台对接接口设计(系统对接技术)
相关文章

 发表评论

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