我正在测试C#的metaphone实现并将其结果与PHP中内置的metaphone()函数进行比较。但是,我遇到了一个错误(它是previously documented in PHP's issue tracker并在a mailing list上讨论过),但我试图了解他们错误背后的C代码,这是为了我个人的兴趣。PHP metaphone实现bug
基本上,根据metaphone算法,大多数-gh-的实例应该呈现为沉默。在“莱特”的具体测试情况下,我希望(和我自己的算法生成)“RT”的变音键
"wr" => R
"i" => ignored
"gh" => ignored
"t" => T
Result: RT
然而,PHP的音位函数返回RFT。显然,它将-gh-转换为F,就好像它在一个单词的末尾(例如“粗糙”),但在“wright”这个词的情况下,这是不正确的,因为-gh-确实不是在词的结尾。看着在PHP源代码分发的metaphone.c文件,我看到的一些关键的东西:
/* These prevent GH from becoming F */
#define NOGHTOF(c) (ENCODE(c) & 16) /* BDH */
...
/* Go N letters back. */
#define Look_Back_Letter(n) (w_idx >= n ? toupper(word[w_idx-n]) : '\0')
再上线342:
case 'G':
if (Next_Letter == 'H') {
if (!(NOGHTOF(Look_Back_Letter(3)) || Look_Back_Letter(4) == 'H')) {
Phonize('F');
skip_letter++;
有人可以帮助我了解究竟是什么NOGHTOF功能为什么这个代码不正确地为“赖特”中的-gh-渲染一个F?我不是一个真正的C人,所以代码对我来说一点都不清楚。
那么也许有人可以提交一个补丁到列表中并修复这个bug! – 2012-02-13 20:45:34
SO需要更多这样的问题:) – 2012-02-13 21:57:59