Java Apache Jaccard文本相似度匹配初体验

文章目录

  • 前言
  • 一、文本相似度算法的选择
  • 二、常见的文本相似度算法介绍
  • 三、使用示例
    • 1、引入jar包
    • 2、方法示例
    • 3、Jaccard源码剖析
    • 4、Jaccard源码解释
  • 写在最后


前言

产品今天提了个需求,大概是这样的,来,请看大屏幕。。。额。。。搞错了,重来!来,请看需求原型
需求原型描述
需求原型清晰明了,就不做过多解释了


一、文本相似度算法的选择

文本相似度其实很好理解,按照字面意思,就是两个字符串比较,根据一定的规则来返回两个字符串的相似度。
按照需求来说的话,我需要的只是文本的匹配,对于准确性的要求可能没有那么高,所以,这里选择Apache Jaccard的算法就能满足需求

二、常见的文本相似度算法介绍

1.Levenshtein距离: Levenshtein距离算法在计算字符串相似度时需要考虑所有的插入、删除和替换操作,因此对于长字符串来说,时间复杂度较高。然而,这个算法比较准确,能够捕捉到字符串间的细微差异。(后面只会说一下调用示例,不会过重说明)

2.Jaccard相似度:Jaccard相似度算法计算集合的交集和并集的比值,是一种基本的相似度度量。它对字符串长度不敏感,计算速度相对较快。但是,它对于字符顺序不敏感,并且只考虑字符出现与否,而不考虑出现的频率。 (这里着重说明一下)

3.Cosine相似度: Cosine相似度算法将字符串视为向量,并计算它们的夹角余弦值。这个算法在计算文本相似度时,考虑了字符的频率和顺序。它也适用于处理较长的字符串,但在比较两个字符串之间的相似度时,需要先将其向量化,因此相对复杂一些。(其实Cosine相似度我也看了下源码,也度娘了一下其中的原理,由于个人数学不好,看到一大串的数学公式,感觉头都大了,就没深究^ o ^。感兴趣的同学可以自行度娘,并深入研究一下 )

三、使用示例

1、引入jar包

Levenshtein、Jaccard和Cosine都是 Apache公司的,所以引入一个就可以了

	<dependency><groupId>org.apache.commons</groupId><artifactId>commons-text</artifactId><version>1.10.0</version></dependency>

2、方法示例

Jaccard相似度: 用于计算两个集合之间的相似度,可以将字符串视为字符的集合,计算它们的交集和并集的比值。Jaccard相似度的取值范围是01,值越接近1表示相似度越高。
Jaccard示例如下:

import org.apache.commons.text.similarity.JaccardSimilarity;// Jaccard文本相似度
public static void main(String[] args) {String str1 = "收到钢化膜其中一张破裂+收到钢化膜其中一张破裂要求补发一张+3191";String str2 = "收到后钢化膜有一张碎了角+收到后钢化膜有一张碎了角,请补发+3191";// Jaccard匹配文本相似度JaccardSimilarity jacc = new JaccardSimilarity();Double jaccardSimilarity = jacc.apply(str1, str2);System.out.println("Jaccard===>文本相似度:" + jaccardSimilarity);
}

Jaccard计算结果:
Jaccard计算结果

Levenshtein距离示例如下:
Levenshtein距离:也称为编辑距离,用于计算两个字符串之间的最小编辑操作次数(插入、删除、替换)来转换一个字符串为另一个字符串。编辑距离越小,表示两个字符串越相似。

import org.apache.commons.text.similarity.JaccardSimilarity;// Jaccard文本相似度
public static void main(String[] args) {String str1 = "收到钢化膜其中一张破裂+收到钢化膜其中一张破裂要求补发一张+3191";String str2 = "收到后钢化膜有一张碎了角+收到后钢化膜有一张碎了角,请补发+3191";int distance = LevenshteinDistance.getDefaultInstance().apply(str1, str2);double levenshteinSimilarity= 1 - (double) distance / Math.max(str1.length(), str2.length());System.out.println("Levenshtein===>文本相似度:" + levenshteinSimilarity);
}

