意识到“也许”的对话版本吗? 以编程方式检测错误

你好。
我是Mandai,负责Wild 开发团队。

我认为在对话中,说错话或听错话是很常见的。
这取决于当时的气氛和情况,但在大多数情况下,它能活跃气氛,所以我认为这不是一件坏事(尽管有时很明显你记错了某些事情)。

这次,我将介绍一些可能(或许)可以实现的算法,这些算法出现在谷歌搜索结果中。

 

目录

  1. 莱文斯坦距离
  2. Soundex
  3. 元音
  4. 其他相关文章

 

莱文斯坦距离

首先是莱文斯坦距离,它量化了字符之间的距离。

莱文斯坦距离 -维基百科

它是一种表示两个字符串差异程度的距离,也称为编辑距离。

让我们来看看小猫坐下时的距离,维基百科上也有提到。

  1. 小猫
  2. sitten # k → s 替换
  3. 坐着 # 替换 e → i
  4. 添加座位 # g

通过这三个步骤可以将“小猫”转换为“坐着”,在这种情况下,莱文斯坦距离为 3。
这些步骤的数量定义为字符之间的距离,我们以此来衡量近似程度。

字符操作可以是添加、删除或替换,但替换可以看作是同时执行添加和插入的操作,因此有人说替换的成本实际上是 2。
在这种情况下,莱文斯坦距离为 5。

虽然人们可能会疑惑它的用途是什么,但随着阅读的深入,它似乎应用于DNA研究。
事实上,DNA是由四个字母AGCT组合而成的,因此粗略地说,莱文斯坦距离可以用遗传接近程度来代替。

在 PHP 中可以轻松计算莱文斯坦距离,并且有一个专门的标准函数可以实现这一点。

echo levenshtein('kitten', 'sitting'); // 结果是 3 echo levenshtein('kitten', 'sitting', 1, 2, 1); // 替换的成本是 2 // 结果是 5 echo levenshtein('Yamada', 'Yamaguchi'); // 结果是 3


 糟糕!它似乎不支持多字节字符。
由于我是在 UTF-8 环境下运行的,汉字字符被计为 3 个字节。因此,如果您省略第二个参数及后续参数,替换操作也被计为 1 个字节,所以会被视为发生了 3 个字节的更改。我们
尝试插入一个不同的字符串,从外部观察一下内部发生了什么。

echo bin2hex('Yama'); // e5b1b1 echo bin2hex('Kuchi'); // e58fa3 echo bin2hex('Ta'); // e794b0 echo bin2hex('Yamaguchi'); // e79480 只有最后两位数字与“Kuchi”不同 echo levenshtein('Yamada', 'Yamaguchi'); // 结果是 3 echo levenshtein('Yamada', 'Yamaguchi'); // 结果是 3

 
它不会逐字节地检查多字节字符,而是将它们识别为多字节字符,但似乎转换后的字符的最终数量是使用 strlen 或类似函数粗略检查的。

它似乎很容易实现,我找到了一个用 Python 和 Perl 实现的页面,所以我在这里附上了一个链接。

编辑距离(莱文斯坦距离) - naoya 的 Hatena 日记

 

Soundex

Soundex 是一种与莱文斯坦距离不同的语音错误处理算法,其
设计特别适用于人名。

维基百科上没有日文条目,但有英文页面。→ Soundex - 维基百科

Soundex 会分析您输入的字符的语音特征,并将其转换为一个称为 Soundex 键的四字符字符串。
将任何字符串(无论多长)简化为四个字符似乎有点粗糙……

PHP中也有一个标准函数可以实现这个功能,我们来试一试。
我已经准备了一些用片假名写出来的英文单词。

echo soundex('rock'); // 结果为 R200 echo soundex('lock'); // 结果为 L200 echo soundex('free'); // 结果为 F600 echo soundex('flea'); // 结果为 F400 echo soundex('flee'); // 结果为 F400 echo soundex('aerosmith'); // 结果为 A625


 虽然我完全不理解返回值,但我大致能明白 rock 和 lock 的区别。free
