优化编辑距离以测量文本相似度

一、说明

        编辑距离是一种文本相似度度量,用于测量 2 个单词之间的距离。它有许多方面应用,如文本自动完成和自动更正。

        对于这两种用例中的任何一种,系统都会将用户输入的单词与字典中的单词进行比较,以找到最接近的匹配项,然后提出建议。字典可能包含数千个单词,因此应用程序比较 2 个单词的响应可能需要几毫秒。

        编辑距离通常是通过准备一个大小矩阵(M+1)x(N+1)(其中 M 和 N 是 2 个单词的长度)并使用 2 个 for 循环遍历所述矩阵,在每次迭代中执行一些计算来计算的。这使得计算一个单词与数千个单词的字典之间的距离非常耗时。

        为了加快编辑距离的计算速度,本教程使用向量而不是矩阵进行计算,这样可以节省大量时间。我们将使用 Java 编写此实现的代码。

本教程涵盖的部分如下:

  • 为什么使用向量而不是矩阵?
  • 使用向量
  • Java实现

二、为什么使用向量而不是矩阵?

        首先,在使用向量之前,让我们快速总结一下矩阵的距离计算是如何进行的。

        对于 2 个单词,例如niceniace,将创建一个大小矩阵5x6,如下图所示。请注意,蓝色标签不是矩阵的一部分,只是为了清晰起见而添加的。您可以自由决定让给定的单词代表行或列。在此示例中,单词的字符nice代表行。

        请注意,矩阵中还有额外的行和列,它们与 2 个单词中的任何字符都不对应。它们放置在那里是为了帮助计算距离。

        矩阵的第一行和第一列由从每个字符开始0并递增的值初始化。1例如,第一行的值从 0 到 5。请注意,2 个单词之间的最终距离位于右下角,但要达到它,我们必须计算 2 个单词中所有子集之间的距离。字。

        根据初始化的矩阵,将计算 2 个单词的所有子集之间的距离。该过程首先将第一个单词中的第一个子集(仅包含 1 个字符)与第二个单词中的所有子集进行比较。然后将第一个单词的另一个子集(包含 2 个字符)与第二个单词的所有子集进行比较,依此类推。

        根据上图中的矩阵,该单词的第一个字符nicen。它将与第二个单词的所有子集进行比较niace——即使是具有零个字符的子集{_, n, ni, nia, niac, niace}

        让我们看看这两个子集之间的距离是如何计算的。(i,j)对于与 2 个字符A和之间的交集对应的位置处的给定单元格B,我们比较 3 个位置 ( i,j-1)、( i-1,j) 和 ( i-1,j-1) 处的值。如果 2 个字符相同,则位置 ( ) 处的值i,j等于上述 3 个位置中的最小值。否则,它将等于添加 后这 3 个位置处的最小值1

        这里需要注意一点。在计算矩阵第二行中的距离时,位置 ( i-1,j) 和 ( )处的单元格i-1,j-1只是索引。对于矩阵第二列中的距离,位置 ( i,j-1) 和 ( i-1,j-1) 处的单元格也只是索引。

        前面的讨论可以表示为 4 个值的矩阵,其中有 3 个已知值和 1 个缺失值,如下图所示。

        此类缺失值是通过根据以下方式比较 3 个值来计算的:

dist(X,Y) = min(a, b, c)      -   if X==Y
dist(X,Y) = min(a, b, c) + 1  -   if X!=Y

通过应用该方法,下图给出了矩阵第二行中的值。

        计算完第二行的距离后,将不再需要第一行的距离。对于第三行距离,我们仅使用第二行中的值,而不是第一行中的值。

        换句话说,我们只需要单行已知值来计算一行未知值的距离,不需要整个矩阵。在每行仅使用一次的情况下,使用矩阵计算距离可以保存所有行。

        为了解决这个问题,我们根本不会使用矩阵,而是使用向量。

