实现语音搜索的最有效方式

在C ++和/或Java中实现语音搜索的最有效方法是什么? 通过语音搜索,我的意思是替代听起来相似的元音或辅音。 这对名字特别有用,因为有时候人们的名字会有一些奇怪的拼写。

我认为替代元音和一些辅音可能是有效的。 包括一些特殊情况如最后的静音E或F和PH也可能是好的。 在C ++中使用cstrings或字符串是否最好? 使用替换值将副本存储在内存中或者每次查找内容时调用函数会更好吗?

Soundex及其变体是此标准算法。 它使用语音规则将名称转换为字母数字代码。 具有相同代码的名称组合在一起。

就实现搜索而言,我将使用一种数据结构,将每个soundex代码映射到具有该代码的名称列表。 根据所使用的数据结构(散列表或树),可以在时间上完成查找,该时间在不同的soundex代码的数量上是对数的常数。

我不确定cstring (微软的CString ?)究竟是什么意思,但是标准的std::string类对于这个问题来说非常好,并且是我的首选。

除了Soundex,你还会发现MetaphoneDouble 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

只需键入以下代码即可获得String的语音值:

 Soundex soundex = new Soundex(); String phoneticValue = soundex.encode("YourString"); 

然后你可以简单地用两个字符串来比较语音值。 如果您要比较两个字符串,请查看以下post,因为equals()方法只是黑色和白色,也许您想知道匹配的百分比:

如何比较Java中几乎相似的字符串? (字符串距离测量)