2011-12-02 97 views
13

在C++和/或Java中實現語音搜索的最有效方法是什麼?通過語音搜索,我的意思是替代聽起來相似的元音或輔音。這對名字特別有用,因爲有時候人們的名字有些奇怪的拼寫。實現語音搜索的最有效方式

我想這可能是有效的取代元音和一些輔音。最後還可以包括一些特殊情況,如最後的沉默E或F和PH。在C++中最好使用cstrings還是字符串?每次我們尋找什麼東西時,將替換值存儲在內存中還是調用函數會更好?

回答

13

Soundex及其變體是此標準算法。它使用語音規則將名稱轉換爲字母數字代碼。具有相同代碼的名稱被分組在一起。

就實現搜索而言,我會使用一個數據結構,將每個soundex代碼映射到具有該代碼的名稱列表。根據所使用的數據結構(散列表或樹),可以在不同soundex代碼的數量上對數不變地進行查找。

我不確定你的意思是cstring(微軟的CString?),但標準std::string類對於這個問題將會非常好,並且是我的首選。

+0

我的意思是一個'char'類型的數組。 –

+1

@ user964672:沒有理由這樣做 - 我的建議是堅持使用'std :: string'。 – NPE

19

除了探測法你還可以找到音位雙音位語音算法,這似乎是對英語發音的改進,是一個相當新的算法。

對於德語發音,我使用「KölnerPhonetik」。

阿帕奇共享編解碼器爲您提供了一個非常簡單的Java 實施這些基本算法(探測法,音位,...) ​​ 例如看到了同音的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)

由'cstring'提供的
+0

您是否知道「KölnerPhonetik」的JAVA實現 – mica

+1

是的 - 我們使用了apache commons編解碼器。在這裏您可以找到「科隆音樂」課程。 'new ColognePhonetic()。encode(「Hans」)'。但我們現在不再使用德語了,它似乎忽略了太多東西,幾乎所有的詞都被認爲是平等的。 – FiveO

+0

德語我發現漢諾威語音學,一個Java實現phonet4java,出租車在這裏找到:http://code.google.com/p/phonet4java – mica

相關問題