余弦相似度基本思路是:如果这两句话的用词越相似,它们的内容就应该越相似。因此,可以从词频入手,计算它们的相似程度。
第一步,预处理主要是进行中文分词和去停用词,分词。
第二步,列出所有的词。
第三步,计算词频。
第四步,写出词频向量。
余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性"。
余弦相似度缺陷
这类算法没有很好地解决文本数据中存在的自然语言问题,即同义词和多义词。这样对于搜索的精度产生很大的影响。
衡量文本相似度的几种手段:
(1)最长公共子串(基于词条空间)
(2)最长公共子序列(基于权值空间、词条空间)
(3)最少编辑距离法(基于词条空间)
(4)汉明距离(基于权值空间)
(5)余弦值(基于权值空间)
向量空间余弦相似度(Cosine Similarity)
余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性"。
上图两个向量a,b的夹角很小可以说a向量和b向量有很高的的相似性,极端情况下,a和b向量完全重合。如下图:
如上图二:可以认为a和b向量是相等的,也即a,b向量代表的文本是完全相似的,或者说是相等的。如果a和b向量夹角较大,或者反方向。如下图
如上图三: 两个向量a,b的夹角很大可以说a向量和b向量有很底的的相似性,或者说a和b向量代表的文本基本不相似。那么是否可以用两个向量的夹角大小的函数值来计算个体的相似度呢?
向量空间余弦相似度理论就是基于上述来计算个体相似度的一种方法。下面做详细的推理过程分析。
想到余弦公式,最基本计算方法就是初中的最简单的计算公式,计算夹角
图(4)
的余弦定值公式为:
但是这个是只适用于直角三角形的,而在非直角三角形中,余弦定理的公式是
图(5)
三角形中边a和b的夹角 的余弦计算公式为:
公式(2)
在向量表示的三角形中,假设a向量是(x1, y1),b向量是(x2, y2),那么可以将余弦定理改写成下面的形式:
图(6)
向量a和向量b的夹角 的余弦计算如下
扩展,如果向量a和b不是二维而是n维,上述余弦的计算法仍然正确。假定a和b是两个n维向量,a是 ,b是 ,则a与b的夹角 的余弦等于:
余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,夹角等于0,即两个向量相等,这就叫"余弦相似性"。
二、余弦相似度代码如下:
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* 字符串相似性匹配算法
*/
public class CosDemo {
//数据结构解析:<单词,二维数组>,其中单词表示公共词,
// 二维数组一维度表示句子一的向量,另一维度表示句子二的向量
Map<Character, int[]> vectorMap = new HashMap<Character, int[]>();
int[] tempArray = null;
public CosDemo(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);
}
}
for (Map.Entry<Character, int[]> entry : vectorMap.entrySet()) {
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()[0] +","+entry.getValue()[1]);
}
}
// 求余弦相似度
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 = "我喜欢吃北京烤鸭";
//第一步,预处理主要是进行中文分词和去停用词,分词。
//第二步,列出所有的词。
//公共词 :我爱北京甜安门喜欢吃烤鸭
//第三步,计算词频,写出词频向量。
//向量1:<1,1,1,1,1,1,1,0,0,0,0,0>
//向量2:<1,0,1,1,0,0,0,1,1,1,1,1>
// 3/6 > cos =3/根号42 > 3/7即结果在3/6和3/7之间
CosDemo similarity = new CosDemo(s1, s2);
System.out.println(similarity.sim());
}
}
相关推荐
Java基于协同过滤算法的电影推荐系统源代码,利用修正的余弦相似度算法做影片推荐
JAVA查重算法,包括HanLP 相似度比较、二叉树、DFA算法实现、敏感词处理工具、IKAnalyzer中文分词工具、分词进行敏感词过滤等查重算法,可以计算海明距离、余弦相似性、莱文斯坦距离、Jaccard 相似度、Sorensen Dice...
余弦相似度Tf-Idf ##概述这是Java中的简单代码,它接收一组文档,并根据其单词的Tf-Idf权重计算其中两个文档之间的余弦相似度。
基于Lucene3.5版本、TF-IDF、余弦相似实现的文本相似度算法。 详细介绍《》 样本库提取 使用webmagic爬取华为应用市场应用的描述信息,当做样本。 在工程的conf/doc目录有1000多个应用样本。 具体代码实现在工程下面...
用户协同过滤算法的核心思想在于根据用户评分矩阵计算用户余弦相似度,然后推荐相似用户喜欢的商品;物品协同过滤算法也是根据用户的订单记录构建了用户物品矩阵,通过jaccard系数计算物品相似度,具体实现可以参考...
跳过思考余弦相似度 嵌入平均余弦相似度 向量极值余弦相似度 贪婪匹配分数 建立 安装Java 1.8.0(或更高版本)。 然后运行: # Install the Python dependencies. pip install git+...
总体上利用了余弦相似度计算的原理来计算文本相似度 其中的特征向量由训练数据集中的关键词构成,其中词语的寻找利用了中科大的ICTCLAS分词系统来做,提取其中的专业性的名词 利特征向量与标准向量进行余弦值的计算 ...
采用的是Lucene工具包来进行实现的,同时还进行了余弦相似度的检测以及K-Means聚类分析,本报告是比较详细的给出了设计与实现步骤以及源代码。 如果需要具体的项目文件以及数据的请加QQ:404125822,
指标 BLEU METEOR ROUGE CIDEr SkipThought 余弦相似度 嵌入 平均余弦相似度 向量极值余弦相似度 贪婪匹配分数设置 安装 Java 1.8.0(或更高版本)。 然后运行: # 安装 Python 依赖项。 pip install git+...
在本项目中采用的是基于用户的协同过滤的推荐算法来实现商品的推荐并在前台页面进行展示,我将会使用余弦相似度的度量方法来计算用户与用户之间相似性,最终将相似度较高的用户浏览的商品推荐给用户。 项目目标 商品...
基于知识图谱的教务问答系统python源码+项目说明+详细注释.zip <项目介绍> 该资源内项目源码是个人的毕设,代码...使用gensim进行word2vec的训练,然后基于余弦相似度计算句子之间的相似度,句子向量等于字符向量求平均
用户协同过滤算法的核心思想在于根据用户评分矩阵计算用户余弦相似度,然后推荐相似用户喜欢的商品;物品协同过滤算法也是根据用户的订单记录构建了用户物品矩阵,通过jaccard系数计算物品相似度,具体实现可以参考...
用户协同过滤算法的核心思想在于根据用户评分矩阵计算用户余弦相似度,然后推荐相似用户喜欢的商品;物品协同过滤算法也是根据用户的订单记录构建了用户物品矩阵,通过jaccard系数计算物品相似度,具体实现可以参考...
用户协同过滤算法的核心思想在于根据用户评分矩阵计算用户余弦相似度,然后推荐相似用户喜欢的商品;物品协同过滤算法也是根据用户的订单记录构建了用户物品矩阵,通过jaccard系数计算物品相似度,具体实现可以参考...
用户协同过滤算法的核心思想在于根据用户评分矩阵计算用户余弦相似度,然后推荐相似用户喜欢的商品;物品协同过滤算法也是根据用户的订单记录构建了用户物品矩阵,通过jaccard系数计算物品相似度,具体实现可以参考...
用户协同过滤算法的核心思想在于根据用户评分矩阵计算用户余弦相似度,然后推荐相似用户喜欢的商品;物品协同过滤算法也是根据用户的订单记录构建了用户物品矩阵,通过jaccard系数计算物品相似度,具体实现可以参考...
该APP可以使用3轴加速器和余弦相似度算法识别多达10个已经记录的手势。 希望这些代码对其他人有帮助。 这个怎么运作 首先,您应该按照此应用的说明记录手势。 包括输入手势的id,多次执行相同的手势,以便APP可以...
该项目基于使用 lucene 索引实现的术语向量和查询向量之间的余弦相似度。 我在这里遵循的方法是一种监督学习。 我根据不同的情绪预定义了课程。 一旦查询与类匹配,代码就会重定向到完全不同的方面。 另一方面是...
算法思想:随机在给定的图像中产生多个矩形区域,比较矩形区域内图像相似度,相似度高,则表明黑屏,否则就正常。 PS:相似度用到了余弦值。
KNN算法实验报告 一 试验原理 K最近邻(k- NearestNeighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学 习算法之一。... 四 代码 //KNN.java package cqu.KNN; import java.util.ArrayList; impor