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


相关推荐: WEB开发之注册页面验证码倒计时代码的实现  音乐网站服务器如何优化API响应速度?  BootStrap整体框架之基础布局组件  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  Python文件操作最佳实践_稳定性说明【指导】  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  googleplay官方入口在哪里_Google Play官方商店快速入口指南  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  javascript读取文本节点方法小结  大同网页,大同瑞慈医院官网?  太平洋网站制作公司,网络用语太平洋是什么意思?  Android自定义listview布局实现上拉加载下拉刷新功能  高端智能建站公司优选:品牌定制与SEO优化一站式服务  JavaScript如何操作视频_媒体API怎么控制播放  新三国志曹操传主线渭水交兵攻略  如何快速完成中国万网建站详细流程?  详解Android中Activity的四大启动模式实验简述  如何在不使用负向后查找的情况下匹配特定条件前的换行符  中山网站推广排名,中山信息港登录入口?  Laravel怎么为数据库表字段添加索引以优化查询  高端云建站费用究竟需要多少预算?  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  linux写shell需要注意的问题(必看)  Laravel如何使用查询构建器?(Query Builder高级用法)  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  Android中AutoCompleteTextView自动提示  Laravel如何与Pusher实现实时通信?(WebSocket示例)  javascript日期怎么处理_如何格式化输出  Laravel怎么使用Intervention Image库处理图片上传和缩放  Laravel如何生成URL和重定向?(路由助手函数)  Laravel中的Facade(门面)到底是什么原理  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  Laravel怎么调用外部API_Laravel Http Client客户端使用  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  *服务器网站为何频现安全漏洞?  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  如何在服务器上配置二级域名建站?  如何将凡科建站内容保存为本地文件?  如何安全更换建站之星模板并保留数据?  如何在云主机快速搭建网站站点?  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  Python文件异常处理策略_健壮性说明【指导】