本篇文章给大家分享的是有关如何在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<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 = "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项目中利用余弦方法实现一个相似度计算算法,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。