今天写了下余弦相似度计算的算法,之前在学校做项目的时候使用到了,一直没去整理。
所谓的字符串余弦相似度,就是把每个字符串比作一个向量,通过计算向量余弦值来判断字符串的相似程度,余弦值越接近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个向量间的夹角大小,通过夹角的...
### 余弦相似度计算代码解析 #### 一、引言 余弦相似度是一种用于衡量两个非零向量之间角度的度量方法,广泛应用于信息检索、文本挖掘、推荐系统等领域。它通过计算两个向量之间的夹角余弦值来评估它们之间的相似...
在Python编程环境中,余弦相似度算法是一种常用于计算文本相似度的方法,尤其适用于文档向量化处理后的场景。本文将详细介绍如何使用Python实现余弦相似度,并探讨其背后的概念、步骤以及具体源码分析。 余弦相似度...
在机器学习领域,余弦相似度是一种常用的度量两个非零向量之间角度的方法,它在计算图片相似性时有着广泛的应用。通过比较图片特征向量之间的夹角余弦值,我们可以判断图片内容的相似程度。这篇博文链接()可能详细...
余弦相似度算法计算方法 余弦相似度算法是机器学习和数据挖掘中常用的相似度计算方法之一,用于衡量两个向量之间的相似程度。该算法基于向量空间模型,通过计算向量之间的夹角余弦来评估相似度。 余弦相似度算法的...
衡量两个向量x、y的相关性(夹角的余弦) MATLAB 代码 ,余弦相似度也被⼀些迁移学习研究所使用。
本文将详细介绍如何使用Python3实现文章的余弦相似度计算。 余弦相似度是通过计算两个非零向量在多维空间中的夹角余弦值来评估它们之间的相似程度。在文本分析中,向量可以表示为每个词在文集中出现的频率,即词频...
余弦相似度可以通过下面的公式计算: \[ \text{cosine similarity} = \frac{\mathbf{A} \cdot \mathbf{B}}{\|\mathbf{A}\| \|\mathbf{B}\|} \] 其中,\(\mathbf{A}\) 和 \(\mathbf{B}\) 是两个向量,\(\cdot\) 表示...
余弦相似度算法
3. **计算余弦相似度**:使用下面的公式计算两个向量之间的余弦相似度: \[ \text{similarity} = \cos(\theta) = \frac{\mathbf{A} \cdot \mathbf{B}}{\|\mathbf{A}\| \|\mathbf{B}\|} \] 其中,`·`表示向量点乘...
余弦相似度是通过计算这两个向量的夹角余弦值来衡量它们的相似性。余弦值范围在-1到1之间,1表示完全相同,-1表示完全不同,0表示两个向量正交,即它们在概念上不相关。 在C++中实现余弦相似度,首先需要对输入的...
余弦相似度是一种用于计算两个非零向量之间角度的余弦值,以此来衡量两个个体间的相似度。具体来说,在本例中,我们将每个字符串视为一个向量空间中的向量,每个字符出现的次数作为该字符在向量中的分量。具体步骤...
,b ” ,b 则两张图片的余弦相似度计算公式为: ∑ n:- 01akbk / (∑ n:- 01akak ∑ n:- 01bk bk) 可见,余弦相似度计算的是两向量在高维度空间中的夹角余弦值。夹角越小,余弦相似度越大:角度越大,余弦相似度...
这个“cos.zip_-baijiahao_python 实现计算余弦相似度_text similarity_travel5we_相似”文件包显然是一个Python实现的工具,用于计算文本之间的余弦相似度,特别是与旅行相关的文本数据,比如“travel5we”。...
余弦相似度计算matlab代码计算余弦相似度 张伯超 该脚本将从免疫数据库中读取数据并计算不同特征样本之间的余弦相似度。 用法 -d name of database -s name of subject -f field of the columns used to separate ...
余弦相似度则是通过计算两个向量的夹角余弦来度量它们的相似度,值域在-1到1之间,1表示完全相同,-1表示完全不同。 首先,我们需要了解如何构建VSM。对于每个文档,我们提取其关键词,如在`doc1.txt`和`doc2.txt`...
余弦相似度是计算两个非零向量夹角余弦的一种方法,被广泛应用于文本相似度计算。在文本处理中,每个文档可以被视为一个向量,其维度对应词汇表中的每个词,向量的每个分量是该词的TF-IDF值。两篇文章的余弦相似度...
Matlab余弦相似度算法判断图片相似度并识别源代码 Matlab 余弦相似度 图像匹配 可直接运行 Matlab余弦相似度算法判断图片相似度并识别源代码 Matlab 余弦相似度 图像匹配 可直接运行