Java实现余弦定理计算文本相似度
相似度度量(Similarity),即计算个体间的相似程度,相似度度量的值越小,说明个体间相似度越小,相似度的值越大说明个体差异越大。
对于多个不同的文本或者短文本对话消息要来计算他们之间的相似度如何,一个好的做法就是将这些文本中词语,映射到向量空间,形成文本中文字和向量数据的映射关系,通过计算几个或者多个不同的向量的差异的大小,来计算文本的相似度。下面介绍一个详细成熟的向量空间余弦相似度方法计算相似度
向量空间余弦相似度(Cosine Similarity)
余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性"。
思路上就是:将文本中的词汇映射到向量空间,来计算两个向量的夹角余弦值,作为两个文本相似度的判断。
代码参考如下:
package com.test;import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;public class Cosine {public static double getSimilarity(String doc1, String doc2) {if (doc1 != null && doc1.trim().length() > 0 && doc2 != null&& doc2.trim().length() > 0) {Map<Integer, int[]> AlgorithmMap = new HashMap<Integer, int[]>();//将两个字符串中的中文字符以及出现的总数封装到,AlgorithmMap中for (int i = 0; i < doc1.length(); i++) {char d1 = doc1.charAt(i);if(isHanZi(d1)){//标点和数字不处理int charIndex = getGB2312Id(d1);//保存字符对应的GB2312编码if(charIndex != -1){int[] fq = AlgorithmMap.get(charIndex);if(fq != null && fq.length == 2){fq[0]++;//已有该字符,加1}else {fq = new int[2];fq[0] = 1;fq[1] = 0;AlgorithmMap.put(charIndex, fq);//新增字符入map}}}}for (int i = 0; i < doc2.length(); i++) {char d2 = doc2.charAt(i);if(isHanZi(d2)){int charIndex = getGB2312Id(d2);if(charIndex != -1){int[] fq = AlgorithmMap.get(charIndex);if(fq != null && fq.length == 2){fq[1]++;}else {fq = new int[2];fq[0] = 0;fq[1] = 1;AlgorithmMap.put(charIndex, fq);}}}}Iterator<Integer> iterator = AlgorithmMap.keySet().iterator();double sqdoc1 = 0;double sqdoc2 = 0;double denominator = 0; while(iterator.hasNext()){int[] c = AlgorithmMap.get(iterator.next());denominator += c[0]*c[1];sqdoc1 += c[0]*c[0];sqdoc2 += c[1]*c[1];}return denominator / Math.sqrt(sqdoc1*sqdoc2);//余弦计算} else {throw new NullPointerException(" the Document is null or have not cahrs!!");}}public static boolean isHanZi(char ch) {// 判断是否汉字return (ch >= 0x4E00 && ch <= 0x9FA5);/*if (ch >= 0x4E00 && ch <= 0x9FA5) {//汉字return true;}else{String str = "" + ch;boolean isNum = str.matches("[0-9]+"); return isNum;}*//*if(Character.isLetterOrDigit(ch)){String str = "" + ch;if (str.matches("[0-9a-zA-Z\\u4e00-\\u9fa5]+")){//非乱码return true;}else return false;}else return false;*/}/*** 根据输入的Unicode字符,获取它的GB2312编码或者ascii编码,* * @param ch 输入的GB2312中文字符或者ASCII字符(128个)* @return ch在GB2312中的位置,-1表示该字符不认识*/public static short getGB2312Id(char ch) {try {byte[] buffer = Character.toString(ch).getBytes("GB2312");if (buffer.length != 2) {// 正常情况下buffer应该是两个字节,否则说明ch不属于GB2312编码,故返回'?',此时说明不认识该字符return -1;}int b0 = (int) (buffer[0] & 0x0FF) - 161; // 编码从A1开始,因此减去0xA1=161int b1 = (int) (buffer[1] & 0x0FF) - 161; return (short) (b0 * 94 + b1);// 第一个字符和最后一个字符没有汉字,因此每个区只收16*6-2=94个汉字} catch (UnsupportedEncodingException e) {e.printStackTrace();}return -1;}public static void main(String[] args) {String str1="余弦定理算法:doc1 与 doc2 相似度为:0.9954971, 耗时:22mm";String str2="余弦定理算法:doc1 和doc2 相似度为:0.99425095, 用时:33mm";long start=System.currentTimeMillis(); double Similarity=Cosine.getSimilarity(str1, str2);System.out.println("用时:"+(System.currentTimeMillis()-start)); System.out.println(Similarity);}
}
执行结果:
用时:16
0.8461538461538461
Java实现余弦定理计算文本相似度相关推荐
- 【NLP】余弦定理计算文本相似度
一. 余弦相似概述 余弦相似性通过测量两个向量的夹角的余弦值来度量它们之间的相似性.0度角的余弦值是1,而其他任何角度的余弦值都不大于1:并且其最小值是-1. 从而两个向量之间的角度的余弦值确定两个向 ...
- java 余弦定理_Java根据余弦定理计算文本相似度
public classCosine {public static doublegetSimilarity(String doc1, String doc2) {if (doc1 != null &a ...
- python余弦定理_余弦定理与文本相似度
什么是余弦定理 学过向量代数的人都知道,向量实际上是多维空间中有方向的线段.如果两个向量的方向一致,即夹角接近零,那么这两个向量就相近.而要确定两个向量方向是否一致,这就要用到余弦定理计算向量的夹角了 ...
- 使用余弦相似度算法计算文本相似度-数学
20211201 也就是效果 皮尔逊>余弦>欧式 余弦相似度的局限 皮尔逊的优势,相当于是改进版余弦相似度 欧式与 余弦 欧式侧重于直线距离 归一化之后的欧式和余弦的效果也不同 比如 0, ...
- 自然语言处理(NLP)之使用TF-IDF模型计算文本相似度
自然语言处理(NLP)之使用TF-IDF模型计算文本相似度 所用数据集:ChnSentiCorp_htl_all.csv 语料库即存放稀疏向量的列表. 要注意的是,搜索文本text与被检索的文档共用一 ...
- 使用simhash计算文本相似度
1. 使用simhash计算文本相似度 2. 使用余弦相似度计算文本相似度 3. 使用编辑距离计算文本相似度 4. jaccard系数计算文本相似度 文本相似度计算常用于网页去重以及NLP里文本分析等 ...
- 使用余弦相似度计算文本相似度
1. 使用simhash计算文本相似度 2. 使用余弦相似度计算文本相似度 3. 使用编辑距离计算文本相似度 4. jaccard系数计算文本相似度 2.向量余弦计算文本相似度 2.1 原理 余弦相似 ...
- 使用gensim计算文本相似度
使用gensim计算文本相似度 计算文本相似度步骤逻辑 1.将文本数据,通过jieba分词进行处理,形成一个二维数组 2.将二维数组生成词典 3.将二维数组通过doc2bow稀疏向量,形成语料库 4. ...
- 使用编辑距离计算文本相似度
1. 使用simhash计算文本相似度 2. 使用余弦相似度计算文本相似度 3. 使用编辑距离计算文本相似度 4. jaccard系数计算文本相似度 3. 最小编辑距离计算文本相似度 3.1 编辑距离 ...
最新文章
- Java架构演进之路
- 推荐 2个十分好用的 pandas 数据探索分析神器!
- MySQL /“N叉树”的N值在MySQL中是可以被人工调整吗
- 4行代码AC——L1-024 后天(5分)
- jmeter JDBC Request
- 二十年的编程,教会我的五件事!
- 浅析bin,lib,src的区别
- 基于深度学习的以图搜图
- STM32 CubeMx(七)SPI串行同步通信与外部FLASH(W25Q128)的读写和TFT液晶屏
- 要求用缓冲流:有如下字符串“If you want to change your fate I think you must come to the dark horse to learn java“
- 这表白代码让我虎躯一震!
- 初学Android,图形图像之使用Canvas,Paint绘图(二十五)
- 苹果ppt_苹果电脑最强PPT神器来了!2000个模版、7 大功能让你的PPT更好看
- 使用fasttext完成文本处理及文本预测
- 物联网深度融入生活场景 爆发条件成熟
- 对uni-app框架的认识
- 《白帽子讲Web安全》安全运营
- windows和android双系统平板,安卓+windows双系统平板的“得与失”
- windows7运行软件出现找不到D3DCOMPILER_47.dll的解决办法
- Spring Cloud Data Flow流处理入门-5
热门文章
- mats显卡测试软件的使用教程,MATS使用说明
- 案例式c语言程序设计陈明,C语言程序设计教程 清华大学出版社 陈明主编 第1章答案...
- java设置面板的颜色_java – 修改颜色选择器面板
- ue4导入倾斜摄影_倾斜摄影入门必学|Context Capture建模软件工作流程
- TCP三次握手、tcp和udp对比、四表五链
- dagger2 依赖注入
- 测试博客园Markdown 表格
- Excel制作考勤管理
- 001.搭建开发环境
- 不动产登记证书曝光 一个“改变”必须注意(图)