意识到“也许”的对话版本吗? 以编程方式检测错误
你好。
我是Mandai,负责Wild 开发团队。
谈话中,说错话和误解是很常见的事情。
这取决于气氛和情况,但我不认为这是一件坏事,因为通常有一些元素可以让情况变得更轻松(尽管我可能清楚地记得错误)。
这次,我将介绍一些谷歌搜索中出现的算法,这些算法可能(或可能)可以实现“也许”。
目录
编辑距离
首先,编辑距离,量化字符之间的距离。
编辑距离 -根据
它是一种距离,显示两个字符串的差异程度。也称为编辑距离。
我们来看看小猫坐的距离,维基百科上也有介绍。
- 小猫
- 坐# k → s 替换
- 坐# e → i 替换
- 坐着#添加g
通过这三个步骤就可以从小猫转变为坐着,此时的编辑距离为3。
该操作次数被定义为字符之间的距离,并测量近似程度。
添加、删除、替换可以认为是对字符的操作,但由于替换可以认为是同时添加和插入的操作,所以也有观点认为替换的成本本来是2。
本例中的编辑距离为 5。
关于它有什么用处还存在一些疑问,但当我进一步阅读时,它似乎正在被应用于 DNA 研究。
确实,DNA是由四个字母AGCT的组合来表示的,所以粗略地说,Levenshtein距离可以用遗传紧密度来代替。
这个 Levenshtein 距离可以使用 PHP 轻松计算,并且有一个专用的标准函数。
echo levenshtein('kitten', 'sitting'); // 结果为 3 echo levenshtein('kitten', 'sitting', 1, 2, 1); // 如果替换成本为 2 // 结果为 5 echo levenshtein ('山田', '山口'); // 结果是 3
嘎。好像不支持多字节字符。
由于我是在UTF8环境下执行的,所以汉字字符算作3个字节。因此,如果省略第二个参数及后续参数,则替换也算成本1,因此认为改变了3个字节。
让我们尝试插入另一个字符串,看看里面发生了什么。
echo bin2hex('mountain'); // e5b1b1 echo bin2hex('mouth'); // e58fa3 echo bin2hex('field'); // e794b0 echo bin2hex('bureau'); // e79480 'mouth' 和 lower 2只是数字不同 echo levenshtein('Yamada', 'Yamaguchi'); // 结果是 3 echo levenshtein('Yamada', 'Yamatsuke'); // 结果是 3
看起来多字节字符被识别为多字节字符,而不是按字节来查看,但是似乎最终转换的字符数是围绕strlen粗略检查的。
看起来实现起来还是比较容易的,而且我找到了一个有Python和Perl实现的页面,所以我就贴个链接吧。
编辑距离(Levenshtein 距离) - naoya 的 Hatena 日记
声学
Soundex 是一种与 Levenshtein 距离不同的算法,更容易检测到错误。
它似乎是专门为处理个人姓名而设计的。
维基百科没有任何日语文章,但有一个英文页面。 → Soundex - 维基百科
Soundex 分析您输入到称为 4 字符 soundex 键的字符串中的字符的发音。
我觉得无论字符串有多长都使用4个字符有点不合理......
PHP 也有一个标准函数,所以我想轻松执行它。
我准备了一些用片假名书写时相同的英语单词。
echo soundex('rock'); // 结果是 R200 echo soundex('lock'); // 结果是 L200 echo soundex('free'); // 结果是 F600 echo soundex('flea'); is F400 echo soundex('flee'); // 结果是 F400 echo soundex('aerosmith'); // 结果是 A625
我根本不明白返回值,但我确实明白rock和lock之间的区别。
free和flea唯一的区别是第二个字母,flea和flee完全一样。
转换的详细规则惊人的多,所以衡量字符串的相似度(2)注重发音 |如果你参考Colorless Green Ideas中写的,如果结合soundex和Levenshtein distance,从发音的角度来看,似乎可以实现“也许”的功能。
Soundex也受到MySQL的支持,并提供了soundex函数。
MySQL :: MySQL 5.6 参考手册 :: 12.5 字符串函数 SOUNDEX(str)
MySQL 的 soundex 与 PHP 的输出略有不同,必须注意它不是固定为 4 个字符。
mysql> SELECT SOUNDEX('二次'); -> 'Q36324'
soundex 函数不支持日语。
由于语言规范的原因,无法用同一个尺度来衡量,所以可能是自然的。
变音位
Metaphone 是由 Lawrence Philips 设计的一种算法,与 soundex 一样,它是一种根据发音输出称为 Metaphone 键的字符串的算法。
Soundex 通过按顺序查看字母来识别发音,但 Metaphone 已经定义了字母和发音的组合,并且似乎能够获得比 soundex 键更准确的数据。
变音位键仅由字母组成,不含元音。
变音位键由 16 个字符组成:“0BFHJKLMNPRSTWXY”。
0似乎代表th的音,似乎与单个的T和H区别开来。
作为例外,有一个规则,即仅当单词以元音开头时才添加元音,例如authentication。
另外,转换规则的组合比Soundex多很多,这就是为什么你可以获得比Soundex更准确的数据。
PHP 还有一个称为 Metaphone 的标准函数,所以让我们看一个示例。
echo metaphone('authentication'); // 结果是 A0NTKXN echo metaphone('supercalifragilisticexpialidocious'); // 著名的《欢乐满人间》 // 结果是 SPRKLFRJLSTSKSPLTSS
它们本质上与音标相似,它们将发音转换为字母,但音标用于正确发音,而变音位和 soundex 是发音中包含的声音的提取,因此您可以使用变音位键。光看单词就不知道如何发音。
通过获取多个单词的变音位键并测量 Levenshtein 距离,似乎可以获得比 soundex 更准确的近似程度。
与变音位相关的信息可以在这里找到: Lawrence Philips 的变音位算法(信息可能已过时,因为它有许多损坏的链接并且不再维护)。
还有一种称为双变音位算法的改进版本,它输出两种类型的键:主键和辅助键。
虽然处理字符串等基本规则似乎没有改变,但内部实现发生了很大变化,因此似乎无法比较变音位和双变音位之间的结果。
与双变音位相关的信息收集在PHP DoubleMetaPhone
由于 double metaphone 不是标准 PHP 函数,因此您需要从PECL::Package::doublemetaphone
联系
这是一个名为 Jazzy 的执行拼写检查的 Java API 的说明页面,开头有关于 soundex、metaphone 和 Levenshtein distance 的说明。
我很惊讶 soundex 拥有专利。
有些人使用这项技术研究了有趣的事情,所以我将发布他们的链接。
虽然是一篇研究论文,但内容比较坦白,易读。
就是这样。