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

发布时间 - 2026-01-11 02:41:33    点击率:

本文实例讲述了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实现的计算稀疏矩阵余弦相似度示例  # 操作技巧  # 都不  # 相关内容  # 在此  # 感兴趣  # 数据结构  # 英文  # 给大家  # 放着  # 更多关于  # 所述  # 为了避免  # 程序设计  # 值为  # 主键  # 长度为  # 最小值  # 中未  # 文档  # 分隔符 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在云服务器上快速搭建个人网站?  长沙企业网站制作哪家好,长沙水业集团官方网站?  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  JavaScript如何实现音频处理_Web Audio API如何工作?  北京网站制作公司哪家好一点,北京租房网站有哪些?  如何在腾讯云服务器快速搭建个人网站?  如何在云指建站中生成FTP站点?  如何在IIS管理器中快速创建并配置网站?  如何选择可靠的免备案建站服务器?  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  深圳网站制作平台,深圳市做网站好的公司有哪些?  Python并发异常传播_错误处理解析【教程】  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  如何在Tomcat中配置并部署网站项目?  微信公众帐号开发教程之图文消息全攻略  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  如何快速建站并高效导出源代码?  Laravel如何使用Service Container和依赖注入?(代码示例)  Android 常见的图片加载框架详细介绍  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  大型企业网站制作流程,做网站需要注册公司吗?  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  简单实现Android验证码  php485函数参数是什么意思_php485各参数详细说明【介绍】  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  制作企业网站建设方案,怎样建设一个公司网站?  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  简历在线制作网站免费版,如何创建个人简历?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  Laravel怎么清理缓存_Laravel optimize clear命令详解  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  javascript中的try catch异常捕获机制用法分析  黑客如何通过漏洞一步步攻陷网站服务器?  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  Laravel怎么判断请求类型_Laravel Request isMethod用法  微信小程序 input输入框控件详解及实例(多种示例)  使用C语言编写圣诞表白程序  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】