2011-08-15 67 views
0

我有一個包含短語(幾到幾百)的數組。如何使用PHP減少數組中包含的類似短語的數量?

實施例:

adhesive materials 
adhesive material 
material adhesive 
adhesive applicator 
adhesive applicators 
adhesive applications 
adhesive application 
adhesives applications 
adhesive application systems 
adhesive application system 

編程,使用PHP,我想使用像詞幹(某些變化是可以接受的,例如,粘合劑塗布器和粘合劑可以應用的東西上面的列表減少到下面的列表。難以區分彼此,因爲莖是相同的):

adhesive material 
material adhesive 
adhesive applicator 
adhesive application 
adhesive application system 

這樣做的最佳方法是什麼?

回答

1

您會決定一個最小閾值,然後使用levenshtein函數來確定單詞的接近程度。

它看起來像你或多或少會做這樣的:

$origs = array(); 
// assuming your example is an array already. 
foreach($setList as $set) 
{ 
    $pieces = explode(' ', $set); 
    $add = true; 
    foreach($origs as $keySet) 
    { 
     if(levenshtein($pieces[ 0 ], $keySet[ 0 ]) < 3 || 
      levenshtein($pieces[ 1 ], $keySet[ 0 ]) < 3) 
     { 
      $add = false; 
      break; 
     } 
    } 

    if($add) $origs[] = $pieces; 
} 

你會留下類似的輸出列表。如果您偏好列表中最短的單詞,但需要進行一些修改,但您明白了。

+0

這個工作完美,除了我不需要將術語分解成單個單詞。我不確定你爲什麼這麼做。我使用了'lavenshtein($ set,$ keySet)<3'。也許你的版本也刪除轉置重複的短語(稍後可能會這樣做)。 –

+0

@T。布賴恩瓊斯看起來你在那裏有一些獨特的話,可以打電話給你。很高興你不需要爆炸! – cwallenpoole