如何在Java中使用Levenshtein距离实现字符串相似度匹配

news2024/12/23 8:32:01

在许多应用中,我们需要根据用户输入的问题找到最匹配的已知问题。Levenshtein距离(编辑距离)是一个强大的工具,可以帮助我们衡量两个字符串之间的差异,并进一步计算它们的相似度。本文将使用一个具体的例子来展示如何在Java中实现这一功能,并详细解释每个步骤,使得初学者也能易于理解。

Levenshtein距离简介

Levenshtein距离是由俄罗斯科学家Vladimir Levenshtein在1965年提出的,用以量化两个字符串之间的差异。这种度量方式计算将一个字符串转换成另一个字符串所需要的最少编辑操作次数,包括插入、删除和替换字符。

计算原理

Levenshtein距离的计算可以通过建立一个矩阵来完成:

  1. 初始化矩阵:创建一个(m+1)x(n+1)的矩阵,其中m和n是两个字符串的长度。矩阵的第一行和第一列分别初始化为从0到m和0到n的序列,表示从空字符串到该长度的转换所需的步骤。

  2. 填充矩阵:遍历字符串,比较每个字符。如果字符相同,该位置的值为左上角的值;如果不同,取左(插入)、上(删除)、左上(替换)三个方向的最小值加一。

  3. 获取距离值:矩阵的最右下角的值即为两字符串之间的Levenshtein距离。

相似度计算

通过Levenshtein距离,我们可以计算出两个字符串的相似度,公式为:[ \text{相似度} = 1 - \frac{\text{Levenshtein距离}}{\max(\text{字符串A的长度}, \text{字符串B的长度})} ]这样,相似度越接近1表示两个字符串越相似。

在Java中的实现

首先,我们需要在Java项目中引入Apache Commons Lang库,这个库提供了计算Levenshtein距离的实用方法。如果你的项目使用Maven进行依赖管理,可以在pom.xml文件中添加以下依赖:

<!-- 在 Maven 的 pom.xml 文件中添加 Apache Commons Lang 依赖 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

接下来,我们将编写一个Java类,其中包含一个方法来计算两个字符串之间的相似度。这个相似度是基于Levenshtein距离来计算的。

import org.apache.commons.lang3.StringUtils;

public class QuestionMatcher {
    // 计算两个字符串之间的相似度的方法
    public static double calculateSimilarity(String input, String target) {
        // 计算两个字符串的最大长度
        int maxLength = Math.max(input.length(), target.length());
        // 使用StringUtils工具类计算Levenshtein距离
        int editDistance = StringUtils.getLevenshteinDistance(input, target);
        // 根据Levenshtein距离计算相似度
        return 1.0 - (double) editDistance / maxLength;
    }
    
    public static void main(String[] args) {
        // 用户输入的问题
        String userQuestion = "如何煮鸡蛋?";
        // 已知的问题数组
        String[] knownQuestions = {"如何煮沸鸡蛋?", "如何煎鸡蛋?", "如何剥鸡蛋皮?"};
        
        // 初始化最高相似度和最佳匹配问题
        double highestSimilarity = 0;
        String bestMatch = null;
        
        // 遍历已知问题,找到与用户问题最相似的一个
        for (String question : knownQuestions) {
            double similarity = calculateSimilarity(userQuestion, question);
            if (similarity > highestSimilarity) {
                highestSimilarity = similarity;
                bestMatch = question;
            }
        }
        
        // 输出最佳匹配的问题和其相似度
        System.out.println("最佳匹配问题: " + bestMatch + ",相似度: " + highestSimilarity);
    }
}

输出结果
在这里插入图片描述

3. 解释代码
  • calculateSimilarity方法:该方法接收两个字符串参数,计算它们之间的Levenshtein距离,并转换成相似度。相似度计算公式是 1 - (编辑距离 / 最大字符串长度)。这样得到的相似度越接近1,表示两个字符串越相似。

  • main方法:这是程序的入口。我们定义了一个用户输入的问题和一组已知问题。程序遍历这些已知问题,计算每一个问题与用户输入问题之间的相似度,并找出相似度最高的问题作为最佳匹配。

