余弦相似度

代码原文地址 https://blog.csdn.net/liu136313/article/details/47190231 为Java 现改为C# 方便以后使用

余弦相似度的灵感来自于数学中的余弦定理,这里对数学内容不做过多解释,直接上公式:

其中,A、B分别是文本一、文本二对应的n维向量,取值方式用语言比较难描述,直接看例子吧:
例2.5.1、文本一是“一个雨伞”,文本二是“下雨了开雨伞”,计算它们的余弦相似度。
它们的并集是{一,个,雨,伞,下,了,开},共7个字。
若并集中的第1个字符在文本一中出现了n次,则A1=n(n=0,1,2……)。
若并集中的第2个字符在文本一中出现了n次,则A2=n(n=0,1,2……)。
依此类推,算出A3、A4、……、A7,B1、B2、……、B7,最终得到:
A=(1,1,1,1,0,0,0)。
B=(0,0,2,1,1,1,1)。

将A、B代入计算公式,得到

适用场景

余弦相似度和杰卡德相似度虽然计算方式差异较大,但性质上很类似(与文本的交集高度相关),所以适用场景也非常类似。

余弦相似度相比杰卡德相似度最大的不同在于它考虑到了文本的频次,比如上面例子出现了2次“雨”,和只出现1次“雨”,相似度是不同的;再比如“这是是是是是是一个文本”和“这是一个文文文文文文本”,余弦相似度是39%,整体上符合“相同的内容少于一半,但超过1/3”的观感(仅从文本来看,不考虑语义)。

不适用场景

向量之间方向相同,但大小不同的情况(这种情况下余弦相似度是100%)。
比如“太棒了”和“太棒了太棒了太棒了”,
向量分别是(1,1,1)和(3,3,3),计算出的相似度是100%。这时候要根据业务场景进行取舍,有些场景下我们认为它们意思差不多,只是语气程度不一样,这时候余弦相似度是很给力的;有些场景下我们认为它们差异很大,哪怕意思差不多,但从文本的角度来看相似度并不高(最直白的,一个3个字,一个9个字),这时候余弦相似度就爱莫能助了。

//余弦相似度
public class CosineSimilarity
{Dictionary<char, int[]> vectorMap = new Dictionary<char, int[]>();int[] tempArray = null;public CosineSimilarity(string string1, string string2){foreach (char character1 in string1.ToCharArray()){if (vectorMap.ContainsKey(character1)){vectorMap[character1][0]++;}else{tempArray = new int[2];tempArray[0] = 1;tempArray[1] = 0;vectorMap.Add(character1, tempArray);}}foreach (char character2 in string2.ToCharArray()){if (vectorMap.ContainsKey(character2)){vectorMap[character2][1]++;}else{tempArray = new int[2];tempArray[0] = 0;tempArray[1] = 1;vectorMap.Add(character2, tempArray);}}}// 求余弦相似度public double Sim(){double result = 0;result = PointMulti(vectorMap) / SqrtMulti(vectorMap);return result;}private double SqrtMulti(Dictionary<char, int[]> paramMap){double result = 0;result = Squares(paramMap);result = Math.Sqrt(result);return result;}// 求平方和private double Squares(Dictionary<char, int[]> paramMap){double result1 = 0;double result2 = 0;HashSet<char> keySet = paramMap.Keys.ToHashSet();foreach (char character in keySet){int[] temp = paramMap[character];result1 += (temp[0] * temp[0]);result2 += (temp[1] * temp[1]);}return result1 * result2;}// 点乘法private double PointMulti(Dictionary<char, int[]> paramMap){double result = 0;HashSet<char> keySet = paramMap.Keys.ToHashSet();foreach (char character in keySet){int[] temp = paramMap[character];result += (temp[0] * temp[1]);}return result;}
}

测试

string s1 = "我是一个帅哥";
string s2 = "帅哥是我";
Console.WriteLine(new CosineSimilarity(s1, s2).Sim());//0.8164.....

