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算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • Java实现双色球抽奖随机算法示例

    第一次写技术博客,写一下以前写的一个双色球抽奖随机算法. 原理如下: 1首先初始化一个待抽奖的数组nums,数组的长度k 2. 随机一个1-k之间的随机数,得到nums[k],这样得到第一个抽奖号,nums中剔除该号码,k--. 3. 重复步骤2,直到得到全部中奖号码 class myLuck { private int mTarget; List<Integer> mNums = new ArrayList<Integer>(); //摇奖池 ///从多少个数中产生多少个数 //

  • Java 蒙特卡洛算法求圆周率近似值实例详解

    起源 [1946: John von Neumann, Stan Ulam, and Nick Metropolis, all at the Los Alamos Scientific Laboratory, cook up the Metropolis algorithm, also known as the Monte Carlo method.]1946年,美国拉斯阿莫斯国家实验室的三位科学家John von Neumann,Stan Ulam 和 Nick Metropolis共同发明,

  • Java编程实现逆波兰表达式代码示例

    逆波兰表达式 定义:传统的四则运算被称作是中缀表达式,即运算符实在两个运算对象之间的.逆波兰表达式被称作是后缀表达式,表达式实在运算对象的后面. 逆波兰表达式: a+b ---> a,b,+ a+(b-c) ---> a,b,c,-,+ a+(b-c)*d ---> a,b,c,-,d,*,+ a+d*(b-c)--->a,d,b,c,-,*,+ a=1+3 ---> a=1,3 + http=(smtp+http+telnet)/1024 写成什么呢? http=smtp,

  • java实现的RC4加密解密算法示例

    本文实例讲述了java实现的RC4加密解密算法.分享给大家供大家参考,具体如下: 有一个项目,需要解析一个用户提供的rc4加密后的文件,特意搜索整理了一个Java 版本的RC4加解密算法. public static String HloveyRC4(String aInput,String aKey) { int[] iS = new int[256]; byte[] iK = new byte[256]; for (int i=0;i<256;i++) iS[i]=i; int j = 1;

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

    本文实例讲述了Java基于余弦方法实现的计算相似度算法.分享给大家供大家参考,具体如下: (1)余弦相似性 通过测量两个向量之间的角的余弦值来度量它们之间的相似性.0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1.从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向.所以,它通常用于文件比较. 相关介绍可参考百度百科:余弦相似性 (2)算法实现的中未使用权重(IDF ---逆文档频率),使用词项的出现次数作为向量空间的值. import java.util.H

  • Java基于循环递归回溯实现八皇后问题算法示例

    本文实例讲述了Java基于循环递归回溯实现八皇后问题.分享给大家供大家参考,具体如下: 运行效果图如下: 棋盘接口 /** * 棋盘接口 * @author Administrator * */ public interface Piece { abstract boolean isRow(int line); abstract boolean isCol(int line,int col); } 棋盘类: /** * 棋盘 * @author Administrator * */ public

  • Java遍历集合方法分析(实现原理、算法性能、适用场合)

    概述 Java语言中,提供了一套数据集合框架,其中定义了一些诸如List.Set等抽象数据类型,每个抽象数据类型的各个具体实现,底层又采用了不同的实现方式,比如ArrayList和LinkedList. 除此之外,Java对于数据集合的遍历,也提供了几种不同的方式.开发人员必须要清楚的明白每一种遍历方式的特点.适用场合.以及在不同底层实现上的表现.下面就详细分析一下这一块内容. 数据元素是怎样在内存中存放的? 数据元素在内存中,主要有2种存储方式: 1.顺序存储,Random Access(Di

  • Java基于解释器模式实现定义一种简单的语言功能示例

    本文实例讲述了Java基于解释器模式实现定义一种简单的语言功能.分享给大家供大家参考,具体如下: 一 模式定义 解释器模式:就是给定一个语言的文法表示,并且定义一个解释器,用来解释语言中的句子.解释器模式描述了怎样在有了一个简单的文法后,使用模式设计解释这些语句. 二 模式举例 1 模式分析 我们自己设计一种语言来说明这一模式 (1)该语言区分大小写 (2)该语言以PROGRAM开头,END结尾 (3)PRINTLN表示打印一行并换行 (4)使用FOR-FROM-TO-END表示循环 示例语言内

  • PHP数据分析引擎计算余弦相似度算法示例

    本文实例讲述了PHP数据分析引擎计算余弦相似度算法.分享给大家供大家参考,具体如下: 关于余弦相似度的相关介绍可参考百度百科:余弦相似度 <?php /** * 数据分析引擎 * 分析向量的元素 必须和基准向量的元素一致,取最大个数,分析向量不足元素以0填补. * 求出分析向量与基准向量的余弦值 * @author yu.guo@okhqb.com */ /** * 获得向量的模 * @param unknown_type $array 传入分析数据的基准点的N维向量.|eg:array(1,1

  • JavaScript基于对象方法实现数组去重及排序操作示例

    本文实例讲述了JavaScript基于对象方法实现数组去重及排序操作.分享给大家供大家参考,具体如下: <script> //用对象方法实现数组去重 Array.prototype.unique = function() { var newArr = []; for (var i = 0; i < this.length; i++) { if(newArr.indexOf(this[i]) == -1){ newArr.push(this[i]); } } return newArr;

  • Java基于迭代器模式实现的访问人员列表操作示例

    本文实例讲述了Java基于迭代器模式实现的访问人员列表操作.分享给大家供大家参考,具体如下: 一 模式定义 迭代器模式,提供了一种模式顺序访问一个集合对象中各个元素的功能,而又不暴露其内部的表示. 二 模式举例 1 模式分析 我们借用访问人员列表这一案例来说明这一模式. 2 迭代器模式静态类图 3 代码示例 3.1 人员信息接口--IPerson package com.demo.person; /** * 人员信息 * * @author * */ public interface IPers

  • Java实现二叉树的深度优先遍历和广度优先遍历算法示例

    本文实例讲述了Java实现二叉树的深度优先遍历和广度优先遍历算法.分享给大家供大家参考,具体如下: 1. 分析 二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列. 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次.要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历.中序遍历.后序遍历.具体说明如下: 先序遍历:对任一子树,先访问根,然后遍历其左子树,最后遍历其右子树. 中序遍历:对任一子树,先遍历其左子树,然

  • Java求10到100000之间的水仙花数算法示例

    本文实例讲述了Java求10到100000之间的水仙花数算法.分享给大家供大家参考,具体如下: 水仙花数: 概念:水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身.(例如:1^3 + 5^3+ 3^3 = 153) 算法思路分析:这个算法我们分两个步骤来进行:第一:我们做一个求一个数的位数的函数:第二:我们通过调用此函数来进行10到100000之间素数的计算! 下面给出具体的代码(仅供参考): package javastudy; public class

  • Python基于pycrypto实现的AES加密和解密算法示例

    本文实例讲述了Python基于pycrypto实现的AES加密和解密算法.分享给大家供大家参考,具体如下: 一 代码 # -*- coding: UTF-8 -*- import string import random from Crypto.Cipher import AES def keyGenerater(length): '''''生成指定长度的秘钥''' if length not in (16, 24, 32): return None x = string.ascii_lette

随机推荐