今天写了下余弦相似度计算的算法,之前在学校做项目的时候使用到了,一直没去整理。
所谓的字符串余弦相似度,就是把每个字符串比作一个向量,通过计算向量余弦值来判断字符串的相似程度,余弦值越接近1,说明两个字符串的相似度就越高,余弦值的计算公式为:(向量a*向量b)/(向量a的模*向量b的模)
实现如下:
package demo.similarity; import java.util.HashMap; import java.util.Map; public class Utils { public static double calculateSimilarity(String source, String dest){ //用map存放词在字符串中所出现的次数,key为词,value为整型数组 Map<String, int[]> wordAppearTimes = new HashMap<String, int[]>(); //这里是按照单个字来进行分割,假如在这里做一次分词,效果会更好点,但是复杂度也会高些 //生成source字符串的向量 int sourceLen = source.length(); for(int i=0; i<sourceLen; ++i){ if(wordAppearTimes.containsKey(source.charAt(i)+"")){ ++(wordAppearTimes.get(source.charAt(i)+"")[0]); }else{ int[] appearTimes = new int[2]; appearTimes[0] = 1; appearTimes[1] = 0; wordAppearTimes.put(source.charAt(i)+"", appearTimes); } } //生成dest字符串的向量 int destLen = dest.length(); for(int i=0; i<destLen; ++i){ if(wordAppearTimes.containsKey(dest.charAt(i)+"")){ ++(wordAppearTimes.get(dest.charAt(i)+"")[1]); }else{ int[] appearTimes = new int[2]; appearTimes[0] = 0; appearTimes[1] = 1; wordAppearTimes.put(dest.charAt(i)+"", appearTimes); } } //向量source的模 double sourceModel = 0.00; //向量dest的模 double destModel = 0.00; //向量积 double crossProduct = 0.00; for(Map.Entry<String, int[]> entry : wordAppearTimes.entrySet()){ sourceModel += entry.getValue()[0] * entry.getValue()[0]; destModel += entry.getValue()[1] * entry.getValue()[1]; crossProduct += entry.getValue()[0] * entry.getValue()[1]; } sourceModel = Math.sqrt(sourceModel); destModel = Math.sqrt(destModel); double similarity = crossProduct / (sourceModel * destModel); return similarity; } public static void main(String[] args) { String s1 = "代码整洁之道"; String s2 = "代码整洁之道"; System.out.println(calculateSimilarity(s1,s2)); } }
输出为:
1.000000000000000
虽然这样能计算两个字符串的相似度,但是也存在一些缺陷:
1.按照上面的方法计算相似度,代码并没有按照词出现的顺序计算,比如我把上面的“代码整洁之道”改为“代码之道整洁”,结果还会是一样的
2.在实际应用中,按照单字来计算余弦相似度也是比较少的,除非系统对相似度计算得要求不高;对字符串加入分词,效果会更好一些
相关推荐
余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值, 来评估他们的相似度。 余弦相似度将向量根据坐标值,绘制到向量空间中,如常见的二维空间。 余弦相似度衡量的是2个向量间的夹角大小,通过夹角的...
Python3 实现的文章余弦相似度计算
(python)使用余弦相似度算法计算两个文本的相似度的简单实现
文档所给的是余弦相似度计算代码,在文本分类中用来计算相似度值,以此对文本分类
余弦相似度算法
用2.7版本Python实现比较2个文档的相似度计算,采用余弦相似度方法,main函数中的fileName1和fileName2是自己构造的数据集,把这几个文档放在一起就可以运行。
余弦相似度算法
NULL 博文链接:https://deepfuture.iteye.com/blog/1583934
Java 实现推荐系统 两个字符串 余弦相似度 算法。
衡量两个向量x、y的相关性(夹角的余弦) MATLAB 代码 ,余弦相似度也被⼀些迁移学习研究所使用。
余弦相似度计算matlab代码计算余弦相似度 张伯超 该脚本将从免疫数据库中读取数据并计算不同特征样本之间的余弦相似度。 用法 -d name of database -s name of subject -f field of the columns used to separate ...
用余弦相似度算法写的c++程序,计算如“我 爱 看 电视”和“我 不 爱 看 电影”之间的余弦相似度。由于没有分词程序,所以需要用空格手动分词
Matlab余弦相似度算法判断图片相似度并识别源代码 Matlab 余弦相似度 图像匹配 可直接运行 Matlab余弦相似度算法判断图片相似度并识别源代码 Matlab 余弦相似度 图像匹配 可直接运行
5.余弦相似度 1.解决问题:通过测量两个向量的夹角的余弦值来度量他们之间的相似性 2.取值:取值在[-1,1]之间 3.说明:两个向量的夹角的余弦值确定两个向
主要介绍了Java基于余弦方法实现的计算相似度算法,简单说明了余弦相似性的概念、原理并结合实例形式分析了java实现余弦相似性算法的相关操作技巧,需要的朋友可以参考下
使用Java 语言,实现了皮尔森和余弦相似度公式,供大家参考。
余弦相似度算法
先将概念间可能存在的候选层次关系罗列出来,构建词性序列语义余弦相似度和关系词语余弦相似度混合的核函数分类器,将概念间层次关系的挖掘问题转换为分类问题;再通过对文本数据进行模板标注来训练分类器;最后输入...
计算词向量间的余弦相似度,用于语义文本挖掘 。