三、使用向量

        要使用向量计算距离,第一步是创建该向量。向量长度将等于给定单词的长度+1nice如果选择第一个单词,则向量长度为4+1=5​​ 。该向量由零初始化,如下所示。

   nice该向量中的零将被所选单词中的所有子集与另一个单词中的第一个子集niace(即字符)之间的距离替换n。我们如何计算这样的距离?

        当使用矩阵时,需要比较 3 个值,如上一节所述。向量的情况是什么?仅在计算与第二个单词中的第一个子集的距离时,仅需要比较 2 个值。

        假设我们正在计算具有索引的元素的距离,i并且距离向量名为distanceVector,那么这 2 个值如下:

  1. 之前计算的距离:distanceVector[i-1]
  2. 前一个元素的索引:i-1

        返回的距离是这两个值中的最小值:

distanceVector[i] = min(distanceVector[i-1], i-1)

nice这是计算单词的所有子集与第二个单词的第一个子集之间的距离后的向量niace

在计算第一个单词的所有子集和第二个单词的第一个子集之间的距离之后,我们可以开始计算第一个单词中的所有子集和第二个单词中的其余子集之间的距离。距离将通过比较以下 3 个值来计算:

  1. 之前计算的距离:distanceVector[i-1]
  2. 之前计算的距离:distanceVector[i]
  3. 与第二个单词进行比较的元素的索引:j

请注意,i指的是从第一个单词开始的元素索引。

现在我们已经阐明了编辑距离在矩阵和向量中的工作原理,下一节将通过 Java 中的向量实现该距离。

四、Java实现

String除了初始化距离向量之外,要做的第一件事是创建 2 个保存 2 个单词的变量。下面是 Java 中的实现方法:

String token1 = "nice";
String token2 = "niace";
​
int[] distances = new int[token1.length() + 1];

        向量创建后,默认会初始化为零。下一步是使用for循环计算第一个单词niace 中的所有子集nice与第二个单词中的第一个子集之间的距离。

for (int t1 = 1; t1 <= token1.length(); t1++) {
    if (token1.charAt(t1 - 1) == token2.charAt(0)) {
        distances[t1] = calcMin(distances[t1 - 1], t1 - 1);
    } else {
        distances[t1] = calcMin(distances[t1 - 1], t1 - 1) + 1;
    }
}

int calcMin(int a, int b, int c) {
    if (a <= b && a <= c) {
        return a;
    } else if (b <= a && b <= c) {
        return b;
    } else {
        return c;
    }
}

        下一步也是最后一步是根据以下代码计算第一个单词中的所有子集与第二个单词中的其余子集之间的距离:

int dist = 0;
for (int t2 = 1; t2 < token2.length(); t2++) {
    dist = t2 + 1;
    for (int t1 = 1; t1 <= token1.length(); t1++) {
        int tempDist;
        if (token1.charAt(t1 - 1) == token2.charAt(t2)) {
            tempDist = calcMin(dist, distances[t1 - 1], distances[t1]);
        } else {
            tempDist = calcMin(dist, distances[t1 - 1], distances[t1]) + 1;
        }
        distances[t1 - 1] = dist;
        dist = tempDist;
    }
    distances[token1.length()] = dist;
}

int calcMin(int a, int b, int c) {
    if (a <= b && a <= c) {
        return a;
    } else if (b <= a && b <= c) {
        return b;
    } else {
        return c;
    }
}

        两个单词之间的最终距离被保存到变量dist和向量的最后一个元素中distances

        这是一个名为 的完整类LevenshteinDistance,其中名为 的方法levenshtein()保存了计算距离的代码。该方法接受 2 个单词作为参数并返回距离。在该main()方法内部,创建该方法的一个实例来计算 2 个单词nice和之间的距离niace

        前面代码的打印输出是:

The distance is 1

        这是使用两个不同单词计算距离的另一个示例:

System.out.println("The distance is " + levenshteinDistance.levenshtein("congratulations", "conmgeautlatins"));

结果如下:

The distance is 5

五 、结论

        本教程讨论了仅使用向量来计算编辑距离以返回单词之间的距离。经过优化,仅使用向量,它可以应用于移动设备上运行的应用程序,以便在用户键入搜索或其他文本输入时自动完成和更正单词。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Seata之TCC模式解读

