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

你好。
我是Mandai,负责Wild 开发团队。
我认为在对话中,说错话或听错话是很常见的。
这取决于当时的气氛和情况,但在大多数情况下,它能活跃气氛,所以我认为这不是一件坏事(尽管有时很明显你记错了某些事情)。
这次,我将介绍一些可能(或许)可以实现的算法,这些算法出现在谷歌搜索结果中。
目录
莱文斯坦距离
首先是莱文斯坦距离,它量化了字符之间的距离。
莱文斯坦距离 -维基百科
它是一种表示两个字符串差异程度的距离,也称为编辑距离。
让我们来看看小猫坐下时的距离,维基百科上也有提到。
- 小猫
- sitten # k → s 替换
- 坐着 # 替换 e → i
- 添加座位 # 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 居然申请了专利。
我发现有人正在利用这项技术研究一些有趣的东西,所以我会在这里附上链接。
虽然这是一篇研究论文,但内容相当浅显易懂。
就是这样。
0