2012-10-26 39 views
2

我有一堆單詞。例如:將一組相似單詞分組

array(developer,develop,development,design,designer,designing) 

我希望能集團這些話與他們相似的詞放在一起,所以我會得到這樣的事情:

array(
    array(develop, developer, development), 
    array(design, designer, designing), 
); 

什麼是在PHP中做到這一點的最好辦法?

回答

5

您可以輕鬆地使用metaphone()做到這一點:

$result = array(); 
foreach ($array as $word) { 
    $result[metaphone($word, 2)][] = $word; 
} 

print_r($result);將顯示:

Array 
(
    [TF] => Array 
     (
      [0] => developer 
      [1] => develop 
      [2] => development 
     ) 

    [TS] => Array 
     (
      [0] => design 
      [1] => designer 
      [2] => designing 
     ) 
) 
+0

PHP API(如果你可以稱它的話)讓我驚歎不已。構建在語言中的有用「東西」數量非常驚人。 – Luke

+0

是的,幾乎所有東西都有一個功能。其實這是驚人的:) – Carlos

2

您可能想要使用諸如「Porter Stemming」之類的技術來提取每個單詞的詞幹以識別相似的單詞,然後根據這些詞幹構建您的數組。你可以找到的波特施特默爾here

+0

我想過問這個問題前制止,但它可能是在性能上慢(我知道,過早優化是所有邪惡和所有這些的根源)。不管怎麼說,還是要謝謝你! – Luke

3

一個PHP實現的一種方法是向正在添加我的腦海裏

$array = array('developer','develop','development','design','designer','designing'); 

function matchWords(array $in,$pad='4') 
{ 
    $ret = array(); 
    foreach ($in as $v) { 
     $sub = substr($v, 0, $pad); 
     if (!isset($ret[$sub])) { 
      $ret[$sub] = array(); 
     } 
     $ret[$sub][] = $v; 
    } 

    return array_values($ret); 
} 

print_r(matchWords($array,4)); 

Array 
(
    [0] => Array 
     (
      [0] => developer 
      [1] => develop 
      [2] => development 
     ) 

    [1] => Array 
     (
      [0] => design 
      [1] => designer 
      [2] => designing 
     ) 
) 

這是你的數組值的$pad第一個字母相匹配,並且在其上創建一個關鍵。

+0

我很難決定接受你的答案或者傑克。最後,我實際上使用了提供的一個jackflash,所以我覺得我需要把它作爲正確的答案。但是,如果我能夠接受兩個答案,我會的。我讚揚你對我的問題的快速回應!謝謝! – Luke

相關問題