目录 基本介绍 起源 概述 案例流程分析 TCC注意事项 空回滚 幂等 悬挂 具体使用 LocalTCC TwoPhaseBusinessAction 小结 基本介绍 起源 关于TCC的概念&#xff0c;最早是由Pat Helland于2007年发表的一篇名为《Life beyond Distributed Transactions:an Apost…

《网络协议》05. 网络通信安全 · 密码技术

title: 《网络协议》05. 网络通信安全 密码技术 date: 2022-09-10 15:16:15 updated: 2023-11-12 07:03:52 categories: 学习记录&#xff1a;网络协议 excerpt: 网络通信安全&#xff08;ARP 欺骗&#xff0c;DoS & DDoS&#xff0c;SYN 洪水攻击&#xff0c;LAND 攻击&a…

2个器件,做1个恒流源

在项目中经常要用到恒流源&#xff0c;查找资料可以使用电压源芯片LM317构造一个电流源芯片。本文将电压源加上一个电阻改为电流源&#xff0c;这种设计思路可以扩展到其他类型的电源芯片上&#xff0c;如开关电源及其他类型的线性电源&#xff0c;关键点在于基准电压VREF的使用…

数据库 关系数据理论

问题 数据冗余更新异常插入异常删除异常 一个好的模式应当不会发生插入异常、删除异常和更新异常&#xff0c;数据冗余应尽可能少 数据依赖 定义&#xff1a;一个关系内部属性与属性之间的一种约束关系&#xff08;该约束关系是通过属性间值的相等与否体现出来数据间相关联…

git02->gui图形化界面使用,ssh协议,idea集成GIT

gui图形化界面使用ssh协议idea集成GIT 1.gui图形化界面使用 2.ssh协议 git/github生成密钥并通过 操作分为本地电脑配置和github网站配置 第一步&#xff1a;本地电脑配置 右键空白处&#xff0c;选择Git Bash Here打开相关命令窗口 1.配置用户名和邮箱&#xff08;如果已经配…

Go 14岁了

今天我们庆祝Go开源十四周年&#xff01;Go度过了美好的一年&#xff0c;发布了两个功能齐全的版本和其他重要的里程碑。 我们在2月份发布了Go 1.20&#xff0c;在8月份发布了Go 1.21&#xff0c;更多地关注实现改进而不是新的语言更改。 在Go 1.20中&#xff0c;我们预览了配置…

基于多尺度分形残差注意力网络的超分辨率重建算法

1.引言 深度神经网络可以显著提高超分辨率的质量&#xff0c;但现有方法难以充分利用低分辨率尺度特征和通道信息&#xff0c;从而阻碍了卷积神经网络的表达能力。针对此类问题&#xff0c;本章提出了一种多尺度分形残差注意力网络&#xff08;Multi-scale Fractal Residual A…

优秀智慧园区案例 - 深圳特区建发创智云城智慧园区,万字长文解析先进智慧园区建设方案经验

一、项目背景 1、项目背景 创智云城项目位于大湾区核心城市之一的深圳&#xff0c;且地处GDP第一的科技创新核心区——南山区&#xff0c;136万㎡新兴产业智慧之城矗立于湾区核心创新高地。项目所处西丽湖国际科教城&#xff0c;最具发展潜力&#xff0c;规划全域面积约57平方…

JavaWeb Day09 Mybatis-基础操作02-XML映射文件动态SQL

目录 Mybatis动态SQL介绍​编辑 一、案例 ①Mapper层 ②测试类 ③EmpMapper.xml ④结果​ 二、标签 &#xff08;一&#xff09;if where标签 ​①EmpMapper.xml ②案例 ③总结 &#xff08;二&#xff09;foreach标签 ①SQL语句 ②Mapper层 ③EmpMapper.xml ④…

N-133基于springboot,vue小说网站

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatis-plus 本项…

141.环形链表(LeetCode)

