前言

cutoff是一个比较冷门的概念,相比于DP经典算法的编辑距离,cutoff距离只局限于自然语言处理领域。提出cutoff距离的起因很简单,因为经典的编辑距离无法很好地衡量在字符串搜索过程中的编辑距离。

比如我们要对一个错误的字符串进行纠正,我们会用编辑距离去衡量可能正确字符串和错误字符串之间的差异。但是编辑距离有一个很大的问题就是对于自动机匹配过程存在缺陷,在自动机匹配的过程中编辑距离会变得很大。(很明显对于词库比较大的情况,必须要使用自动机)比如hello很有可能是hellx的正确单词,但是h和hellx的编辑距离是4,很明显就会存在自动机匹配难以进行的问题。

什么是cutoff?

针对上面提出的问题,kemal oflazer提出了cutoff算法。对于问题串stra和预测串strb,我们首先需要设置一个阈值,这个阈值作为编辑距离的限制条件。(也就是说符合编辑距离多少的为可能正确的单词)

定义strb的长度为blen,stra的长度为alen。l = max(1, blen - t),作为cutoff距离计算的下边界,u = min(alen, blen + t),作为cutoff距离计算的上边界。我们在计算cutoff距离的时候,就只需要计算min(ed(substr(stra,0,x),strb))(x>=l&&x<=u)即可。(此处substr表示截取0到x的字符为子串,包含x。ed表示编辑距离。min表示取最小值。)

例如reprter和repo的cutoff距离,计算过程如下:

如何实现?

这里给出cutoff算法的Python实现。

def ed_dis(stra, strb):
alen = len(stra)
blen = len(strb)
dp = [[0 for x in range(50)] for y in range(50)]
dp[0][0] = 0
for i in range(alen):
dp[i + 1][0] = i + 1
for j in range(alen):
dp[0][j + 1] = j + 1
for i in range(alen):
for j in range(blen):
if stra[i] == strb[j]:
dp[i + 1][j + 1] = min(min(dp[i + 1][j] + 1, dp[i][j + 1] + 1), dp[i][j])
else:
dp[i + 1][j + 1] = min(min(dp[i + 1][j] + 1, dp[i][j + 1] + 1), dp[i][j] + 1)
return dp[alen][blen] def cutoff_dis(stra, strb):
"""
:param stra: 错误串
:param strb: 预测串
:return: CUTOFF距离
"""
t = 1 # threshold
alen = len(stra)
blen = len(strb)
l = max(1, blen - t)
u = min(alen, blen + t)
min_ed = 1e10
for i in range(l, u + 1):
suba = stra[0:i + 1]
min_ed = min(min_ed, ed_dis(suba, strb))
return min_ed print(cutoff_dis('reprter', 'repo'))

cutoff距离如何使用?

计算出cutoff距离以后,究竟如何在自动机上使用cutoff距离?



具体的流程可以参考作者官方论文中给出的流程图。这个流程图是针对ababa这个问题串,对于aba和bab串形成的闭包进行单词推测。自动机的具体流程就不再详细描述了,一个很基础的自动机匹配流程,每次计算cutoff值作为权值即可。在大于阈值的权值结点处停止。

匹配的过程中对于一些特殊节点需要特殊标记,这种节点要求权值==阈值,且所有子节点无法继续扩展,也就是所有子节点权值大于阈值。可以看到图中有三个权值为1的结点符合这种要求。

对于这三个节点所对应的字符串,我们需要再次进行编辑距离计算,如果编辑距离恰好符合阈值,则该字符串是符合条件的字符串,也就是可能正确的字符串。

参考论文

Oflazer K. Error-tolerant finite-state recognition with applications to morphological analysis and spelling correction[J]. Computational Linguistics, 1996, 22(1): 73-89.

