模糊匹配之——BK树与拼写纠正

2023-11-16

介绍

拼写纠错功能常常出现在比较高级的文本编辑应用中,例如大家熟知的word,高级一点的IDE例如Jet Brains系列,在一些在线翻译上,也有自动校正拼写的功能,例如谷歌翻译。

原理

拼写纠正的实现方式有多种,这里使用的是一种名为BK树的数据结构,也叫作Burkhard-Keller树,是由Burkhard,Keller这两人提出来的,不过网上能找到的相关资料并不多,参见ACM文档https://dl.acm.org/citation.cfm?id=362003.362025

最短编辑距离

在介绍BK树思想之前,要介绍一个概念——莱文斯坦距离,又称Levenshtein距离,是编辑距离的一种。指两个字串之间,由一个转成另一个所需的最少编辑操作次数。允许的编辑操作包括

  1. 将一个字符替换成另一个字符。
  2. 插入一个字符。
  3. 删除一个字符。

每经过一种操作编辑距离+1,当然也能够根据实际需求设定不同的权值。例如从 cute 到 cat,需要将u替换为a,删除e,因此它的的最短编辑距离为2。

定义dist(a, b)为字符串a到b的编辑距离,有如下数学性质

  • dist(a, b) = 0  <==>  a = b   // 相同的字符串编辑距离当然为0
  • dist(a, b) = dist(b, a)        // a到b的编辑距离与b到a的编辑距离是一样的,因为添加-删除,替换-替换是互逆的操作
  • dist(a, temp) + dist(temp, b) >= dist(a, b)   // 这点很重要,这是一条三角不等式,对于三角形从a顶点到b顶点的距离必然小于a到c再从c到b的距离。

推论

