Java基于余弦方法实现的计算相似度算法示例
作者:damotiansheng 发布时间:2022-06-29 22:02:13
标签: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<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程序设计有所帮助。


猜你喜欢
- 先看看代码再说:package com.b510.note; import java.math.BigInteger;
- 本文实例为大家分享了java动态导出excel压缩成zip下载的具体代码,供大家参考,具体内容如下package pack.java.io.
- Maven 组件界面介绍 如上图标注 1 所示,为常用的 Maven 工具栏,其中最常用的有:第一个按钮:Reimport All
- 在Activity类的子类中直接复写下面三个方法://复写onCreateOptionsMenu()方法,弹出菜单栏
- java 工厂模式的实例详解工厂方法中的“工厂”和我们平常理解的一样:用于生产产品。而客户是要和产品打交道,所以工厂方法模式的意义在于把客户
- java 根据经纬度获取地址实现代码实现代码:public class GetLocation { public
- 方式一:if语句控制// 例如:Column( mainAxisAlig
- 实现闹钟运行的效果如下: 通知栏的运行后效果图如下:布局文件(activity_main.xml)<?xml version
- 问题描述在使用 Matisse 与 glide 4.0.0 以及 4.0.0 之后的版本过程中,发现通过Matisse 的 wiki 代码调
- 有了前几篇的基础,相信大家对于Struts2已经有了一个很不错的认识,本篇我将为大家介绍一些关于Action接收参数的三种形式,以及简单的表
- 简介说明本文介绍Spring如何控制Bean注入的顺序。首先需要说明的是:在Bean上加@Order(xxx)是无法控制bean注入的顺序的
- 本文实例为大家分享了ManualResetEvent的使用方法,供大家参考,具体内容如下1. 源码下载:下载地址:ManualResetEv
- 日期格式处理在控制器中使用对象接收数据前端:<form action="test/add" method=&quo
- 首先,类只能使用public修饰是一个伪命题,应该说我们只见到过使用public修饰的类,还有一些类没有访问修饰符,此时访问权限为defau
- 1. 什么是AOPAOP (Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期 * 实现在
- 在Java移动文件夹及其所有子文件与子文件夹可以有如下的一段简单的方法来说明:public static void moveFolder(S
- C#字符串提取数值(带小数点)string input = "树2草45210.2m2";if (GetInputUti
- Plugins摘一段来自MyBatis官方文档的文字。MyBatis允许你在某一点拦截已映射语句执行的调用。默认情况下,MyBatis允许使
- Kotlin JSON解析开发环境就是下面这个…一、添加依赖在build.gradle.kts文件中添加下面依赖。de
- 本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下首先来看一下我们要做成的而效果:主页面要显示一个view