余弦相似度-java代码实现
2015-08-01 21:12
876 查看
package sim; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * 字符串相似性匹配算法 * Created by panther on 15-7-20. */ public class Similarity { Map<Character, int[]> vectorMap = new HashMap<Character, int[]>(); int[] tempArray = null; public Similarity(String string1, String string2) { for (Character character1 : string1.toCharArray()) { if (vectorMap.containsKey(character1)) { vectorMap.get(character1)[0]++; } else { tempArray = new int[2]; tempArray[0] = 1; tempArray[1] = 0; vectorMap.put(character1, tempArray); } } for (Character character2 : string2.toCharArray()) { if (vectorMap.containsKey(character2)) { vectorMap.get(character2)[1]++; } else { tempArray = new int[2]; tempArray[0] = 0; tempArray[1] = 1; vectorMap.put(character2, tempArray); } } } // 求余弦相似度 public double sim() { double result = 0; result = pointMulti(vectorMap) / sqrtMulti(vectorMap); return result; } private double sqrtMulti(Map<Character, int[]> paramMap) { double result = 0; result = squares(paramMap); result = Math.sqrt(result); return result; } // 求平方和 private double squares(Map<Character, int[]> paramMap) { double result1 = 0; double result2 = 0; Set<Character> keySet = paramMap.keySet(); for (Character character : keySet) { int temp[] = paramMap.get(character); result1 += (temp[0] * temp[0]); result2 += (temp[1] * temp[1]); } return result1 * result2; } // 点乘法 private double pointMulti(Map<Character, int[]> paramMap) { double result = 0; Set<Character> keySet = paramMap.keySet(); for (Character character : keySet) { int temp[] = paramMap.get(character); result += (temp[0] * temp[1]); } return result; } public static void main(String[] args) { String s1 = "我是一个帅哥"; String s2 = "帅哥是我"; Similarity similarity = new Similarity(s1, s2); System.out.println(similarity.sim()); } }
输出结果:
分析:
字符串s1中的内容是“我是一个帅哥”,这个字符串中对应的向量名称为<我,是,一,个,帅,哥>,这个字符串的值为<1,1,1,1,1,1>,字符串s2对应的值为<1,1,0,0,1,1>,向量s1点乘向量s2的结果为1*1+1*1+1*0+1*0+1*1+1*1 = 4,
向量s1的模为根号6,向量s2的模为2,所以相似度的结果为0.81
相关文章推荐
- Ubuntu Eclipse CDT 使用math数学函数库:对×××未定义的引用
- Struts2中操作JSON
- struts2注解实现页面的跳转
- myeclipse 方法上加上@Override就报错
- JAVA基础一大堆0801抽象类+内部类局部类+异常
- java基础第六讲——抽象类、接口、内部类、常用类、异常、IO流
- Ubuntu 14 安装jdk8,MySql的安装卸载等一些常用的命令
- spring MVC之返回JSON数据(Spring3.0 MVC+Jackson+AJAX)
- java基础--面向对象
- java笔试三
- java笔试二
- JAVA入门基础文章2-类的概念(继续深入点)
- java笔试一
- java学习异常,常用类,接口等
- eclipse新建android工程提示android.support.v7错误的解决办法
- java集合类总结
- Java和R齐头并进才是根本
- struts原理
- java高级编程-使用反射强制给private字段赋值
- 使用 Spring Data JPA 简化 JPA 开发