和 flea 的区别仅仅在于第二个字母,而 flea 和 flee 则完全相同。

转换规则出乎意料地多,具体“衡量字符串相似度(2)聚焦发音 | Colorless Green Ideas” 。通过结合 Soundex 和 Levenshtein 距离,似乎可以从发音的角度实现一个“可能”功能。

Soundex 也受 MySQL 支持,MySQL 提供了一个 soundex 函数。

MySQL :: MySQL 5.6 参考手册 :: 12.5 字符串函数 SOUNDEX(str)

需要注意的是,MySQL 的 soundex 与 PHP 的输出略有不同,并且长度并非固定为 4 个字符。

mysql> SELECT SOUNDEX('Quadraticly'); -> 'Q36324'


 Soundex 功能不支持日语。
这或许很自然,因为日语的语言特性决定了它不能用同样的标准来衡量。

 

元音

Metaphone 是 Lawrence Philips 发明的一种算法,它与 Soundex 类似,都能根据发音输出一串称为 Metaphone 键的字符。Soundex
通过字母顺序识别发音,而 Metaphone 则定义字母组合及其发音,并且似乎比 Soundex 键生成的数据更准确。

Metaphone键仅由字母组成,不包括元音。
它们由16个字符组成:“0BFHJKLMNPRSTWXY”。
其中,0似乎代表“th”音,与单独的T和H音不同。但也有
例外,当单词以元音开头时,例如“authentication”,才会添加元音。此外
,Metaphone键基于组合的转换规则比Soundex多得多,这也是为什么Metaphone键比Soundex能产生更准确的数据的原因。

PHP 还有一个名为 metaphone 的标准函数,让我们来看一个例子。

echo metaphone('authentication'); // 结果为 A0NTKXN echo metaphone('supercalifragilisticexpialidocious'); // 出自《欢乐满人间》的著名音符 // 结果为 SPRKLFRJLSTSKSPLTSS

 
从某种意义上说,它们代表了书写中的发音,类似于音标符号,但音标符号用于确保正确的发音,而音标符号和音标符号只是从发音中提取出来的声音,因此查看音标符号并不意味着你可以找到一个单词的发音。

获取多个单词的元音键并测量莱文斯坦距离可能比 soundex 提供更准确的近似值。

有关元音的更多信息,劳伦斯·菲利普斯的元音算法(链接经常失效且无人维护,因此信息可能已过时)。

还有一种改进的元音算法,称为双元音算法,它经过修改,可以输出两种类型的键:主键和辅助键。虽然
处理字符串和其他信息的基本规则保持不变,但实现方式发生了显著变化,因此元音算法和双元音算法的结果不太可能具有可比性。

关于双元音的信息收集在PHP DoubleMetaPhone

由于 double metaphone 不是标准的 PHP 函数,因此需要从PECL::Package::doublemetaphone

 

联系

本页面介绍 Jazzy,一个用于拼写检查的 Java API。开头部分解释了 soundex、metaphone 和莱文斯坦距离。令
我惊讶的是,soundex 居然申请了专利。

没有什么能比得上 Jazzy

我发现有人正在利用这项技术研究一些有趣的东西,所以我会在这里附上链接。
虽然这是一篇研究论文,但内容相当浅显易懂。

一项关于自动生成西方音乐歌词中听错短语的研究

 
就是这样。

如果您觉得这篇文章有帮助,请点赞!
0
加载中...
0 票,平均:0.00 / 10
1,146
X Facebook 哈特纳书签 口袋

写这篇文章的人

关于作者

万代洋一

我的主要工作是为社交游戏开发 Web API,但我也很幸运能够做很多其他工作,包括营销。
此外,我在 Beyond 中的肖像权被视为 CC0。