本文实例讲述了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算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
# Java
# 余弦方法
# 计算
# 相似度
# 算法
# Java数据结构之稀疏矩阵定义与用法示例
# Android Java实现余弦匹配算法示例代码
# JAVA实现基于皮尔逊相关系数的相似度详解
# java字符串相似度算法
# Java实现的求逆矩阵算法示例
# java实现任意矩阵Strassen算法
# Java矩阵连乘问题(动态规划)算法实例分析
# Java实现输出回环数(螺旋矩阵)的方法示例
# java实现的n*n矩阵求值及求逆矩阵算法示例
# Java编程实现邻接矩阵表示稠密图代码示例
# Java实现的计算稀疏矩阵余弦相似度示例
# 操作技巧
# 都不
# 相关内容
# 在此
# 感兴趣
# 数据结构
# 英文
# 给大家
# 放着
# 更多关于
# 所述
# 为了避免
# 程序设计
# 值为
# 主键
# 长度为
# 最小值
# 中未
# 文档
# 分隔符
相关文章:
如何快速搭建二级域名独立网站?
如何解决VPS建站LNMP环境配置常见问题?
网站按钮制作软件,如何实现网页中按钮的自动点击?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
常州企业建站如何选择最佳模板?
网站制作公司排行榜,抖音怎样做个人官方网站
c++怎么用jemalloc c++替换默认内存分配器【性能】
建站之星后台管理系统如何操作?
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
寿县云建站:智能SEO优化与多行业模板快速上线指南
如何通过cPanel快速搭建网站?
建站之星如何配置系统实现高效建站?
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
如何基于PHP生成高效IDC网络公司建站源码?
网站制作模板下载什么软件,ppt模板免费下载网站?
宁波自助建站系统如何快速打造专业企业网站?
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
家庭服务器如何搭建个人网站?
建站主机如何选?性能与价格怎样平衡?
企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?
建站主机选哪种环境更利于SEO优化?
如何通过云梦建站系统实现SEO快速优化?
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
如何在万网自助建站中设置域名及备案?
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
如何在IIS7上新建站点并设置安全权限?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
如何通过虚拟机搭建网站?详细步骤解析
盐城做公司网站,江苏电子版退休证办理流程?
linux top下的 minerd 木马清除方法
云南网站制作公司有哪些,云南最好的招聘网站是哪个?
如何在云指建站中生成FTP站点?
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
*服务器网站为何频现安全漏洞?
建站之星代理平台如何选择最佳方案?
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
视频网站制作教程,怎么样制作优酷网的小视频?
官网建站费用明细查询_企业建站套餐价格及收费标准指南
股票网站制作软件,网上股票怎么开户?
如何快速搭建高效简练网站?
建站主机默认首页配置指南:核心功能与访问路径优化
小程序网站制作需要准备什么资料,如何制作小程序?
建站之星如何修改网站生成路径?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
西安专业网站制作公司有哪些,陕西省建行官方网站?
C++如何编写函数模板?(泛型编程入门)
*请认真填写需求信息,我们会在24小时内与您取得联系。