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

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你还会发现MetaphoneDouble 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

以上是关于实现语音搜索的最有效方法的主要内容,如果未能解决你的问题,请参考以下文章

12-11锦上添花Flutter AI只能语音搜索功能实现

AI柠檬网站上线站内搜索引擎,支持语音搜索

如何把文字转换成语音?

AI语音识别-我给浏览器加了个语音搜索功能

包含语音到文本数据的 JSON 文件的高级布尔搜索?

我给浏览器加了个语音搜索功能