[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以提高效率,但未实现,作者进行了实现.
最大的特色是作者用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以提高效率,但未实现,作者进行了实现.
相关文章推荐
- [CodeProject每日一荐]实现Double Metaphone语音匹配算法[三,四] VBScript调用COM;存储过程实现及高级话题
- [CodeProject每日一荐]实现Double Metaphone语音匹配算法[二]:Visual Basic的COM实现和关系数据库解决方案
- [CodeProject每日一荐] 两个C++实现的MSN Messenger弹出窗口风格的窗体
- KMP模式匹配算法 C++实现
- [CodeProject每日一荐] SqlWhereBuilder ASP.NET 服务器控件
- 0050 KMP匹配算法的C++实现
- 【转载】【数据结构&&算法系列】KMP算法介绍及实现(c++ && java)
- [CodeProject每日一荐] NotifyWindow: 一个轻量级 MSN Messenger 风格的通知窗体
- [CodeProject每日一荐] ASP.NET 仿MSN Messenger Alert的弹出窗口控件
- 【数据结构&&算法系列】KMP算法介绍及实现(c++ && java)
- [CodeProject每日一荐] TaskbarNotifier: 可换肤的 MSN Messenger-like 风格窗体( C# & VB.NET)
- [CodeProject每日一荐] PopupNotifier: 一个Office 2003风格的通知控件(VB.NET)
- [CodeProject每日一荐] ASP.NET 仿MSN Messenger Alert的弹出窗口控件
- 简单字符串模式匹配算法的C++实现
- [CodeProject每日一荐] 藏东西系列:在图片离散的bit中隐藏信息
- 算法学习 - 括号匹配(栈实现)C++
- DBSCAN 算法介绍以及C++实现
- 每日一个算法------二叉树实现、递归和非递归算法(c++版)
- [Codeproject每日一荐] VS.NET IDE Bugs & Workarounds
- [CodeProject每日一荐] 藏东西系列:在图片中隐藏信息