2014-11-23 67 views
1

我正在使用Java中不同單詞的語音匹配。我使用了Soundex,但它太粗糙了。我轉向了Metaphone,並意識到它更好。但是,當我嚴格測試它。我發現奇怪的行爲。我想問這是否是metaphone的工作方式,或者我是否以錯誤的方式使用它。在下面的例子中其正常工作: -Metaphone算法的意外結果

Metaphone meta = new Metaphone(); 
if (meta.isMetaphoneEqual("cricket","criket")) System.out.prinlnt("Match 1"); 
if (meta.isMetaphoneEqual("cricket","criketgame")) System.out.prinlnt("Match 2"); 

這將打印

Match 1 
    Mathc 2 

現在,「蟋蟀」聽起來像「criket」,但怎麼來的「蟋蟀」和「criketgame」是相同的。如果有人會解釋這一點。這將有很大的幫助。

回答

1

您的用法稍微不正確。編碼的字符串和默認的最大編碼長度的快速調查表明,它是4,其截斷較長「criketgame」的末尾:

System.out.println(meta.getMaxCodeLen()); 
System.out.println(meta.encode("cricket")); 
System.out.println(meta.encode("criket")); 
System.out.println(meta.encode("criketgame")); 

輸出(注意「criketgame」是從「KRKTKM」截短「 KRKT」,它匹配‘板球’):

 
4 
KRKT 
KRKT 
KRKT 


解決方案:將最大碼長到適合您的應用程序和預期輸入的東西。例如:

meta.setMaxCodeLen(8); 
System.out.println(meta.encode("cricket")); 
System.out.println(meta.encode("criket")); 
System.out.println(meta.encode("criketgame")); 

現在輸出:

 
KRKT 
KRKT 
KRKTKM 

現在你原來的測試給出了預期的結果:

Metaphone meta = new Metaphone(); 
meta.setMaxCodeLen(8); 
System.out.println(meta.isMetaphoneEqual("cricket","criket")); 
System.out.println(meta.isMetaphoneEqual("cricket","criketgame")); 

印刷:

 
true 
false 

順便說一句, 你可以也想試驗DoubleMetaphone,這是該算法的改進版本。


順便說一句,從the documentation注意警告關於線程安全:

的實例字段maxCodeLen是可變的,但是不揮發,並訪問不同步。如果類的實例在線程之間共享,則調用者需要確保使用適當的同步來確保線程之間的值安全發佈,並且在初始設置後不得調用setMaxCodeLen(int)

+0

我們在8年級時曾教過諺語「外表是騙人的」 – jaykio77 2014-11-24 14:39:53