06.C2W1.Auto-correct

往期文章请点这里

目录

  • Overview
  • Autocorrect
    • What is autocorrect?
    • How it works
  • Building the model
  • Minimum edit distance
  • Minimum edit distance algorithm
  • Minimum edit distance Part 2
  • Minimum edit distance Part 3

往期文章请点 这里

Overview

本周学习目标:
●What is autocorrect?
●Building the model
●Minimum edit distance
●Minimum edit distance algorithm
在这里插入图片描述

Autocorrect

What is autocorrect?

Autocorrect 是一个自动更正输入错误的功能,通常集成在智能手机、电脑或其他电子设备的输入法中。当用户输入文本时,Autocorrect 会检测到拼写错误或语法错误,并自动更正它们,以提高输入效率和准确性。这个功能通过内置的字典和算法来识别和纠正错误,有时还会根据用户的输入习惯和常用词汇进行个性化调整。然而,Autocorrect 有时也会因为误解用户的意图而更改正确的单词或短语,导致一些有趣的错误或误解。
在这里插入图片描述
中文输入法其实也有,例如sougou的模糊音设置(兰方人表示很赞)
在这里插入图片描述
正确的autocorrect
在这里插入图片描述
错误的autocorrect,改的单词没有问题,但是不符合上下文
在这里插入图片描述

How it works

  1. Identify a misspelled word
  2. Find strings n edit distance away
  3. Filter candidates
  4. Calculate word probabilities

示例:
先找到一个错误单词:deah
找到n个候选编辑距离:
_eah
d_ar
de_r

etc
过滤候选词:
yeah
dear
dean

etc
计算候选词的概率,选最大那个:dear

Building the model

1.Identify a misspelled word
最简单的方法就是通过词库判断,当然这个判断不一定准确:

if word not in vocab:misspelled =True

2.Find strings n edit distance away
这里n可以是1,2,3,等等。
这里的编辑是指:an operation performed on a string to change it,主要包括:
Insert (add a letter),例如对于‘to’在不同位置插入不同的单个字母可以得到不同单词‘top’, ‘two’
Delete (remove a letter),例如‘hat’在不同位置删除不同的单个字母可以得到不同结果: ‘ha’, ‘at’, ‘ht’
Switch (swap 2 adjacent letters),例如letters)‘eta’交换任意两个字母的位置可以得到: ‘eat’,‘tea’,这里指的是交换两个字母的位置,类似‘ate’是不符合交换这个概念的。
Replace (change 1 letter to another),例如‘jaw’替换任意一个字母得到:‘jar’,‘paw’,…
这个步骤就是根据给定的字符串,使用以上四种编辑方式,找出所有可能在n个编辑距离的结果,形成候选词列表
3.Filter candidates
对候选词列表进行过滤,这里直接简单粗暴的使用第一步中的方法,将候选词列表中不在词库的单词去掉。
4.Calculate word probabilities
Example: “I am happy because I am learning”
假设语料库就是这个句子,则单词概率可以从下表计算:
在这里插入图片描述
计算公式为:
P ( w ) = C ( w ) V P(w)=\cfrac{C(w)}{V} P(w)=VC(w)
例如单词am的概率为: P ( a m ) = C ( w ) V = 2 7 P(am)=\cfrac{C(w)}{V}=\cfrac{2}{7} P(am)=VC(w)=72
在autocorrect中,我们只需要找到单词概率最高的那个候选词即可。

Minimum edit distance

主要内容:
● How to evaluate similarity between 2 strings?
● Minimum number of edits needed to transform 1 string
into the other
最小编辑距离在以下任务有应用:Spelling correction, document similarity, machine
translation, DNA sequencing, and more
已知的编辑操作有三种:Insert,Delete ,Replace (这里吧Switch给剔除了,估计这个操作复杂度挺高)

计算单词play到stay的编辑次数:
p → s : replace
l → t : replace
一共两次
除了考虑编辑次数,还需要考虑编辑的代价,例如:

编辑操作编辑代价
Insert1
Delete1
Replace2

上面play到stay的编辑代价为:2×2=4
我们需要最小化编辑距离就是要最小化所有所需编辑代价的总和。
例子:
如果要对很长的单词、甚至超长DNA序列找最小编辑距离:
在这里插入图片描述
如果采用枚举的方式将所有操作对字符串序列进行遍历,会使用很长时间。
下面将讲解表格法(动态规划)来加速枚举所有可能的字符串和编辑操作。