4. 总结

通过这个例子,我们可以看到Levenshtein距离是如何帮助我们在实际应用中匹配用户问题的。这种方法不仅适用于问答系统,还可以用于任何需要衡量文本相似度的场景,如搜索引擎优化、数据清洗等。

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

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

相关文章

BUUCTF-WEB(第二天)

[极客大挑战 2019]Http 这题明显考察的是http协议&#xff0c;打开靶场访问什么也没有&#xff0c;F12来查看看控制台的html源码&#xff0c;直到最后那里我们才看到一个Secret.php文件4&#xff0c;所以直接访问即可。 回显字符串&#xff1a;It doesnt come from https://S…

检索增强生成 (RAG):揭开这一术语的神秘面纱并解释其带来的价值

一、介绍 如今&#xff0c;数据已成为新的黄金&#xff0c;而高效筛选这些丰富信息的能力则是成功企业脱颖而出的关键。Retrieval Augmented Generation&#xff08;RAG&#xff09;是创新的标杆&#xff0c;尤其是在知识管理领域。它不再只是为了存储信息&#xff0c;而是为了…

记录处理宏病毒的过程

以下是堂弟个人电脑中毒的处理过程&#xff0c;作为网络安全从业人员&#xff0c;第一次遇到宏病毒&#xff0c;以前只是听过过这种病毒&#xff0c;从未见过。 一、中毒原因 电脑使用人没有安全意识&#xff0c;为了玩游戏&#xff0c;在淘宝买了破解版的游戏&#xff0c;并让…

十二、Yocto集成ROS2 app程序(package)

文章目录 Yocto集成ROS2 app程序1. 添加一个ros2 package应用程序2. 添加bb文件集成app应用程序 Yocto集成ROS2 app程序 本篇文章为基于raspberrypi 4B单板的yocto实战系列的第十二篇文章&#xff1a; 一、yocto 编译raspberrypi 4B并启动 二、yocto 集成ros2(基于raspberrypi…

六、常用API ★ ✔

六、常用API 模块14.基础API第一章.String1.String介绍2.String的实现原理 ★3.String的创建 &#xff08;无参、字符串、字符数组、字节数组&#xff09;4.String 面试题【String s new String("abc")】5.字符串常见问题 第二章.String的方法1.判断方法&#xff08…

spring boot 3.0.1多模块项目使用nacos动态配置

根pom文件增加&#xff0c;spring-cloud-alibaba包管理&#xff0c;注意版本spring-boot 3.0.3&#xff0c;spring-cloud-alibaba 2022.0.0.0-RC1 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0…

次世代霍尔电磁摇杆搭配磁悬浮马达,这款手柄手感超丝滑,谷粒金刚3Pro体验

燥热的天气里&#xff0c;周末在家打上几局游戏&#xff0c;确实更容易放松身心&#xff0c;玩游戏的时候&#xff0c;键鼠、手柄一类的游戏外设特别重要&#xff0c;对我们的游戏体验影响很大&#xff0c;所以挑选起来总是格外挑剔。现在国产的游戏手柄已经今非昔比了&#xf…

单目操作符

目录 ! --- 逻辑反操作 & --- 取地址操作符 * --- 间接访问操作符&#xff08;解引用操作符&#xff09; sizeof --- 操作数的类型长度&#xff08;单位为字节&#xff09; ~ --- 对一个数的补码二进制按位取反 前置和前置-- 后置和后置-- (类型) --- 强制类型转换…

基于Java的大学生租房系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架&#xff0c;MVC模式 工具&#xff1a;Vscode&#xff0c;MySQL&#xff0c;B/S架构…

数据结构-分析期末选择题考点(串、数组)

竹月光中诗世界 松风影里酒生涯 目录 串的常见考法&#xff08;一&#xff09;BF算法 串的常见考法&#xff08;二&#xff09;KMP求 next数组 串的常见考法&#xff08;三&#xff09;串的概念及性质 串的常见考法&#xff08;四&#xff09;给出主串求子串数量 数组的常见…

Postman 怎么测接口?实用教程

