06.C2W1.Auto-correct

news2024/9/19 7:39:02

往期文章请点这里

目录

  • 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.coloradmin.cn/o/1904813.html

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

相关文章

C++入门7——string类详解

目录 1.什么是string类? 2.string类对象的常见构造 2.1 string(); 2.2 string (const char* s); 2.3 string (const string& str); 2.4 string (const string& str, size_t pos, size_t len npos); 2.5 string (const char* s, size_t n); 2.7 验证…

Educational Codeforces Round 167 (Rated for Div. 2)(A~C)题解

A. Catch the Coin 解题思路: 最终&#x1d465;一定会相等&#xff0c;我们考虑直接到下面接住他。 #include<bits/stdc.h> using namespace std; typedef long long ll; #define N 1000005 ll dp[N], w[N], v[N], h[N]; ll dis[1005][1005]; ll a, b, c, n, m, t; ll…

PCIe驱动开发(2)— 第一个简单驱动编写和测试

PCIe驱动开发&#xff08;2&#xff09;— 第一个简单驱动编写和测试 一、前言 教程参考&#xff1a;02_实战部分_PCIE设备测试 教程参考&#xff1a;03_PCIe设备驱动源码解析 二、驱动编写 新建hello_pcie.c文件 touch hello_pcie.c然后编写内容如下所示&#xff1a; #i…

芯片封装简介

1、背景 所谓“封装技术”是一种将集成电路用绝缘的塑料或陶瓷材料打包的技术。以CPU为例&#xff0c;实际看到的体积和外观并不是真正的CPU内核的大小和面貌&#xff0c;而是CPU内核等元件经过封装后的产品。封装技术对于芯片来说是必须的&#xff0c;也是至关重要的。因为芯片…

Java AI+若依框架项目开发 RuoYi-Vue(SpringBoot + Vue)

1.诺依的版本 本次选择RuoYI-Vue框架进行讲解 官网地址&#xff1a;RuoYi-Vue: &#x1f389; 基于SpringBoot&#xff0c;Spring Security&#xff0c;JWT&#xff0c;Vue & Element 的前后端分离权限管理系统&#xff0c;同时提供了 Vue3 的版本 (gitee.com) 2.搭建后端…

centos7|操作系统|低版本的OpenSSH升级到最新版本OpenSSH-9.8.p1

前言&#xff1a; 1、 OpenSSH是什么 OpenSSH 是 SSH &#xff08;Secure SHell&#xff09; 协议的免费开源实现。SSH协议族可以用来进行远程控制&#xff0c; 或在计算机之间传送文件。而实现此功能的传统方式&#xff0c;如telnet(终端仿真协议)、 rcp ftp、 rlogin、rsh都…

集合复习(java)

文章目录 Collection 接口Collection结构图Collection接口中的方法Iterator 与 Iterable 接口Collection集合遍历方式迭代器遍历增强 for 遍历 List&#xff08;线性表&#xff09;List特有方法ArrayList&#xff08;可变数组&#xff09;ArrayList 底层原理ArrayList 底层原理…

土豆炒肉做法

菜单&#xff1a;土豆、葱、铁辣子、纯瘦肉、淀粉、生抽、酱油、刀、案板、十三香、盐巴、擦板 流程&#xff1a; 洗土豆&#xff0c;削皮&#xff0c;擦成条&#xff0c;用凉水过滤两遍淀粉&#xff0c;顺便放个燥里洗肉&#xff0c;切成条&#xff0c;按照生抽、酱油、淀粉、…

【Etabs】【Rhino】Swallow(ESD)软件的ETABS功能介绍

Swallow(ESD)软件的ETABS功能介绍 来源&#xff1a;https://www.food4rhino.com/app/swallowesd 文章目录 Swallow(ESD)软件的ETABS功能介绍1. Load模块1.1 Support节点支座1.2 LoadPattern荷载模式1.3 LoadPattByName引用模型荷载模式1.4 AutoWindChinese自动风荷载参数1.5 R…

【数据结构与算法】插入排序

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​

Git仓库介绍

1. Github GitHub 本身是一个基于云端的代码托管平台&#xff0c;它提供的是远程服务&#xff0c;而不是一个可以安装在本地局域网的应用程序。因此&#xff0c;GitHub 不可以直接在本地局域网进行安装。 简介&#xff1a;GitHub是最流行的代码托管平台&#xff0c;提供了大量…

【开放集目标检测】Grounding DINO

一、引言 论文&#xff1a; Grounding DINO: Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection 作者&#xff1a; IDEA 代码&#xff1a; Grounding DINO 注意&#xff1a; 该算法是在Swin Transformer、Deformable DETR、DINO基础上…

STM32崩溃问题排查

文章目录 前言1. 问题说明2. STM32&#xff08;Cortex M4内核&#xff09;的寄存器3. 崩溃问题分析3.1 崩溃信息的来源是哪里&#xff1f;3.2 崩溃信息中的每个关键字代表的含义3.3 利用崩溃信息去查找造成崩溃的点3.4 keil5中怎么根据地址找到问题点3.5 keil5上编译时怎么输出…

数据库(表)

要求如下&#xff1a; 一&#xff1a;数据库 1&#xff0c;登录数据库 mysql -uroot -p123123 2&#xff0c;创建数据库zoo create database zoo; Query OK, 1 row affected (0.01 sec) 3&#xff0c;修改字符集 mysql> use zoo;---先进入数据库zoo Database changed …

护网在即,知攻善防助力每一位安服仔~

前言 是不是已经有师傅进场了呢~ 是不是有安服&#x1f412;在值守呢~ 您是不是被网上眼花缭乱的常用应急响应工具而烦恼呢&#xff1f; 何以解忧&#xff1f;唯有知攻善防&#xff01; 创作起源&#xff1a; 驻场、护网等&#xff0c;有的客户现场只允许用客户机器&…

【计组OS】I/O方式笔记总结

苏泽 “弃工从研”的路上很孤独&#xff0c;于是我记下了些许笔记相伴&#xff0c;希望能够帮助到大家 目录 IO方式&#xff1a;程序查询方式 工作原理 程序查询方式的详细流程&#xff1a; 1. 初始化阶段 2. 发送I/O命令 3. 循环检查状态 4. 数据传输 5. 继续查询 6…

机器人动力学模型及其线性化阻抗控制模型

机器人动力学模型 机器人动力学模型描述了机器人的运动与所受力和力矩之间的关系。这个模型考虑了机器人的质量、惯性、关节摩擦、重力等多种因素&#xff0c;用于预测和解释机器人在给定输入下的动态行为。动力学模型是设计机器人控制器的基础&#xff0c;它可以帮助我们理解…

自动化设备上位机设计 四

目录 一 设计原型 二 后台代码 一 设计原型 二 后台代码 using SimpleTCP; using SqlSugar; using System.Text;namespace 自动化上位机设计 {public partial class Form1 : Form{SqlHelper sqlHelper new SqlHelper();SqlSugarClient dbContent null;bool IsRun false;i…

【MySQL基础篇】多表查询

1、多表关系 概述&#xff1a;项目开发中&#xff0c;在进行数据库表结构操作设计时&#xff0c;会根据业务需求及业务模板之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系&#xff0c;基本上分为三种…

react dangerouslySetInnerHTML将html字符串以变量方式插入页面,点击后出现编辑状态

1.插入变量 出现以下编辑状态 2.解决 给展示富文本的标签添加css样式 pointerEvents: none