在C++和/或Java中实现语音搜索的最有效方法是什么?通过语音搜索,我指的是替换发音相似的元音或辅音。这对于名字特别有用,因为有时人们的名字有一些奇怪的拼写。
我在想,用元音和一些辅音代替可能是有效的。也可以包括一些特殊的情况,如末尾不发音的E或F和PH。在C++中使用cstring或string是最好的吗?是在内存中存储替换值的副本还是在每次查找时调用函数更好?
发布于 2011-12-03 00:43:20
Soundex及其变种是这方面的标准算法。它使用语音规则将名称转换为字母数字代码。具有相同代码的名称被分组在一起。
至于实现搜索,我将使用一个数据结构,它将每个soundex代码映射到具有该代码的名称列表。根据所使用的数据结构(哈希表或树),查找可以在不同soundex代码的数量的对数上为常数的时间完成。
我不确定你所说的cstring到底是什么意思(微软的CString?)但是标准的std::string类可以很好地解决这个问题,并且是我的首选。
发布于 2012-02-08 16:49:28
除了Soundex之外,你还会发现变音素或双变音素语音算法,这似乎是对英语发音的改进,是一个相当新的算法。
对于德语发音,我使用"Kölner Phonetik“。
Apache Commons Codec为您提供了这些基本算法(Soundex,Metaphone,...)的一个非常简单的Java实现。例如,请参阅soundex的 http://commons.apache.org/codec/: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)
https://stackoverflow.com/questions/8359595
复制相似问题