jaccard相似度_如何计算两个字符串之间的文本相似度?

推荐阅读:

  • 面试BAT 却被小小字符串秒杀?这13道题帮你一举击败字符串算法题
  • 字节跳动秋招面经:后端开发工程师,已拿意向书

前言

平时的编码中,我们经常需要判断两个文本的相似性,不管是用来做文本纠错或者去重等等,那么我们应该以什么维度来判断相似性呢?这些算法又怎么实现呢?这篇文章对常见的计算方式做一个记录。

5e51e16f615306d2403c3fce59e74165.png

Jaccard 相似度

首先是 Jaccard 相似度系数,下面是它在维基百科上的一个定义及计算公式。

The Jaccard index, also known as Intersection over Union and the Jaccard similarity coefficient (originally given the French name coefficient de communauté by Paul Jaccard), is a statistic used for gauging the similarity and diversity of sample sets. The Jaccard coefficient measures similarity between finite sample sets, and is defined as the size of the intersection divided by the size of the union of the sample sets:

16ecdc653a3b4ea75e508b92003e6a1a.png

其实总结就是一句话:集合的交集与集合的并集的比例.

java 代码实现如下:

 public static float jaccard(String a, String b) { if (a == null && b == null) { return 1f; } // 都为空相似度为 1 if (a == null || b == null) { return 0f; } Set aChar = a.chars().boxed().collect(Collectors.toSet()); Set bChar = b.chars().boxed().collect(Collectors.toSet()); // 交集数量 int intersection = SetUtils.intersection(aChar, bChar).size(); if (intersection == 0) return 0; // 并集数量 int union = SetUtils.union(aChar, bChar).size(); return ((float) intersection) / (float)union; }

Sorensen Dice 相似度系数

与 Jaccard 类似,Dice 系数也是一种计算简单集合之间相似度的一种计算方式。与 Jaccard 不同的是,计算方式略有不同。下面是它的定义。

The Sørensen–Dice coefficient (see below for other names) is a statistic used to gauge the similarity of two samples. It was independently developed by the botanists Thorvald Sørensen[1] and Lee Raymond Dice,[2] who published in 1948 and 1945 respectively.

5881652ada9dd74cfff47fb0a6a3fbba.png

需要注意的是,他是:集合交集的 2 倍除以两个集合相加。并不是并集.

java 代码实现如下:

 public static float SorensenDice(String a, String b) { if (a == null && b == null) { return 1f; } if (a == null || b == null) { return 0F; } Set aChars = a.chars().boxed().collect(Collectors.toSet()); Set bChars = b.chars().boxed().collect(Collectors.toSet()); // 求交集数量 int intersect = SetUtils.intersection(aChars, bChars).size(); if (intersect == 0) { return 0F; } // 全集,两个集合直接加起来 int aSize = aChars.size(); int bSize = bChars.size(); return (2 * (float) intersect) / ((float) (aSize + bSize)); }

Levenshtein

莱文斯坦距离,又称 Levenshtein 距离,是编辑距离的一种。指两个字串之间,由一个转成另一个所需的最少编辑操作次数。

简单的说,就是用编辑距离表示字符串相似度, 编辑距离越小,字符串越相似。

java 实现代码如下:

 public static float Levenshtein(String a, String b) { if (a == null && b == null) { return 1f; } if (a == null || b == null) { return 0F; } int editDistance = editDis(a, b); return 1 - ((float) editDistance / Math.max(a.length(), b.length())); } private static int editDis(String a, String b) { int aLen = a.length(); int bLen = b.length(); if (aLen == 0) return aLen; if (bLen == 0) return bLen; int[][] v = new int[aLen + 1][bLen + 1]; for (int i = 0; i <= aLen; ++i) { for (int j = 0; j <= bLen; ++j) { if (i == 0) { v[i][j] = j; } else if (j == 0) { v[i][j] = i; } else if (a.charAt(i - 1) == b.charAt(j - 1)) { v[i][j] = v[i - 1][j - 1]; } else { v[i][j] = 1 + Math.min(v[i - 1][j - 1], Math.min(v[i][j - 1], v[i - 1][j])); } } } return v[aLen][bLen]; }

代码中的编辑距离求解使用了经典的动态规划求解法。

我们使用了** 1 - ( 编辑距离 / 两个字符串的最大长度) ** 来表示相似度,这样可以得到符合我们语义的相似度。

汉明距离

汉明距离是编辑距离中的一个特殊情况,仅用来计算两个等长字符串中不一致的字符个数。

因此汉明距离不用考虑添加及删除,只需要对比不同即可,所以实现比较简单。

我们可以用similarity=汉明距离/长度来表示两个字符串的相似度。

java 代码如下:

 public static float hamming(String a, String b) { if (a == null || b == null) { return 0f; } if (a.length() != b.length()) { return 0f; } int disCount = 0; for (int i = 0; i < a.length(); i++) { if (a.charAt(i) != b.charAt(i)) { disCount++; } } return (float) disCount / (float) a.length(); }

下面是测试用例:

 Assert.assertEquals(0.0f, StringSimilarity.hamming("java 开发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ap接口 php_小白php API初体验 php api文档 php api接口开发 php web ap

这里的php 写API其实就是指提供一个WebServiceWebSite : 1.以html格式响应返回 2.由用户通过浏览器来接入WebService : 1.以json/Xml格式返回 2.由程序接入 3.用来实现不同平台的交互How to begin说简单点&#xff0c;就是传数据的&#xff0c;就是封装各种方法让其它人来调用A…

powerdesigner 导入html,使用PowerDesigner导出Word/HTML的一些配置

《JavaScript高级程序设计》学习笔记系统学习JS, 从入门,通过学习jQuery或者angularJS源码来进阶. 第1章 JavaScript简介 1.JS问世的目的是处理以前由服务器端 ...css link和&commat;import区别用法这里link与import介绍的是html引入css的语法单词.两者均是引入css到html的…

java按钮陷下去_付费?广告?捐款?如何让开源软件活下去?

【CSDN编者按】作为一名使用开源软件的开发者&#xff0c;你是否曾思考过开源软件是如何盈利&#xff1f;如何运营下去的&#xff1f;本文作者从正反两面给出自己看到的案例和建议&#xff0c;思考让开源软件持续下去的方式&#xff0c;一起来看看吧。作者 | TJ VanToll译者 | …

clickhouse mysql引擎_ClickHouse为啥能做到变态快,超 MySQL 801倍?

原标题&#xff1a;ClickHouse为啥能做到变态快&#xff0c;超 MySQL 801倍&#xff1f;阿里、腾讯、字节跳动这种大厂每天数据规模达到千亿、万亿级别&#xff0c;中小企业手里要是没点儿数据&#xff0c;根本不好意思说自己是互联网公司。有数据是一回事&#xff0c;让数据发…

教资计算机科学与技术教资,教资笔试查成绩啦!广师大未来教师们又前进一步...

原标题&#xff1a;教资笔试查成绩啦&#xff01;广师大未来教师们又前进一步这里是今日起考生登录ntce.neea.edu.cn“中小学教师资格考试网”即可查询笔试成绩啦惊不惊喜 意不意外查成绩的人这么多可以看出考取教师资格证已然成为大学生中的“香饽饽”日前&#xff0c;茂名滨海…

控制台启动jar包关闭控制台怎么关java程序_Jpom一款简而轻的低侵入式Java运维、监控软件...

你为什么需要JpomSpringBoot、Jboot等框架开发的项目通常是以Jar的方式在后台运行的&#xff0c;如果只有一两个项目&#xff0c;管理起来不是太麻烦&#xff0c;但是当项目多了以后&#xff0c;管理起来就不是那么方便了&#xff0c;当项目出现问题时&#xff0c;能够通过Jpom…

台式计算机如何双屏显示,电脑怎么分屏?|台式电脑双显示器连接方法

电脑怎么分屏&#xff1f;|台式电脑双显示器连接方法阅读&#xff1a;497时间&#xff1a;2019-08-10 23:24:36随着人们对时间效率的看中&#xff0c;比如在看报表的同时看电影&#xff0c;工作娱乐两不误&#xff0c;如果你也想要这样的工作环境&#xff0c;我们可以给电脑…

gossip 区块链_区块链中的P2P

区块链中P2P介绍p2p是什么为什么区块链需要P2P比特币、以太坊、超级账本和EOS的P2P对比P2P是什么P2P作为区块链网络中去中心化的标识P2P全称对等式网络(peer-to-peer)&#xff0c;又称点对点技术&#xff0c;是无中心服务器、依靠用户群(peers)交换信息的互联网体系&#xff1b…

java 反射调用方法_java的反射机制,以及通过反射获取方法,变量等操作

我们应用会用到反射这个知识点&#xff0c;肯定是想要在运行时得到类的信息&#xff0c;根据类的那些信息去做一些特定的操作。那么&#xff0c;首先无疑就是得到类的信息&#xff0c;在JDK中提供了Class对象来保存类的信息。所以&#xff0c;反射的第一步就是得到Class对象。在…

微型计算机主机箱内的所有部件均由大规模,2012年自考《计算机应用基础》模拟试题...

《计算机应用基础》模拟试题一、单选题 (每空1分&#xff0c;共30分)1. 在Word的编辑状态&#xff0c;当前在汉字输入状态&#xff0c;若要切换到输入大写英文字母状态&#xff0c;应当按( )。A.Caps Lock键 B.Shift键 C.Ctrl 空格键 D.Ctrl Shift键2. 一个完整的计算机系…

织梦自定义图片字段和缩略图一样_织梦图片集模型自定义图片字段调用

创建自定义函数打开/include/extend.func.php文件(注&#xff1a;这个文件就是系统预留的自定义函数接口文件&#xff0c;主要用于二次开发用的。如果你是老版本&#xff0c;默认没有这个文件&#xff0c;自己创建一个PHP文件即可)&#xff0c;在最下面的?>上一行加入以下函…

解释型语言和编译型语言的区别_从泛型的使用情况看出你对语言的理解程度(2)...

上篇我们提到&#xff1a;Java中的泛型是不可变的&#xff0c;可以通过<? extends E>实现了泛型的协变&#xff0c;<? super E>实现泛型的逆变。从泛型的使用情况看出你对语言的理解程度&#xff08;1&#xff09;今天我们来讲讲泛型单例工厂&#xff0c;在之前的…

泸州职业技术学院计算机单招试题,2021年泸州职业技术学院单招英语考试模拟试题库...

2021年高职单招升学一对一咨询高职单招郭老师:15683905627(微信)单招考试考什么单招专业技能考试文化统考;文化统考科目包括语文、数学、英语、专业综合理论。单招考试形式&#xff1a;专业技能考试文化统考。专业技能考试形式和内容由各专业大类联考委确定。文化统考科目为语文…

showdoc如何创建文件夹_showDoc生成文档

1. 创建项目2. 获取api_key和api_token1. 打开设置2. 获取api_key和token3. 生成文档1. 先cd进入你的项目目录&#xff0c;命令行模式下输入&#xff1a;wget https://www.showdoc.cc/script/showdoc_api.sh下载完毕&#xff0c;编辑vi showdoc_api.sh脚本内容的前面有两个变量…

win7下安装python失败问题_win7下安装ipython失败

关键就是报错啊大哥,没个报错信息你让我们怎么帮你,天眼通吗?请看:提问的艺术(中文版)在网络世界里&#xff0c;当提出一个技术问题时&#xff0c;你能得到怎样的回答&#xff1f;这取决于挖出答案的难度&#xff0c; 同样取决于你提问的方法。本指南旨在帮助你提高发问技巧&a…

职称计算机技巧集锦,2014职称计算机考试《Excel》使用技巧集锦(4)

四、 数据分析和管理技巧1. 管理加载宏Excel包括各种特殊作用的加载宏&#xff0c;它们使用自定义的函数、向导、对话框和其他工具&#xff0c;扩充了工作表的基本功能。默认情况下&#xff0c;每个加载宏都配置为在第一次使用时安装&#xff0c;也就是说在第一次需要某个加载宏…

map集合的putall_Map.put和Map.putAll方法之间的区别?

当使用putAll而不是put时&#xff0c;我看到巨大的性能优势。 请参见下面的示例程序&#xff1a;公共类SampleTest {public static void main(final String[] args) {final Map testMap new HashMap<>();final Map testMap2 new HashMap<>();final LocalDateTime…

ubuntu20.04自带python版本_替换 ubuntu 自带的python版本

首先在这里下载你想用的各个版本的python&#xff0c;我用的是2.7.11&#xff1a; https://www.python.org/ftp/python/还是老样子&#xff1a; ./configure --> make --> make install接下来将你自带的版本替换成自己的版本&#xff1a; 先 which python 查看你的p…

物料编码是计算机系统对物料,物料编码是什么?

物料编码是唯一标识物料的代码,通常用字符串(定长或不定长)或数字表示.物料编码是计算机系统对物料的惟一识别代码.它用一组代码来代表一种物料.物料编码必须是惟一的,也就是,一种物料不能有多个物料编码,一个物料编码不能有多种物料.目录简介意义原则方法注意事项处理特点展开…

python requests get post_python+requests进行get、post方法接口测试

简介&#xff1a;Requests 是用Python语言编写&#xff0c;基于 urllib&#xff0c;采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便&#xff0c;可以节约我们大量的工作&#xff0c;完全满足 HTTP 测试需求。Requests 的哲学是以 PEP 20 的习语为中心开发的&…