想法一 快慢指针&#xff0c;设置slow和fast指针&#xff0c;slow一次走一步&#xff0c;fast一次走两步&#xff0c;如果链表有环&#xff0c;它们最终会相遇&#xff0c;相遇时返回true&#xff1b;如果链表无环&#xff0c;它们最终走到空&#xff0c;跳出循环&#xff0c;…

企业邮箱本地私有化部署解决方案

随着互联网化进程不断深入&#xff0c;加快推进企业信息化系统建设&#xff0c;已经成为提高企业核心竞争力的重要途径。企业对企业邮箱系统的需求越来越大&#xff0c;企业邮箱系统作为企业级通讯工具中的利器&#xff0c;在协同办公和内外业务交流上发挥着无可替代的巨大作用…

国际阿里云:Windows系统ECS实例中CPU使用率较高问题的排查及解决方案!!

问题现象 Windows系统ECS实例中CPU使用率较高&#xff0c;即CPU使用率≥80%。 问题原因 CPU使用率较高可能有以下原因。 ECS实例遭到病毒木马入侵。 ECS实例中第三方杀毒软件运行。 ECS实例中应用程序异常、驱动异常、高I/O使用率或高中断处理的应用程序。 解决方案 步骤…

[工业自动化-13]:西门子S7-15xxx编程 - 分布式从站 - 硬件配置

目录 前言&#xff1a; 一、通过博图软件完成对ET200 SP分布式从站的硬件配置 二、从站组态配置的常见问题与解决 三、分布式从站与CPU的profiNet连接 3.1 概述 3.2 配置主站与从站的profinet连接 四、Profinet和普通以太网区别 4.1 概述 4.2 协议栈 五、主站与从站连…

将复数中的虚部取反 即对复数求共轭 numpy.conjugate()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 将复数中的虚部取反 即对复数求共轭 numpy.conjugate() [太阳]选择题 请问以下代码中执行语句输出结果是&#xff1f; import numpy as np a np.array([1 2j, 3 - 4j]) print("【显示…

图论13-最小生成树-Kruskal算法+Prim算法

文章目录 1 最小生成树2 最小生成树Kruskal算法的实现2.1 算法思想2.2 算法实现2.2.1 如果图不联通&#xff0c;直接返回空&#xff0c;该图没有mst2.2.2 获得图中的所有边&#xff0c;并且进行排序2.2.2.1 Edge类要实现Comparable接口&#xff0c;并重写compareTo方法 2.2.3 取…

SAM + YOLO 智能抠图

在计算机视觉领域&#xff0c;对象检测和实例分割是使机器能够理解视觉数据并与之交互的关键任务。 准确识别和隔离图像中的物体的能力具有许多实际应用&#xff0c;从自动驾驶车辆到医学成像。 在这篇博文中&#xff0c;我们将探索如何在 Roboflow 和 Ultralytics YOLOv8 的帮…

服务器安全组端口规则配置手册

具体操作如下&#xff1a; 1、配置规则 进入服务器实例列表&#xff0c;服务器&#xff0c;选择安全组&#xff0c;点击右侧配置规则 2、添加安全组规则 点击右上方添加安全组规则 3、添加端口 添加6个端口&#xff1a;80,21,8888,888,443,3306&#xff0c;授权对象&#x…

openEuler编译安装nmon性能监控工具及可视化分析工具

ln 介绍 nmon&#xff08;short for Nigel’s Monitor&#xff09;是一个性能分析工具&#xff0c;由蓝色巨人IBM开发&#xff0c;最早用于自家操作系统UNIX&#xff0c;AIX &#xff08;Advanced Interactive eXecutive&#xff09;。现在也能用在Linux上。它可以显示系统的…

跨域:利用JSONP、WebSocket实现跨域访问

跨域基础知识点&#xff1a;跨域知识点 iframe实现跨域的四种方式&#xff1a;http://t.csdnimg.cn/emgFr 注&#xff1a;本篇中使用到的虚拟主机也是上面iframe中配置的 目录 JSONP跨域 JSONP介绍 跨域实验&#xff1a; WebSocket跨域 websocket介绍 跨域实验 JSONP跨域…