在C ++和/或Java中实现语音搜索的最有效方法是什么?通过语音搜索,我的意思是用类似的元音或辅音代替。这对于名字特别有用,因为有时人们的名字会有一些奇怪的拼写。
我认为替代元音和一些辅音可能是有效的。包括一些特殊情况如最后的静音E或F和PH也可能是好的。在C ++中使用cstrings或字符串是否最好?使用替换值将副本存储在内存中或每次查找内容时调用函数会更好吗?
答案 0 :(得分:22)
除了 Soundex ,您还可以找到 Metaphone 或 Double Metaphone 语音算法,这似乎是对英语发音和是一个非常新的算法。
对于德语发音,我使用“KölnerPhonetik”。
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");
然后你可以简单地用两个字符串来比较语音值。 如果你要比较两个字符串,请看Hava看下面的帖子,因为equals()方法只是黑色和白色,也许你想知道它匹配了多少%:
How to compare almost similar Strings in Java? (String distance measure)
答案 1 :(得分:15)
Soundex及其变体是此标准算法。它使用语音规则将名称转换为字母数字代码。具有相同代码的名称将组合在一起。
就实现搜索而言,我将使用一种数据结构,将每个soundex代码映射到具有该代码的名称列表。根据所使用的数据结构(哈希表或树),查找可以在不同的soundex代码数量的对数上保持不变。
我不确定cstring
(微软的CString
?)究竟是什么意思,但标准的std::string
类对于这个问题非常好,并且是我的首选。< / p>