单词拼写检查之cutoff距离的更多相关文章

  1. WPF 4 单词拼写检查(SpellCheck)

    原文:WPF 4 单词拼写检查(SpellCheck)      在WPF中 Textbox 和RichTextBox 控件都内置了拼写检查属性,但该属性目前默认仅支持English.Spanish. ...

  2. 怎么设置IDEA,去除单词拼写检查,或者添加自定义的单词

    如图所示,添加自定义的单词,这样IDEA检查的时候,就不会报错了.估计默认是根据英文单词来释义的.

  3. android stuido - 关闭单词拼写检查

    "File"-"Settings"-"Editor "-"Inspections" 在Spelling栏取消选中,再点击 ...

  4. idea开启/关闭单词拼写检查

  5. python 拼写检查代码(怎样写一个拼写检查器)

    原文:http://norvig.com/spell-correct.html 翻译:http://blog.youxu.info/spell-correct.html 怎样写一个拼写检查器 Pete ...

  6. 如何写一个拼写检查器-by Peter Norvig

    本文原著:Peter Norvig  中文翻译:徐宥 上个星期, 我的两个朋友 Dean 和 Bill 分别告诉我说他们对 Google 的快速高质量的拼写检查工具感到惊奇. 比如说在搜索的时候键入 ...

  7. solr入门之solr的拼写检查功能的应用级别尝试

    今天主要是收集了些拼写检查方面的资料和 尝试使用一下拼写检查的功能--=遇到了不少问题 拼写检查的四种配置眼下我仅仅算是成功了半个吧 --------------------------------- ...

  8. Emacs中的拼写检查

    无论是在Emacs中写英文日记(diary).Org mode笔记,还是撰写程序的注释和文档,拼写检查都是一项提高工作效率.保证成果品质的必不可缺的工具.拼写检查对于常见的文字处理软件(如Word.L ...

  9. [Swift]LeetCode966.元音拼写检查器 | Vowel Spellchecker

    Given a wordlist, we want to implement a spellchecker that converts a query word into a correct word ...

随机推荐

  1. angular4.0配置本机IP访问项目

    一.查看本机IP 命令行输入 ipconfig,在面板中选择IPv4地址 二.在项目中配置IP 打开package.json文件,修改如下 三.命令行运行 npm start 四.在手机上访问 192 ...

  2. 微信支付接口开发之---微信支付之JSSDK(公众号支付)步骤

    1.准备     1.1.公众号为服务号,开通微信支付功能     1.2.为了方便调试微信后台的回调URL(必须为外网),我用了nat123软件来做一个映射     1.3.官方微信开发的示例WxP ...

  3. Markdown 常用语法

    1.标题 # 一级标题 ## 二级标题 ### 三级标题 2.字体 *斜体* **粗体** ~~删除线~~<u>下划线</u> 3.引用 > 引用文字 4.无序列表 - ...

  4. oracle如何导出和导入数据库表

    oracle如何导出和导入数据库表 oracle如何将项目中的表导出后在导入自己的数据库中,这是一个完整的操作,对于数据库备份或在本地查看数据验证数据进场用到,一般情况下我都用dos黑窗口进行操作,简 ...

  5. 【Docker】安装Docker及基本使用

    该文以CentOS系统为例,介绍Docker安装及基本使用.为了简化安装流程,Docker 官方提供了一套安装脚本,CentOS 系统上可以使用这套脚本安装: curl -sSL https://ge ...

  6. Linux(常用命令) 中常用的压缩丶解压缩格式命令和参数详解

    Linux中常用的压缩格式后缀名有:①.zip  ②.gz  ③.bz2  ④.tar.gz  ⑤.tar.bz2 ①.zip后缀名格式 1.压缩 语法: ①zip 压缩文件名 源文件 (压缩文件) ...

  7. bzoj 3295: [Cqoi2011]动态逆序对(树套树 or CDQ分治)

    Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...

  8. 51Nod 1091 线段的重叠(贪心+区间相关,板子题)

    1091 线段的重叠 基准时间限制:1 秒 空间限制:131072 KB 分值: 5         难度:1级算法题 X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 2 ...

  9. 搬寝室(经典dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1421 hdu_1421:搬寝室 Time Limit: 2000/1000 MS (Java/Othe ...

  10. ARM的GPIO配置