实现语音(“听起来像”)姓名搜索,采用 Double Metaphone 第三部分:VBScript 和 ASP & 数据库解决方案






4.67/5 (6投票s)
2003年7月26日
8分钟阅读

86365

1633
进一步描述了作者 C++ 实现 Double Metaphone 的 COM 包装器,并演示了如何在 ASP 和 VBScript 中使用此 COM 包装器通过网页查询姓名数据库。
摘要
简单的信息搜索——姓名查找、单词搜索等——通常以精确匹配的标准来实现。然而,鉴于同音(发音相同)的单词和姓名多样性,以及人们容易拼错姓氏的倾向,这种简单的标准通常会产生不太理想的结果,表现为结果集减少,丢失了因字母错位或不同的国家拼写而不同的记录。
本系列文章讨论了 Lawrence Phillips 的 Double Metaphone 语音匹配算法,并提供了几种有用的实现,这些实现可以用于各种解决方案,从而在数据库和其他集合中创建更有用、更有效的姓名搜索。
引言
本系列文章讨论了 Double Metaphone 算法在语音搜索姓名数据中的实际应用,使用了作者为 C++、COM(Visual Basic 等)、脚本客户端(VBScript、JScript、ASP)、SQL 和 .NET(C#、VB.NET 和任何其他 .NET 语言)编写的实现。有关 Double Metaphone 算法本身以及 Phillips 原始代码的讨论,请参阅 Phillips 发表在 2000 年 6 月 CUJ 上的文章,可通过此处访问。
第一部分介绍了 Double Metaphone,并描述了作者的 C++ 实现及其用法。 第二部分讨论了在 Visual Basic 中使用作者的 COM 实现。第三部分演示了在 ASP 和 VBScript 中使用 COM 实现。 第四部分展示了如何使用作者的扩展存储过程在 SQL Server 中执行语音匹配。 第五部分演示了作者的 .NET 实现。最后,第六部分以对语音匹配替代方案的调查和指向其他资源的链接作为结尾。
背景
第一部分本系列文章讨论了 Double Metaphone 算法、其起源和用途以及作者的 C++ 实现。虽然本节总结了该文章的关键信息,但鼓励读者阅读整篇文章,即使读者没有 C++ 经验。
Double Metaphone 算法由 Lawrence Phillips 开发,并发表在 2000 年 6 月的 C/C++ Users Journal 上,属于一类称为“语音匹配”或“语音编码”的算法。这些算法试图检测单词之间的语音(“听起来像”)关系。例如,语音匹配算法应能检测到“Nelson”和“Nilsen”之间的强语音关系,而“Adam”和“Nelson”之间没有语音关系。
Double Metaphone 的工作原理是根据一个词生成一个或可能两个语音键。这些键代表词的“声音”。典型的 Double Metaphone 键长度为四个字符,因为这往往能产生具体性和结果通用性之间的理想平衡。
第一个(主)Double Metaphone 键代表源单词的美式发音。所有单词都有一个主 Double Metaphone 键。
第二个,即备用,Double Metaphone 键代表一种备用的、国家化的发音。例如,许多波兰姓氏被“美国化”,产生两种可能的发音:原始波兰语和美式发音。因此,Double Metaphone 会为某些词计算备用键。请注意,绝大多数(大致 90%)单词不会产生备用键,但当计算出备用键时,它可能对匹配该词至关重要。
要比较两个单词的语音相似度,需要计算它们各自的 Double Metaphone 键,然后比较每种组合:
- 单词 1 主键 - 单词 2 主键
- 单词 1 主键 - 单词 2 备用键
- 单词 1 备用键 - 单词 2 主键
- 单词 1 备用键 - 单词 2 备用键
显然,如果给定的单词没有生成上面某个比较中的键,那么涉及该键的比较就不会执行。
根据上述比较中的哪项匹配,会计算出匹配强度。如果第一项比较匹配,则两个词具有很强的语音相似性。如果第二项或第三项比较匹配,则两个词具有中等语音相似性。如果第四项比较匹配,则两个词具有最小的语音相似性。根据具体的应用程序需求,可以从匹配结果中排除一个或多个匹配级别。
脚本客户端实现
在本系列文章的第二部分中,我们讨论了 Double Metaphone 的 COM 实现,并结合了从 Visual Basic 中使用该组件的情况。通过稍作修改,相同的实现可以从 VBScript、JScript 或任何其他脚本语言中使用,包括 Active Server Pages (ASP) 中的 VBScript。
COM 实现的 Double Metaphone 提供了两个 COM 组件:MetaphoneCOM.DoubleMetaphoneString
和 MetaphoneCOM.DoubleMetaphoneShort
。前者以字符串形式生成四字符的 Metaphone 键,而后者以整数形式表示相同的键,以提高效率。在性能至关重要的情况下,整数版本更可取。
每个组件都公开一个名为 ComputeMetaphoneKeys
的方法,该方法以要计算的单词和接收键的两个变量作为参数。对于字符串版本,这两个变量的类型为 String
,而整数版本则接受类型为 Integer
的两个键变量。
对于 COM Double Metaphone 实现而言,Visual Basic 和脚本语言之间的主要区别在于,Visual Basic 支持类型化变量(String
、Integer
、Boolean
等),而脚本语言是无类型的。因此,在构建 Double Metaphone 的 COM 实现时,创建了两个版本的 ComputeMetaphoneKeys
方法:一个用于 VB 等 COM 客户端,另一个用于 VBScript 等调度客户端。用于 VB 和其他编译客户端的版本是 ComputeMetaphoneKeys
,而脚本版本是 ComputeMetaphoneKeysScr
。如果脚本语言尝试调用 ComputeMetaphoneKeys
,则会引发类型不匹配错误。
要在 VBScript 中计算单词的字符串 Double Metaphone 键,可以使用如下代码
Dim mphoneString
Dim primaryKey, alternateKey
Dim word
word = "nelson"
Set mphoneString =
CreateObject("MetaphoneCOM.DoubleMetaphoneString")
mphoneString.ComputeMetaphoneKeysScr word, primaryKey,
alternateKey
WScript.Echo "Keys: " & primaryKey & "
" & alternateKey
当将上述代码放入 VBS 文件并执行时,会产生以下消息
由此清楚可知,“Nelson”一词生成的主要 Metaphone 键是“NLSN”,并且不生成备用键。
修改上述代码以使用整数版本
Dim mphoneShort
Dim primaryKey, alternateKey
Dim word
word = "nelson"
Set mphoneShort =
CreateObject("MetaphoneCOM.DoubleMetaphoneShort")
mphoneShort.ComputeMetaphoneKeysScr
word, primaryKey, alternateKey
WScript.Echo "Keys: " &
primaryKey & " " & alternateKey
此版本产生以下输出
在这里,可以看到前一个脚本生成的 Metaphone 键“NLSN”的整数版本是 -31064,而备用键的 -1 值表明,与前一个脚本一样,为“Nelson”一词没有生成备用键。
本文附带的源代码档案中包含了一个名为 VBScript Word Lookup 的示例应用程序。该应用程序从文本文件中加载 21,000 个姓名列表,为每个姓名计算 Double Metaphone 键,然后填充一个将语音键映射到姓名数组的 Dictionary
对象。然后,该脚本提示输入要搜索的姓名,并列出该姓名所有语音匹配的项。大部分源代码并不涉及 Double Metaphone,而是用于维护这个姓名 Dictionary
;然而,该脚本清楚地演示了在 VBScript 中使用 Double Metaphone 组件。
Active Server Pages & 数据库
虽然构建 VBScript Word Lookup 这样的应用程序可能很有趣,但它们并不吸引人。本节讨论了一个非常简单的 Active Server Pages 应用程序,该应用程序提供一个基于浏览器的表单,提示输入搜索词。一旦用户提交请求,就会向用户显示一个来自 21,000 个测试姓名 Access 数据库的列表,这些姓名在语音上与搜索词匹配。代码与第二部分中的 VB Word DB Lookup 示例非常相似,只是为 VBScript 进行了修改,并使用了 ASP 内置对象。尽管如此,与读取姓名列表并通过消息框进行交互的脚本相比,一个与关系数据数据库进行匹配的基于 Web 的语音搜索应用程序稍微不那么牵强。
要运行此示例,需要进行一些安装步骤
首先,在 IIS 中创建新的虚拟目录。将此虚拟目录命名为 _ASPWordDBLookup_(此名称不能更改;脚本假定它在该虚拟目录中),并将此虚拟目录映射到源代码档案中名为 _ASPWordDBLookup_ 的目录。
其次,确保用户帐户 _IUSR_machine_(其中 _machine_ 是主机名)对包含 _namelist.mdb_ 和 _ASPWordDBLookup_ 文件夹的文件夹具有 _完全控制_ 权限。
最后,导航至 https:///aspworddblookup/search.htm
输入要搜索的姓名,然后按“搜索”
由于此示例的代码大部分基于第二部分中的 VB Word DB Lookup 示例,请参阅该文章以获取更详细的关于其操作以及 Double Metaphone 与关系数据库(如本示例中的)使用的讨论。
结论
在本文中,我们探讨了如何在 VBScript 和 ASP 中使用 Double Metaphone 的 COM 实现。在第二部分中开发的与关系数据库的搜索技术与 ASP 结合使用,构建了一个基于 Web 的语音匹配示例应用程序。
如果您对 Double Metaphone 与关系数据库使用的进一步讨论感兴趣,特别是对与实际应用程序相关的问题进行更现实的讨论,请转到第四部分,该部分将介绍 Double Metaphone 的 SQL Server 扩展存储过程实现。第五部分将介绍 Double Metaphone 的 .NET 实现,这对于对本示例不太满意的 ASP.NET 程序员也应该很有吸引力。第六部分将以回顾其他语音匹配技术和指向其他资源的链接作为结束,因此任何有兴趣为应用程序添加语音匹配功能的人都应该阅读。
历史
- 2003 年 7 月 22 日首次发布
- 2003 年 7 月 31 日 在系列文章之间添加了超链接
文章系列
- 实现语音(“听起来像”)
姓名搜索, 使用 Double Metaphone 第 I 部分: 介绍与 C++ 实现 - 使用 Double Metaphone 实现语音(“听起来像”)姓名搜索 第二部分:Visual Basic 和关系数据库解决方案
- 实现语音(“听起来像”)姓名搜索,采用 Double Metaphone 第三部分:VBScript 和 ASP & 数据库解决方案
- 实现语音(“听起来像”)名称搜索,使用 Double Metaphone 第四部分:SQL Server 和高级数据库主题
- 使用 Double Metaphone 实现语音(“听起来像”)姓名搜索 第五部分:.NET 实现
- 使用 Double Metaphone 实现语音(“听起来像”)姓名搜索 第六部分:其他方法和附加资源