Levenshtein计算结果:
Levenshtein距离计算结果


3、Jaccard源码剖析

import org.apache.commons.text.similarity.JaccardSimilarity;public static void main(String[] args) {String str1 = "收到钢化膜其中一张破裂+收到钢化膜其中一张破裂要求补发一张+3191";String str2 = "收到后钢化膜有一张碎了角+收到后钢化膜有一张碎了角,请补发+3191";int leftLength = str1.length();int rightLength = str2.length();if (leftLength == 0 && rightLength == 0) {System.out.println("文本相似度:" + 1.0);} else if (leftLength != 0 && rightLength != 0) {Set<Character> leftSet = new HashSet();for (int i = 0; i < leftLength; ++i) {leftSet.add(str1.charAt(i));}System.out.println("leftSet内容:" + JSONObject.toJSONString(leftSet));System.out.println("leftSet的Size:" + leftSet.size());Set<Character> rightSet = new HashSet();for (int i = 0; i < rightLength; ++i) {rightSet.add(str2.charAt(i));}System.out.println("rightSet内容:" + JSONObject.toJSONString(rightSet));System.out.println("rightSet的Size:" + rightSet.size());Set<Character> unionSet = new HashSet(leftSet);unionSet.addAll(rightSet);System.out.println("unionSet内容:" + JSONObject.toJSONString(unionSet));System.out.println("unionSet的Size:" + unionSet.size());int intersectionSize = leftSet.size() + rightSet.size() - unionSet.size();System.out.println("intersectionSize的Size:" + intersectionSize);double calRes = 1.0 * (double) intersectionSize / (double) unionSet.size();System.out.println("文本相似度:" + calRes);} else {System.out.println("文本相似度:" + 0.0);}
}

4、Jaccard源码解释

该函数用于计算两个字符串的文本相似度。使用字符集来表示字符串,并计算两个字符串的交集和并集,然后根据交集和并集的大小计算相似度。具体步骤如下:

  1. 初始化两个字符串str1和str2。
  2. 计算两个字符串的长度,分别保存在leftLength和rightLength变量中。
  3. 如果两个字符串长度都为0,则输出相似度为1.0。
  4. 如果两个字符串长度都不为0,则进行以下操作:
    a. 创建一个字符集leftSet,将str1中的每个字符添加到leftSet中。
    b. 输出leftSet的内容和大小。
    c. 创建一个字符集rightSet,将str2中的每个字符添加到rightSet中。
    d. 输出rightSet的内容和大小。
    e. 创建一个字符集unionSet,并将leftSet中的元素复制到unionSet中。
    f. 将rightSet中的元素添加到unionSet中。
    g. 输出unionSet的内容和大小。
    h. 计算交集的大小:intersectionSize = leftSet的大小 + rightSet的大小 - unionSet的大小。
    i. 计算相似度:calRes = (double) intersectionSize / (double) unionSet的大小。
    j. 输出相似度。
  5. 如果两个字符串长度不一致,则输出相似度为0.0。

写在最后

最佳算法的选择取应取决于实际应用中具体情况和要求,同时需要考虑多个方面,如算法的复杂度、字符串长度、算法的适用性、是否需要分词等等。
如果仅仅是需要计算几个短字符串之间的相似度,Jaccard相似度可能会是一个好的选择。
如果是需要捕捉字符串细微的差异并进行较高精度的匹配,Levenshtein距离可能会更合适。
如果需要处理的是文本数据Cosine相似度可能是更好的选择。
此外,如果需要对于大规模的字符串匹配需求(如搜索引擎),更复杂的算法(如基于索引的搜索算法)可能会有更适合的算法。

原创不易,望一键三连 (^ _ ^)

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

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

相关文章

三丰云评测:免费虚拟主机和免费云服务器体验

