实现拼音搜索的最有效方法

2022-09-02 20:07:57

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

我认为替换元音和一些辅音可能是有效的。包含一些特殊情况也可能是件好事,比如末尾的无声 E 或 F 和 PH。最好在C++中使用 cstring 或字符串?将带有替换值的副本存储在内存中还是每次我们查找某些内容时调用函数会更好?


答案 1

除了Soundex之外,您还会发现MetaphoneDouble Metaphone语音算法,这似乎是英语发音的改进,并且是一种非常新的算法。

对于德语发音,我使用“Kölner Phonetik”。

Apache Commons编解码器为您提供了这些基本算法(Soundex,Metaphone等)的非常简单的Java实现。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");

然后,您可以简单地对两个字符串执行此操作并比较语音值。Hava 如果您正在比较两个字符串,请看下面的帖子,因为 equals() 方法只是黑白的,也许您想知道它匹配了多少 %:

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


答案 2

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

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

我不确定你到底是什么意思(微软的?),但标准类对于这个问题来说完全没问题,这将是我的首选。cstringCStringstd::string