在当前&#xff0c;API&#xff08;应用程序接口&#xff09;的使用变得越来越普遍。其中&#xff0c;HTTP/HTTPS API 是最常见的一种。无论是开发前端还是后端&#xff0c;测试 API 都是一个关键环节。Postman 是一种流行且强大的 API 测试工具&#xff0c;能够帮助开发人员轻…

【php】【mysql】【layui】 原生初级简易留言簿系统成品代码动态网站开发网页WEB浏览器端B/S结构

更多项目点击&#x1f446;&#x1f446;&#x1f446;完整项目成品专栏 【php】【mysql】【layui】 原生初级简易留言簿系统成品代码动态网站开发网页WEB浏览器端B/S结构 获取源码方式项目说明&#xff1a;文件包含&#xff1a;项目运行环境项目运行截图 获取源码方式 加Q群…

ASUS/华硕幻13 2022 GV301R系列 原厂Windows11系统

安装后恢复到您开箱的体验界面&#xff0c;带原机所有驱动和软件&#xff0c;包括myasus mcafee office 奥创等。 最适合您电脑的系统&#xff0c;经厂家手调试最佳状态&#xff0c;性能与功耗直接拉满&#xff0c;体验最原汁原味的系统。 原厂系统下载网址&#xff1a;http:…

jeecg启动微服务并注册到本地nacos

1、maven勾选环境和微服务模式&#xff0c;并刷新 2、pom文件修改nacos注册地址 3、本地启nacos gateway 和自己想要的cloud下面的模块pos sys 4、打断点测试接口&#xff0c;访问gateway端口和想要测试的地址

抖音团购达人实战营,抖音团购达人从0-1教程(11节课)

课程目录&#xff1a; 1-团购达人先导课1.mp4 2-账号措建.mp4 2-账号搭建_1.mp4 3-开通团购达人_1.mp4 4-账号养号涨粉套路_1.mp4 5-团购选品正确姿势_1.mp4 6-短视频之混剪课_1.mp4 7-短视频之图文课_1.mp4 8-短视频之口播课_1.mp4 9-短视频运营策略_1.mp4 10-团购…

搭建企业内网pypi镜像库,让python在内网也能像互联网一样安装pip库

目录 知识点实验1.服务器安装python2.新建一个目录/mirror/pip&#xff0c;用于存储pypi文件&#xff0c;作为仓库目录3.下载python中的所需包放至仓库文件夹/mirror/pip3.1. 新建requirement.py脚本&#xff08;将清华pypi镜像库文件列表粘贴到requirement.txt文件中&#xff…

宝塔计划任务调用node程序时,log4js日志保存本地位置会发生变化

接我上一篇文章的情况 超简单的nodejs使用log4js保存日志到本地&#xff08;可直接复制使用&#xff09;-CSDN博客 原本应当保存在node项目目录下的日志文件&#xff0c;如果使用宝塔的计划任务来定时执行的话&#xff0c;日志保存路径会发生变化到如下图的位置&#xff1a; 如…

MyBatis-关联查询的对象是集合的处理

用户和角色之间是多对多的关系&#xff0c;也就是说&#xff0c;一个用户可以有多个角色与之绑定&#xff0c;所以在User对象中&#xff0c;角色的属性就必须是一个集合Set或者List&#xff0c;这里我们就用List集合在做例子&#xff1a; 1.怎么在Mybatis中实现关联的List集合对…

脚本实现登陆滑块

脚本实现登陆滑块 仅供学习参考&#xff0c;简单操作 你知道吗&#xff0c;滑动验证码居然是为了验证人类比机器人蠢而设计的。 你以为自己快速、准确地滑动拼图、对齐图案&#xff0c;才被允许通过&#xff0c;系统还说你超越了99%的用户&#xff0c;夸你“比闪电还快”&am…

【逆运动学】六轴机器人运动学逆解上位机控制

六轴机器人逆运动学上位机控制 最终效果 通过开发的上位机软件&#xff0c;实现对机械臂末端的精准操控。该软件接收输入的坐标与角度参数&#xff0c;经过算法处理计算出机械臂各关节轴的目标角度。随后&#xff0c;这些角度值被转换为对应的脉冲宽度调制&#xff08;PWM&am…