今天我来为大家分享一下我的三丰云评测体验。三丰云是一家提供免费虚拟主机和免费云服务器的服务商&#xff0c;为了方便大家了解他们的服务&#xff0c;我特地注册了他们的免费虚拟主机和免费云服务器进行试用。在实际体验中&#xff0c;我发现三丰云的服务表现非常出色。首先…

【产品经理】总篇章

引言: 在最近频繁的产品职位面试中&#xff0c;我深刻体会到了作为产品需要的不仅仅是对市场和技术的敏锐洞察&#xff0c;更多的是在复杂多变的环境中&#xff0c;如何运用沟通、领导力和决策能力来引导产品从概念走向市场。这一系列博客将分享我多年经历和所学到的所以知识&a…

OpenCV学习 基础图像操作(十六):图像距离变换

基础原理 顾名思义&#xff0c;我们可以利用像素之间的距离作为对该像素的一种刻画&#xff0c;并将其运用到相应的计算之中。然而&#xff0c;在一幅图像之中&#xff0c;某种类型的像素并不是唯一的&#xff0c;因此我门常计算的是一类像素到另一类的最小距离&#xff0c;并…

工厂模式详情

一.介绍工厂模式的用途与特点 工厂方法模式是一种创建型设计模式&#xff0c; 其在父类中提供一个创建对象的方法&#xff0c; 允许子类决定实例化对象的类型。定义工厂方法模式(Fatory Method Pattern)是指定义一个创建对象的接口&#xff0c;但让实现这个接口的类来决定实例…

npm install node-sass 安装失败的解决方案:利用国内镜像加速安装

在开发前端项目时&#xff0c;使用Sass作为CSS预处理器是很多开发者的选择。然而&#xff0c;在通过npm安装其Node.js绑定库node-sass时&#xff0c;一些开发者可能会遇到安装失败的问题&#xff0c;尤其是网络原因导致的下载缓慢或中断。本文将指导你如何通过更换为国内镜像源…

如何在测试/线上环境页面访问本地接口?

文章目录 一、前言二、分析三、搭建1、搭建nginx&#xff0c;监听http请求转发2、监听https请求转发 四、总结 一、前言 在工作中&#xff0c;开发完的接口&#xff0c;一般测试的话&#xff0c;基本是使用Postman&#xff0c;如果要到页面测试&#xff0c;就要发版进行测试&a…

《逆水寒》手游周年庆,热度不减反增引发热议

易采游戏网5月31日最新消息&#xff1a;随着数字娱乐时代的飞速发展&#xff0c;手游市场的竞争愈发激烈。在这样的大背景下&#xff0c;《逆水寒》手游以其独特的古风武侠世界和深度的社交体验&#xff0c;自上线以来便吸引了无数玩家的目光。如今&#xff0c;这款游戏迎来了它…

知识运维概述

文章目录 知识运维研究现状技术发展趋势 知识运维 由于构建全量的行业知识图谱成本很高&#xff0c;在真实的场景落地过程中&#xff0c;一般遵循小步快走、快速迭代的原则进行知识图谱的构建和逐步演化。知识运维是指在知识图谱初次构建完成之后&#xff0c;根据用户的使用反馈…

WSL2-Ubuntu22.04-配置

WSL2-Ubuntu22.04-配置 准备1. WSL相关命令[^1]2. WSL2-Ubuntu22.04可视化3. WSL2 设置 CUDA4. 设置OpenGL 本文介绍了WSL2的基本使用方法及可视化&#xff0c;着重介绍了GPU和OpenGL的设置。 准备 名称版本windows11wsl2CUDA12.5 1. WSL相关命令1 查看已安装的wsl distribut…

DevExpress开发WPF应用实现对话框总结

说明&#xff1a; 完整代码Github​&#xff08;https://github.com/VinciYan/DXMessageBoxDemos.git&#xff09;DevExpree v23.2.4&#xff08;链接&#xff1a;https://pan.baidu.com/s/1eGWwCKAr8lJ_PBWZ_R6SkQ?pwd9jwc 提取码&#xff1a;9jwc&#xff09;使用Visual St…

