实现语音搜索的最有效方法
Posted
技术标签:
【中文标题】实现语音搜索的最有效方法【英文标题】:The most efficient way to implement a phonetic search 【发布时间】:2012-01-11 16:12:22 【问题描述】:在 C++ 和/或 Java 中是什么?通过语音搜索,我的意思是替换听起来相似的元音或辅音。这对名字特别有用,因为有时人们的名字有一些奇怪的拼写。
我认为替换元音和一些辅音可能是有效的。最好包括一些特殊情况,例如末尾的静音 E 或 F 和 PH。最好在 C++ 中使用 cstrings 或字符串吗?是不是在内存中存储一个带有替换值的副本,或者每次查找时调用一个函数会更好?
【问题讨论】:
【参考方案1】:除了Soundex你还会发现Metaphone或Double Metaphone语音算法,这似乎是对英语发音和是一个相当新的算法。
对于德语发音,我使用“Kölner Phonetik”。
Apache Commons Codec 为您提供了一个非常简单的 Java 实现这些基本算法(Soundex、Metaphone 等) http://commons.apache.org/codec/ 例如,查看 soundex 的 javadoc: http://commons.apache.org/codec/apidocs/org/apache/commons/codec/language/Soundex.html
只需键入以下代码,即可获得字符串的语音值:
Soundex soundex = new Soundex();
String phoneticValue = soundex.encode("YourString");
然后您可以简单地对两个字符串执行此操作并比较语音值。 如果您要比较两个字符串,请查看以下帖子,因为 equals() 方法只是黑白的,也许您想知道它匹配了多少 %:
How to compare almost similar Strings in Java? (String distance measure)
【讨论】:
你知道“Kölner Phonetik”的 JAVA 实现 是的 - 我们使用了 apache commons 编解码器。在这里您可以找到“ColognePhonetic”类。 '新科隆语音()。编码(“汉斯”)'。但是我们不再将它用于德语,它似乎忽略了太多东西,几乎所有单词都被认为是平等的。 对于德语,我找到了 Hannover-phonetics,一个 java 实现 phonet4java,可以在这里找到:code.google.com/p/phonet4java【参考方案2】:Soundex 及其变体是用于此目的的标准算法。它使用语音规则将名称转换为字母数字代码。具有相同代码的名称被组合在一起。
就实现搜索而言,我将使用一种数据结构,将每个 soundex 代码映射到具有该代码的名称列表。根据所使用的数据结构(哈希表或树),可以及时完成查找,该时间可以是不同 soundex 代码数量的对数常数。
我不确定cstring
(Microsoft 的CString
?)到底是什么意思,但标准的std::string
类可以很好地解决这个问题,并且是我的首选。
【讨论】:
cstring
我的意思是char
类型的数组。
@user964672:这里没有理由这样做——我的建议是坚持使用std::string
。以上是关于实现语音搜索的最有效方法的主要内容,如果未能解决你的问题,请参考以下文章