您的位置:首页 > 编程语言 > C语言/C++

[CodeProject每日一荐]实现Double Metaphone语音匹配算法[一]:介绍与C++实现

2006-06-02 10:34 696 查看
Implement Phonetic ("Sounds-like") Name Searches with Double Metaphone Part I: Introduction & C++ Implementation By Adam Nelson
最大的特色是作者用C++, COM (Visual Basic等), 脚本 (VBScript, JScript, ASP), SQL, and .NET (C#, VB.NET 和其他.NET 语言)分别实现了经典Double Metaphone算法.还提供了Lawrence Phillips原有的实现源码(译者:文中最上面的链接已失效,可在此找到ftp://ftp.cuj.com/pub/2000/cujjun2000.zip).

[摘要]
用语音搜索信息时,有时候不总是能精确匹配,这时需要匹配发音近似的词.本系列讨论Lawrence Phillips的Double Metaphone语音匹配算法,来实现这一点,可在其他很多解决方案中应用

[介绍]
做语音匹配算法的很多,最古老,也许同时是最有名的是20世纪早期的专利: 用于打孔机的Soundex 算法, Soundex根据简单的计算产生一个key,用来表达原始单词(至少是单词的第一部分).Soundex简单而快速,但效果也比较差.1990年Lawrence Phillips在Computer Language 杂志发表了Metaphone算法,将一些英语拼写规则纳入考虑,产生了更可信的key.作为Soundex 的改进,Metaphone算法仍不能处理一些明显同音的词,如"Bryan" 和 "Brian".最后,2000年,Lawrence Phillips在C/C++ User’s Journal上发表了Double Metaphone算法,引入了其他推断来改进Metaphone的弱点,产生了第二个(替代的)key,用来表示单词的原始发音(较之美语的外来语发音).有了这些改进,Double Metaphone算法已满足大多数语音匹配实用需求.

第一部分介绍了 Double Metaphone和 C++ 实现. 第二部分用Visual Basic写COM实现.第三部分用ASP和 VBScript写COM实现,第四部分用Sql Server中扩展存储过程实现. 第五部分用.NET实现. 第六部分介绍了语音匹配的替代方案和其他资源.

[背景]
Phillips的原有 Double Metaphone 实现,使用了MFC string的一个子类MString.对一个单词调用DoubleMetaphone 方法后,会产生两个key,主key表示美语中的发音,次key表示外来语或姓名等的原始发音(可能为空).Metaphone key有4个字母(对短单词只有3个字母),主要描述单词前面的部分的发音,这个"神奇的长度"是个匹配的错误率和相关性之间的很好折衷.比较两个单词时,主key相等则为强匹配,主key与次key相等则为一般匹配,只有次key相等则为弱匹配.

[改进实现]
作者的C++实现用C++的模板实现,带一个长度参数,允许程序员控制产生key的长度,实践证明,4是个最好的长度.改进包括
(1)不基于MFC.不依赖于windows的任何元素,可用于支持模板的编译器
(2)不继承于string,而采用了Metaphone key类
(3)实现了Metaphone key类== 和 != 操作符
(4)比原来的实现快了约2倍

略...

[Unsigned Short改进]
Phillips提出了可用Unsigned Short代替string来保存ke以提高效率,但未实现,作者进行了实现.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