“手撕”链表的九道OJ习题

目录 1. 第一题 2. 第二题 3. 第三题 4. 第四题 5. 第五题 6. 第六题 7. 第七题 8. 第八题 9. 第九题 1. 第一题 删除链表中等于给定值 val 的所有节点。OJ链接 思路如下&#xff1a; 相当于链表的removeAll();制定prev和cur&#xff0c;prev记录前一个节点&#xff…

2021JSP普及组第三题:插入排序

2021JSP普及组第三题 题目&#xff1a; 思路&#xff1a; 题目要求排序后根据操作进行对应操作。 操作一需要显示某位置数据排序后的位置&#xff0c;所以需要定义结构体数组储存原数据的位置和数据本身排序后所得数据要根据原位置输出排序后的位置&#xff0c;所以建立一个新…

作业 递归应用

已完成&#xff1a;7 #include <iostream> using namespace std; long long f(long long,long long); int main(){long long n,m;cin>>n>>m;cout<<f(m,n);return 0; } long long f(long long a,long long b){if(a%b0){return b;}return f(b,a%b); } #i…

RedisSearch与Elasticsearch:技术对比与选择指南

码到三十五 &#xff1a; 个人主页 数据时代&#xff0c;全文搜索已经成为许多应用程序中不可或缺的一部分。RedisSearch和Elasticsearch是两个流行的搜索解决方案&#xff0c;它们各自具有独特的特点和优势。本文简单探讨一些RedisSearch和Elasticsearch之间的技术差异。 目录…

软件测试基础

目录 一.基础 1.概念 1.1 什么是软件测试&#xff1f; 1.2 什么是需求&#xff1f; 1.3 什么是测试用例&#xff1f; 1.4 为什么需要测试用例&#xff1f; 1.5 什么是BUG&#xff1f; 1.6 软件生命周期 2.开发模型 2.1 瀑布模型 2.2 螺旋模型 2.3 增量模型、迭代模型…

从零到一建设数据中台 - 关键技术汇总

一、数据中台关键技术汇总 语言框架&#xff1a;Java、Maven、Spring Boot 数据分布式采集&#xff1a;Flume、Sqoop、kettle 数据分布式存储&#xff1a;Hadoop HDFS 离线批处理计算&#xff1a;MapReduce、Spark、Flink 实时流式计算&#xff1a;Storm/Spark Streaming、…

(CPU/GPU)粒子继承贴图颜色发射

GetRandomInfo节点(复制贴进scratch pad Scripts) Begin Object Class/Script/NiagaraEditor.NiagaraClipboardContent Name"NiagaraClipboardContent_22" ExportPath/Script/NiagaraEditor.NiagaraClipboardContent"/Engine/Transient.NiagaraClipboardConten…

安装软件缺少dll文件怎么办,分享多种解决dll问题的方法

在计算机使用过程中&#xff0c;我们经常会遇到安装软件时提示缺少dll文件的问题。这种情况通常会导致软件无法正常运行或启动。为了解决这个问题&#xff0c;我总结了以下五种方法&#xff0c;希望对大家有所帮助。 一&#xff0c;了解DLL文件是什么 动态链接库&#xff08;D…

连通块中点的数量-java

本次我们通过连通块中点的数量来加深我们对并查集的基本操作和原理&#xff0c;并且知道如何在并查集中添加附属信息。 目录 前言☀ 一、连通块中点的数量☀ 二、算法思路☀ 1.无向图&#x1f319; 2.在a b之间连一条边&#xff0c;a b可能相等&#x1f319; 3.询问a和b是否在一…

Java | Leetcode Java题解之第122题买卖股票的最佳时机II

题目&#xff1a; 题解&#xff1a; class Solution {public int maxProfit(int[] prices) {int ans 0;int n prices.length;for (int i 1; i < n; i) {ans Math.max(0, prices[i] - prices[i - 1]);}return ans;} }