我想自己编写 Metaphone 3 算法。有说明吗?我知道源代码可以出售,但这不是我想要的。
6 回答
由于作者 (Lawrence Philips) 决定将算法本身商业化,因此您很可能找不到描述。询问的好地方是邮件列表:https ://lists.sourceforge.net/lists/listinfo/aspell-metaphone
但您也可以查看源代码(即代码注释)以了解算法的工作原理: http ://code.google.com/p/google-refine/source/browse/trunk/main/src/com/google /refine/clustering/binning/Metaphone3.java?r=2029
来自 Wikipedia,Metaphone 算法是
Metaphone 是一种语音算法,该算法于 1990 年发布,用于通过单词的英语发音来索引单词。它通过使用有关英语拼写和发音的变化和不一致的信息来从根本上改进 Soundex 算法,以产生更准确的编码,从而更好地匹配听起来相似的单词和名称 [...]
变音器 3
[...] 对于英语单词、美国人熟悉的非英语单词以及美国常见的名字和姓氏,根据现代工程标准针对准备了正确的编码。
该算法的概述是:
Metaphone 算法首先从正在处理的单词中删除非英语字母和字符。接下来,所有元音也被丢弃,除非单词以初始元音开头,在这种情况下,除了初始元音之外的所有元音都被丢弃。最后,所有辅音和辅音组都映射到它们的变音代码。将辅音及其组分组然后映射到变音位代码的规则相当复杂;有关这些转换的完整列表,请查看源代码部分中的注释。
现在,到你真正的问题:
如果您对 Metaphone 3 算法的细节感兴趣,我认为您运气不好(没有购买源代码,理解它并自己重新创建它):不制作算法的全部意义(您可以购买的来源是一个实例)公开的是,如果不支付作者的开发工作费用就无法重新创建它(提供您正在寻找的“精确算法”相当于提供实际代码本身)。考虑上面的引述:算法的开发涉及“[...] 编码的测试工具”。除非您碰巧拥有这样的测试工具或能够创建一个,否则您将无法复制该算法。
另一方面,前两次迭代(Metaphone 和 Double Metaphone)的实现是免费提供的(上面的 Wikipedia 链接包含许多指向不同语言实现的链接),这意味着您有一个很好的起点来理解什么算法差不多,然后在您认为合适的情况下对其进行改进(例如,通过创建和使用适当的测试工具)。
@Bo 的链接现在指的是(现在已失效)项目的整个源代码。
因此这里是直接链接到 Metaphone 3 源代码的新链接 https://searchcode.com/codesearch/view/2366000/
劳伦斯·飞利浦
Metaphone 3 旨在返回一个近似音调(和一个备用的近似音调),对于英语 * 单词和大多数在美国熟悉的名字,发音相似,应该是相同的。* 键值不是单词的精确语音,甚至音位,* 表示。这是因为一定程度的“模糊性”已被证明*有助于补偿发音变化以及*听错的发音。例如,虽然美国人通常不知道它,但 * 字母 's' 通常在诸如“sounds”之类的词的末尾发音为 'z'。
编码的“近似”方面是根据以下规则实现的:
* * (1) 所有元音都被编码为相同的值 - 'A'。如果参数 encodeVowels * 设置为 false,则只会对初始元音进行编码。如果 encodeVowels 设置 * 为 true,'A' 将在单词中任何元音通常 * 发音的所有位置进行编码。'W' 和 'Y' 被视为元音。尽管 * 'W' 和 'Y' 的发音在不同情况下存在差异,导致它们在某些情况下被 * 归类为元音,而在其他情况下被归类为辅音,但出于“模糊性”的目的
* * (2) 浊辅音和清辅音对映射到相同的编码值。这意味着:
* 'D' 和 'T' -> 'T'
* 'B' 和 'P' -> 'P'
* 'G' 和 'K' -> 'K'
* 'Z' 和 'S ' -> 'S'
* 'V' and 'F' -> 'F'
* * - 除了上述浊音/清音规则之外,'CH' 和 'SH' -> 'X',其中 'X' *表示 Metaphone 3 编码中的“-SH-”和“-CH-”声音。
我认为让一般社区被拒绝算法(不是代码)是错误的
我是卖源码的,所以算法没有隐藏。我要 40.00 美元的源代码副本,并要求其他使用 Metaphone 3 为其软件或服务收费的人向我支付许可费,并要求源代码不要由其他人分发(除了对于我为 Google Refine 做的一个例外 - 我只能要求您不要重新分发与 Refine 包分开的 Metaphone 3 副本。)
实际上 Metaphone3 是一种算法,它有许多非常具体的规则,是一些测试用例分析的结果。因此,它不仅是一种纯粹的算法,而且还带有额外的领域知识。为了获得这些知识和具体规则,作者需要付出很大的努力。这就是为什么这个算法不是开源的。
无论如何,有一个替代方案是开源的:Double Metaphone。见这里:https ://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/language/DoubleMetaphone.html
这不是商业帖子,我与所有者没有任何关系,但值得一提的是,Metaphone3 的实现可作为商业软件从其创建者amporphics.com 获得。它看起来像他的私人商店。这是一个 Java 应用程序,但我购买了 Python 版本,它运行良好。
为什么选择Metaphone3?页面说:
拼写变化的一种常见解决方案是数据库方法。已经完成了一些非常令人印象深刻的工作,积累了来自世界各地的个人名字变化。(当然,当零售这些数据库的公司宣传他们也使用某些版本的 Metaphone 来提高他们的灵活性时,我们总是很高兴 :-))
但是 - 这种方法存在一些问题:
- 它们只有在遇到拼写变化或数据库中尚不存在的新单词或名称时才能正常工作。
然后他们根本不工作。
Metaphone 3 是一种算法方法,可为您输入的任何内容提供语音查找键。
- 个人姓名,即名字和姓氏,与公司名称不同。事实上,公司或机构的名称可能包含任何类型的词,而不仅仅是名称。数据库解决方案通常不涵盖常规“字典”单词的可能拼写变化或拼写错误。或者如果他们这样做,不是很彻底。
Metaphone 3 的开发是为了解释英语单词中常见的所有拼写变化,在美国和欧洲发现的名字和姓氏,以及美国人熟悉母语发音的非英语单词。它不关心你想匹配什么样的词。
对于它的价值,我们许可了代码,因为它价格实惠且易于使用。我还不能谈论性能。PyPi 上有很好的替代品,但我目前找不到它们。