Minimum edit distance algorithm

Source: play → Target: stay
将源单词和目标单词按以下方式排列:
在这里插入图片描述
每个单词的起始处加上井号,我们的目标是填充中间的空白矩阵 D D D
在这里插入图片描述
D[2,3] = pl → sta,表示pl到sta的最小距离,这里pl是单词play的前两个字母,sta是目标单词stay的前三个字母,也可以表示为:D[2,3] = source[:2] → target[:3],更通用的形式是
D [ i , j ] = s o u r c e [ : i ] → t a r g e t [ : j ] D[ i , j ] = source[ : i ] → target[ : j] D[i,j]=source[:i]target[:j]
当填充到矩阵的右下角D[m,n]的时候,就得到了整个字符串的最小编辑距离。
D [ m , n ] = s o u r c e → t a r g e t D[ m , n ] = source → target D[m,n]=sourcetarget
在这里插入图片描述
填充顺序是从左上角开始,向下再向右:
在这里插入图片描述
下面来看具体步骤:
#号代表空白字符,从空白到空白字符(# → #)编辑代价为0:
在这里插入图片描述
从p到空白字符编辑操作是delete,编辑代价是1:
在这里插入图片描述
从空白字符到s编辑操作是insert,编辑代价是1:
在这里插入图片描述
从p到s编辑操作可有多种
1.insert+ delete(p → ps → s),编辑代价是2:
2.delete+ insert(p → # → s),编辑代价是2:
3.replace(p → s),编辑代价是2:
其实这些不同编辑操作得到的2是基于前面算出来的结果进行计算得到的,例如第一种操作中的插入s已经算过了就是1,然后是删除p也是1,最后加起来就是2,路径是紫色+一个删除;第二种操作是蓝色+一个插入
对于第三种,我们可以看做是从空白处出发,直接到替换操作,其代价是0+2。
在这里插入图片描述
可以看到,整个填充过程是基于之前的计算结果来进行的,下面我们将把这一过程通用化为一个公式,以便于填充矩阵的剩余部分。

Minimum edit distance Part 2

这里我们来填写第一列的内容:
在这里插入图片描述

使用以下公式:
D [ i , j ] = D [ i − 1 , j ] + d e l _ c o s t D[ i , j ] = D [ i-1, j ] + del\_cost D[i,j]=D[i1,j]+del_cost
在这里插入图片描述
D [ 4 , 0 ] D[4,0] D[4,0]处,得到的是从play到空白字符串的最小编辑距离,相当于删除4个字母的成本。
同样的对于第一行,使用以下公式:
D [ i , j ] = D [ i , j − 1 ] + i n s _ c o s t D[ i , j ] = D [ i , j -1 ] + ins\_cost D[i,j]=D[i,j1]+ins_cost
可以得到:
在这里插入图片描述
进一步给出通用公式:
D [ i , j ] = { D [ i − 1 , j ] + del_cost D [ i , j − 1 ] + ins_cost D [ i − 1 , j − 1 ] + { rep_cost ; if  s r c [ i ] ≠ t a r [ j ] 0 ; if  s r c [ i ] = t a r [ j ] D[i, j] = \begin{cases} D[i-1, j] + \text{del\_cost} \\ D[i, j-1] + \text{ins\_cost} \\ D[i-1, j-1] + \begin{cases}\text{rep\_cost};& \text{if } src[i] \neq tar[j]\\0; & \text{if } src[i] = tar[j]\end{cases} \\ \end{cases} D[i,j]= D[i1,j]+del_costD[i,j1]+ins_costD[i1,j1]+{rep_cost;0;if src[i]=tar[j]if src[i]=tar[j]
例如:
在这里插入图片描述

D [ i − 1 , j ] + 1 = 2 D [ i , j − 1 ] + 1 = 2 D [ i − 1 , j − 1 ] + 2 = 2 } min = 2 \left.\begin{matrix} D[i-1, j] + 1 = 2\\ D[i, j-1] + 1 = 2\\ D[i-1, j-1] + 2 = 2 \end{matrix}\right\}\text{min} = 2 D[i1,j]+1=2D[i,j1]+1=2D[i1,j1]+2=2 min=2
接下来填充剩余部分:
在这里插入图片描述
用热图显示,可以观察到,由于两个单词最后两个字母都是ay,所以对角线的编辑距离代价到4之后就不再变化了。
在这里插入图片描述

Minimum edit distance Part 3

总结需要用到的三个东西:
●Levenshtein distance
●Backtrace
●Dynamic programming

Levenshtein distance(莱温斯坦距离):
莱温斯坦距离是一种度量两个序列(例如两个字符串)差异的方法,通过计算将一个序列转换为另一个序列所需的最少单字符编辑(插入、删除或替换)次数。
在Minimum edit distance问题中,Levenshtein distance提供了一种量化两个字符串之间差异的标准。

Backtrace(回溯):
在动态规划问题中,回溯是一种从最终结果反向工作到初始状态的过程,目的是找到达到该结果的路径或解决方案。
对于Minimum edit distance,回溯可以帮助我们从动态规划表的最终状态开始,逆向追踪出将一个字符串转换为另一个字符串所需的具体编辑操作序列。

Dynamic programming(动态规划):
动态规划是一种算法策略,用于解决具有重叠子问题和最优子结构特性的问题。它通过将问题分解为更小的子问题,并将子问题的解存储起来(通常是在表格中),以避免重复计算,从而提高效率。
在计算Minimum edit distance时,动态规划用于构建一个表格,其中每个单元格代表将两个字符串的前i个字符和前j个字符转换所需的最小编辑次数。通过填充这个表格,我们可以找到将整个字符串转换所需的最小编辑次数。

这三个概念在Minimum edit distance问题中的应用通常遵循以下步骤:

  1. 使用动态规划构建一个表格,其中表格的每个元素D[i, j]代表将源字符串的前i个字符转换为目标字符串的前j个字符所需的最小编辑次数。
  2. 通过比较源字符串和目标字符串的相应字符,根据是否需要插入、删除或替换字符来更新表格中的值。
  3. 一旦表格被完全填充,最终的最小编辑距离就是表格中对应于两个字符串长度的元素D[m, n]的值,其中m和n分别是两个字符串的长度。
  4. 如果需要找到实际的编辑序列,可以通过回溯从D[m, n]开始,逆向追踪到表格的起点,以确定哪些编辑操作被执行了。

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

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

相关文章

嵌入式鸿蒙系统openharmony编译方法详解

大家好,时光如梭,今天主要给大家分享一下,鸿蒙系统的使用方法,以及源码该如何编译,其中要注意的细节有哪些? 第一:OpenHarmony系统简介 OpenHarmony 是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目, 目标是面向全场景、全连接、全智能时代,基于…

数据结构之“队列”(全方位认识)

🌹个人主页🌹:喜欢草莓熊的bear 🌹专栏🌹:数据结构 前言 上期博客介绍了” 栈 “这个数据结构,他具有先进后出的特点。本期介绍“ 队列 ”这个数据结构,他具有先进先出的特点。 目录…

秋招提前批面试经验分享(上)

⭐️感谢点开文章👋,欢迎来到我的微信公众号!我是恒心😊 一位热爱技术分享的博主。如果觉得本文能帮到您,劳烦点个赞、在看支持一下哈👍! ⭐️我叫恒心,一名喜欢书写博客的研究生在读…

【Java EE】Spring Boot配置文件

Spring Boot配置文件 一、配置文件的分类 一共有三类,分别是 properties, yml, yaml,其中properties相当于是老版,yml是yaml的缩写,这两个相当于新版。 二、配置文件的语法 1. properties 语法的构成是以"." 为分隔…

PingCAP 成为全球数据库管理系统市场增速最快的厂商

近日,Gartner 发布的《Market Share Analysis: Database Management Systems, Worldwide, 2023》(2024 年 6 月)报告显示:“2023 年全球数据库管理系统(DBMS)市场的增长率为 13.4%,略低于去年的…

【Spring AOP 源码解析前篇】什么是 AOP | 通知类型 | 切点表达式| AOP 如何使用

前言(关于源码航行) 在准备面试和学习的过程中,我阅读了还算多的源码,比如 JUC、Spring、MyBatis,收获了很多代码的设计思想,也对平时调用的 API 有了更深入的理解;但过多散乱的笔记给我的整理…

【Linux系统编程】文件系统

介绍: 文件系统是操作系统中负责管理和存储文件信息的软件结构,它组织和管理磁盘上的文件和目录,并定义了文件的存储结构。 Linux文件系统采用树状结构,只有一个根目录(用“/”表示),其中含有下…

【Linux】:程序地址空间

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux程序地址空间的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从…

GD32实战篇-双向数控BUCK-BOOST-BUCK降压理论基础

本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发 向上代码兼容GD32F450ZGT6中使用 后续项目主要在下面该专栏中发布: https://blog.csdn.net/qq_62316532/category_12608431.html?spm1001.2014.3001.5482 感兴趣的点个关注收藏一下吧! 电机驱动开发可以跳转…

【驱动篇】龙芯LS2K0300之ADC驱动

实验目的 由于LS2K0300久久派开发板4.19内核还没有现成可用的ADC驱动,但是龙芯官方的5.10内核已经提供了ADC驱动,想要在4.19内核使用ADC就要参考5.10内核移植驱动,本次实验主要是关于ADC驱动的移植和使用 驱动移植 主要的驱动代码主要有3个…

【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(十二)-管道、环境变量、常用命令

大致介绍了一下管道、环境变量、一些常用的基本命令,可以当作学习笔记收藏学习一下!!! 文章目录 前言 一、管道 二、环境变量 1.概念 2.查看 3.修改 4.常用环境变量 三、系统状况 总结 前言 大致介绍了一下管道、环境变量、一些常…

【数据结构与算法】快速排序霍尔版

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法》 期待您的关注 ​

#数据结构 笔记一

数据结构是计算机存储、组织数据的方式。 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。数据结构是带有结构特性的数据元素的集合,它研究的是数据的逻辑结构和物理结构以及它们之间的相互关系,并对这种结构定义相适应的运算&#xff0…

STM32实现硬件IIC通信(HAL库)

文章目录 一. 前言二. 关于IIC通信三. IIC通信过程四. STM32实现硬件IIC通信五. 关于硬件IIC的Bug 一. 前言 最近正在DIY一款智能电池,需要使用STM32F030F4P6和TI的电池管理芯片BQ40Z50进行SMBUS通信。SMBUS本质上就是IIC通信,项目用到STM32CubeMXHAL库…

华为机试HJ51输出单向链表中倒数第k个结点

华为机试HJ51输出单向链表中倒数第k个结点 题目: 想法: 因为要用链表,且要找到倒数第k个结点,针对输入序列倒叙进行构建链表并找到对应的元素输出。注意因为有多个输入,要能接受多次调用 class Node(object):def __…

OSS存储桶漏洞总结

简介 OSS,对象存储服务,对象存储可以简单理解为用来存储图片、音频、视频等非结构化数据的数据池。相对于主机服务器,具有读写速度快,利于分享的特点。 OSS工作原理: 数据以对象(Object)的形式…

mac|Mysql WorkBench 或终端 导入 .sql文件

选择Open SQL Script导入文件 在第一行加入use 你的schema名字,相当于选择了这个schema 点击运行即可将sql文件导入database 看到下面成功了即可 这时候可以看看左侧的目标database中有没有成功导入table,如果没有看到的话,可以点一下右上角的…

25_嵌入式系统总线接口

目录 串行接口基本原理 串行通信 串行数据传送模式 串行通信方式 RS-232串行接口 RS-422串行接口 RS-485串行接口 RS串行总线总结 RapidIO高速串行总线 ARINC429总线 并行接口基本原理 并行通信 IEEE488总线 SCSI总线 MXI总线 PCI接口基本原理 PCI总线原理 PC…

CSS【详解】长度单位 ( px,%,em,rem,vw,vh,vmin,vmax,ex,ch )

px 像素 pixel 的缩写,即电子屏幕上的1个点,以分辨率为 1024 * 768 的屏幕为例,即水平方向上有 1024 个点,垂直方向上有 768 个点,则 width:1024px 即表示元素的宽度撑满整个屏幕。 随屏幕分辨率不同,1px …

【大模型LLM面试合集】大语言模型基础_LLM为什么Decoder only架构

LLM为什么Decoder only架构 为什么现在的LLM都是Decoder only的架构? LLM 是 “Large Language Model” 的简写,目前一般指百亿参数以上的语言模型, 主要面向文本生成任务。跟小尺度模型(10亿或以内量级)的“百花齐放”…