在模糊匹配值,我们需要设定一个容错值,而这个值用最短编辑距离来衡量,例如我们设定容错值是1,字典中有 [cat, cute, candy],给出字符串cate,能够匹配到[cat, cute],因为这两个字符串与cate的编辑距离都小于等于1 ,而dist("cate

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模糊匹配之——BK树与拼写纠正 的相关文章

  • 在 Eclipse 中隐藏重复的工具栏项

    我不知道如何 但我的 STS 有重复的工具栏项目 我不知道如何删除它们 这是我复制的工具栏的样子 我想摆脱这些 我试图隐藏工具栏 但这没有帮助 有人知道如何删除重复的吗 自从升级到 Oxygen 以来 我一直遇到同样的问题 我无法可靠地重现
  • 从 BroadcastReceiver 获取方法来更新 UI

    我正在尝试根据变量的变化更新用户界面BroadcastReceiver 因此 我需要调用一个扩展类的方法 以获取我提到的变量 BroadcastReceiver in MainActivity取决于但我无法以任何方式获得真正的返回值 扩展的
  • 如何抑制 Cucumber/Junit 断言堆栈跟踪

    我有一个黄瓜场景 该步骤使用assertEquals 我的结果报告显示了对最终用户不友好的堆栈跟踪 我怎样才能抑制它 Scenario Add two numbers Given I have two inputs 3 and 2 When
  • 在此代码中,Runnable 未实例化。为什么?

    Runnable cannot instantiate public class Thread4 public static void main String args Thread t1 new Thread new Runnable R
  • ListView:防止视图回收

    我有一个使用回收视图的 ListView 我试图阻止视图被回收 所以我使用 setHasTransientState android support v4 view ViewCompatJB setHasTransientState Vie
  • 最终字段可能尚未/已经初始化[重复]

    这个问题在这里已经有答案了 可能的重复 如何处理抛出检查异常的静态最终字段初始值设定项 https stackoverflow com questions 1866770 how to handle a static final field
  • HttpSession 内的同步是否可行?

    UPDATE 问题后立即解决 问题 通常 同步是在 JVM 内序列化并行请求 例如 private static final Object LOCK new Object public void doSomething synchroniz
  • Java - toString 到 Color

    我一整天都在努力解决这个问题 基本上我做了一个 for 循环 将条目添加到数组列表中 其中一项是 颜色 变量 我已经用过random nextInt为颜色构造函数的红色 绿色和蓝色部分创建新值 我还设置了一个toString方法 这样我就可
  • 如何在 Python 中加密并在 Java 中解密?

    我正在尝试在 Python 程序中加密一些数据并将其保存 然后在 Java 程序中解密该数据 在Python中 我像这样加密它 from Crypto Cipher import AES KEY 1234567890123456789012
  • java 中的 Try-with-resources 和 return 语句

    我想知道是否放一个return里面的声明尝试资源block 防止资源自动关闭 try Connection conn return conn createStatement execute 如果我写这样的东西将会联系被关闭 Oracle 文
  • 使用java在网页中进行字符编码

    如何使用java找出网页中的字符编码类型 打开与 URL 的连接 使用URL openConnection http download oracle com javase 6 docs api java net URL html openC
  • Java:java.util.Preferences 失败

    我的程序将加密的产品密钥数据保存到计算机上java util Preferences类 系统首选项 而不是用户 问题是 在 Windows 和 Linux 上 尚未在 OSX 上测试过 但可能是相同的 如果我不运行该程序sudo或者具有管理
  • Java 中通用方法参数的 getClass()

    以下 Java 方法无法编译
  • 如何在启用嵌入时间戳和 LTV 的情况下签署 PDF?

    我正在尝试签署启用了时间戳和 LTV 的 pdf 以便它在 Adob e Reader 中显示如下 在英语中 这意味着 签名包含嵌入的时间戳 和 签名启用了 LTV 这是我正在使用的代码 PrivateKey pk get pk from
  • 如何在 Java 中创建一个带有连字符的值的静态枚举?

    如何创建如下所示的静态枚举 static enum Test employee id employeeCode 截至目前 我遇到了错误 这对于 Java 来说是不可能的 因为每个项目都必须是有效的标识符 并且有效的 Java 标识符可能不包
  • Java给定长度的随机数

    我需要在 Java 中生成一个恰好 6 位数字的随机数 我知道我可以在随机发生器上循环 6 次 但是在标准 Java SE 中还有其他方法可以做到这一点吗 要生成 6 位数字 Use Random http download oracle
  • 动态创建 JSON 对象

    我正在尝试使用以下格式创建 JSON 对象 tableID 1 price 53 payment cash quantity 3 products ID 1 quantity 1 ID 3 quantity 2 我知道如何使用 JSONOb
  • 一个类中有多个具有相同参数类型的方法

    我知道 至少已经有了关于这个主题的一个问题 https stackoverflow com questions 5561436 can two java methods have same name with different retur
  • 设置 Firefox 配置文件以使用 Selenium 和 Java 自动下载文件

    我想使用 Selenium WebDriver 和 Java 验证文件下载 要下载的文件为 PDF 格式 当 WebDriver 单击 AUT 中的 下载 链接时 Firefox 将打开以下下载确认窗口 我希望 Firefox 自动下载文件
  • Swing:创建可拖动组件...?

    我在网上搜索了可拖动 Swing 组件的示例 但我发现示例不完整或不起作用 我需要的是一个摇摆组件那可以是dragged通过鼠标 在另一个组件内 被拖拽的时候 应该已经 改变它的位置 而不仅仅是 跳 到目的地 我很欣赏无需非标准 API 即

随机推荐

  • JAVA【基础】 IDEA导入jar包的几种方式

    目录 获取想要添加的依赖 或者jar包 maven添加依赖 手动导入jar包 最后测试一下 是否添加成功 下面多图预警 获取想要添加的依赖 或者jar包 添加依赖 或者下载jar包 都可以去maven网站下载 进入 Maven仓库 http
  • 获取windows凭证管理器明文密码

    1 运行cmdkey list查看windows保存凭证 方法1 mimikaz mimikatz vault cred 2 利用powershell尝试获取 windows 普通凭据类型中的明文密码 powershell import F
  • IPv6基础

    IPv6 1 优势 无限 地址空间 地址长度为128 bit 海量的地址空间 满足物联网等新兴业务 有利于业务演进及扩展 层次化的地址结构 相较于IPv4地址 IPv6地址的分配更加规范 利于路由聚合 缩减IPv6路由表规模 路由快速查询
  • 数的划分(递归)

    整数划分是另外的问题 题目描述 Description 将整数n分成k份 且每份不能为空 任意两种划分方案不能相同 不考虑顺序 例如 n 7 k 3 下面三种划分方案被认为是相同的 7 1 1 5 7 1 5 1 7 5 1 1 问有多少种
  • 7z怎么解压linux,7z 常用解压命令

    用命令行来执行7z的极限压缩 就是如下的命令 C 01 MyApp 7 Zip 7z exe a t7z newPack 7z F 14 newWork 7z testDoc r mx 9 m0 LZMA2 ms 10m mf on mhc
  • cmd简单游戏代码_python简单游戏应用——剪刀石头布!

    我们的基础中的基础 在前几文中已经介绍完了 其他的知识用什么学什么就对了 接下来我们做款小游戏 纵观全文 先引入了一个函数 random 随机数 单用random 这个函数 会产生一个随机的实数 范围在 0 1 若是要从自定的范围取出一个
  • 在flask框架中,设置执行完视图函数后自动将数据提交回数据库

    设置执行完视图函数后自动提交操作回数据库 app config SQLALCHEMY COMMIT ON TEARDOWN True
  • pytorch GPU版本安装

    使用驱动精灵安装 参考 pytorch GPU版本安装 尘世猫的博客 CSDN博客 pytorchgpu版本 安装cuda 高版本的cuda是可以兼容低版本的cuda的 比如我的电脑支持cuda11 0 我就可以安装cuda10 0 cud
  • 汽车OBD初级开发入门

    汽车OBD初级开发入门 我所认识的OBD 从何开始学习OBD stm32的CAN总线 OBD的标准协议 我所认识的OBD 直观的从名称上来说是英文On Board Diagnostics的缩写 中文翻译为 车载诊断系统 书面上的解释就是处理
  • 太强了!100个Python算法实例.pdf

    常言道 算法才是编程的灵魂 不管是java python还是PHP 都跨不过算法这个门槛 算法确实不好学 但算法也是真必要 各大公司为了筛选人才 面试程序员的时候多多少少都会考察你的算法能力 学习算法无非这几种目的 学习基本编程语法和思想
  • Python VTK numpy数据3D可视化

    在Python的3D图像处理中 通常用numpy array来进行非常方便的计算或者转化 这里记录一下numpy数据的VTK可视化基本流程 包括面绘制 Surfase Rendering 和体绘制 Volume Rendering 除去数据
  • 全局变量、静态全局变量、静态局部变量和普通局部变量的区别

    按存储区域分 全局变量 静态全局变量和静态局部变量都存放在内存的全局数据区 局部变量存放在内存的栈区 按作用域分 1 全局变量在整个工程文件内都有效 2 静态全局变量只在定义它的文件内有效 3 静态局部变量只在定义它的函数内有效 且程序仅分
  • 【FAQ】API6低代码开发问题汇总

    参考文档 低代码开发参考文档 文档中心 使用低代码进行开发 基于景区模板开发元服务 文档中心 模板简介 使用API6低代码开发遇到的问题汇总情况如下 1 低代码环境下 如何实现box shadow阴影效果的配置 答 低码目前不支持box s
  • 蓝牙之十七-bluedroid scan流程

    蓝牙扫描过程是指扫描蓝牙设备 app层 这里有两张截图 第一张图显示的是安卓设置setting菜单栏中有Bluetooth这一项 点进去以后 点击右上角显示如下的截图 其中Refresh就是刷新设备列表 也就会扫描设备信息 上图显示的三个菜
  • Gated Mechanism for Attention Based Multi Modal Sentiment Analysis 阅读笔记

    GATED MECHANISM FOR ATTENTION BASED MULTIMODAL SENTIMENT ANALYSIS 阅读笔记 最近在跟进多模态的情感分析发现多模态榜一又被刷下来了 这篇论文是当前时间内的最好的效果 下面就对论
  • linux服务器补丁怎么修复,linux 服务器打补丁

    linux 服务器打补丁 内容精选 换一换 MindStudio和Ascend cann toolkit开发套件包可以安装在Linux服务器上 可以使用Linux服务器上原生桌面自带的终端gnome terminal进行安装 也可以在Win
  • Python数据挖掘-机器学习

    目录 零 概念 算法 开发流程 一 机器学习概述 1 数据集 1 sklearn自带数据集应用 2 数据集划分 二 特征工程 1 特征抽取 1 字典特征提取 sklearn feature extraction DictVectorizer
  • windows下修改mysql时区设置

    root身份登录MySQL mysql u root p 查看time zone变量 show variables like time zone 显示 time zone 变量 设置time zone变量 set time zone 08
  • dobbo源码解析目录地址

    肥朝 Dubbo 源码解析 作者 肥朝 博客 http www jianshu com u f7daa458b874 目录 Dubbo 源码解析 集群容错架构设计 Dubbo 源码解析 Directory Dubbo 源码解析 Router
  • 模糊匹配之——BK树与拼写纠正

    介绍 拼写纠错功能常常出现在比较高级的文本编辑应用中 例如大家熟知的word 高级一点的IDE例如Jet Brains系列 在一些在线翻译上 也有自动校正拼写的功能 例如谷歌翻译 原理 拼写纠正的实现方式有多种 这里使用的是一种名为BK树的