余弦相似度-C#代码实现相关推荐

  1. 基于协同过滤推荐+余弦相似度算法实现新闻推荐系统

    针对海量的新闻资讯数据,如何快速的根据用户的检索需要,完成符合用户阅读需求的新闻资讯推荐?本篇文章主要采用余弦相似度及基于用户协同过滤算法实现新闻推荐,通过余弦相似度算法完成针对不同新闻数据之间的相似 ...

  2. 基于大数据分析架构设计采用基于协同过滤推荐+余弦相似度算法+springboot+vue.js 实现新闻推荐系统

    针对海量的新闻资讯数据,如何快速的根据用户的检索需要,完成符合用户阅读需求的新闻资讯推荐?本篇文章主要采用余弦相似度及基于用户协同过滤算法实现新闻推荐,通过余弦相似度算法完成针对不同新闻数据之间的相似 ...

  3. pytorch一行实现:计算同一tensor矩阵内每行之间的余弦相似度

    文章目录 0 输入数据 1 余弦相似度(Cosine Similarity) 2 torch.cosine_similarity 3 问题 4 分析与解决 4.1 答案 5 另外的实现方法 0 输入数 ...

  4. 文本相似度计算(切词、生成词向量,使用余弦相似度计算)

    项目需求 有多个文本,分别是正负样本,使用余弦相似度计算负样本与正样本的样本相似度,若准确率高,后期可判断新加样本与正样本的相似度. 输入如下所示: content label 今天下午,在龙口市诸由 ...

  5. ML:文本、图像等数值化数据相似度计算之余弦相似度计算三种python代码实现

    ML:文本.图像等数值化数据相似度计算之余弦相似度计算三种python代码实现 目录 相似度计算之余弦相似度计算 输出结果 三种python代码实现

  6. 欧式距离、曼哈顿距离、余弦相似度(python代码)

    欧式距离/欧几里得度量(Euclidean Distance) 欧氏距离就是两点之间最短的直线距离. (1)二维空间里A.B两点间的欧式距离: SAB=(xA−xB)2+(yA−yB)2S_{AB}= ...

  7. python求反余弦_余弦相似度计算公式:python代码找出相似文章

    余弦相似度计算公式:python代码找出相似文章 用TF-IDF算法可以自动提取关键词.除了找到关键词,怎么找到与原文章相似的其他文章.比如,"百科TA说"在词条最下方,还提供多条 ...

  8. 欧氏距离、余弦相似度、Jaccard相似度、皮尔逊的Python代码与实例

    首先是一段计算4个相似度的Python代码. 需要注意的是,进行归一化操作后,4个函数取值范围都是0-1,而且都是数值越大表示相似性越高,数值为1代表完全相似. import numpy as npd ...

  9. 余弦相似度公式推导及代码实现

    余弦相似度公式推导 1. 为什么使用余弦值相似度? 2. 公式推导 2.1 三角函数余弦公式推导 2.2 三角函数向量余弦公式推导 3. 余弦相似度代码实现 1. 为什么使用余弦值相似度? 空间维度上 ...

最新文章

  1. BusinessObject J2EE单点登陆简单使用
  2. 线性回归代码matlab
  3. 小程序确定取消弹窗_微信小程序定制开发价格确定条件?
  4. 成都Uber优步司机奖励政策(4月24日)
  5. cass读取dat文件_南方CASS教程+视频讲解+插件汇总,小白快速上手的测绘神器
  6. 如果使用 sftp 命令
  7. 关于CDC功能的答疑
  8. JavaWeb:JSON对象和Java对象的相互转换
  9. Excel中vba教程——设置行高实例
  10. iview 省市区 三级联动
  11. 利用计算机的随机模拟结果帮助学生,数学《教学反思》 初中白小曼
  12. RAR和RAR4和zip那个压缩率最高
  13. php 公众号群发消息,PHP 微信公众号 群发文本消息
  14. Invalid bound statement (not found): 各种原因
  15. python将PDF转换成图片(pdf2image的使用)
  16. 抖音文案标题怎么写,抖音标题怎么写才能上热门:国仁楠哥
  17. wampserver在线但localhost打不开 解决方法
  18. ai人工智能_对人工智能的追求
  19. ktv服务器系统怎样加歌,明光市ktv点歌系统如何加歌
  20. 【HTML+CSS】制作文字依次闪烁的霓虹灯特效

热门文章

  1. PPT使用的一些技巧总结
  2. 在线英文打字测试(php)
  3. pig和piglet有什么区别?
  4. 8个视频素材网站,免费可商用,视频剪辑必备。
  5. Vant IndexBar 在小程序中的简单使用
  6. 高德地图js API实现多点标记marker,多点marker移除和鼠标滑入标点显示提示框
  7. 库卡机器人会卡顿吗_看完你就知道德国库卡机器人到底有多牛!
  8. LeetCode刷题遇到的小知识点总结
  9. 通过游戏,ACCU和乌克兰进行测试
  10. 【NOIP】【codevs】【DP】1169传纸条