2012-02-06 35 views
0

下面的代碼返回字符串$commentstring中最常出現的單詞列表,其中沒有標點符號和數字。它工作太棒了。在字符串中保留某些短語

然而,口語短語和品牌名稱被分解成單獨的單詞。我想結合他們。

因此,如果「法國」一詞在「薯條」之前出現,我想將它們合併爲「薯條」一詞。我想提出一個像這樣的短語列表,如「巧克力芯片」,「可口可樂」,「舊學校」等。我怎麼能這樣做?

$commentstring = str_replace(array('/', '*', ')', '(', '!', '.', ',', ':'), '', $commentstring); 

    $words = explode(" ", $commentstring); 


    $result = array(); 

    arsort($words); 







foreach($words as $word) { 

    if(!is_numeric($word)){ 
     $result[$word]++; 
     arsort($result); 
    } 

} 




    echo "<table>"; 


     $blacklist = array($submission, 'DESPITE', 'FARE', 'DECENT', 'AMAZING', 'WOULD', 'DISLIKE', 'HATE', 'OKAY', 'JUST', 'NOTHING', 'CURRENTLY', 'BASICALLY', 'BIT', 'COME', 'WANT', 'TOO', 'HERE', 'EATING', 'EAT', 'WAS', 'TRIED', 'TRY', 'MAKES', 'HAS', 'EVEN', 'THINK', 'BETTER', 'YET', 'MORE', 'LOVE', 'WHILE', 'WHERE', 'WRONG', 'FIND', 'EVER', 'RIGHT', 'BEST', 'HAVE', 'WE', 'WAY', 'GREAT', 'NICE', 'HOW', 'RESTAURANTS', 'RESTAURANT', 'EXCELLENT', 'FORGET', 'THEY', 'REALLY', 'MISS', 'VERY', 'LOOKING', 'YOU\'LL', 'CAN\'T', 'WON\'T', 'PLACE', 'ABOUT', 'FOR', 'MOST', 'GOOD', 'CAN', 'GET', 'THING', 'DON\'T', 'BY', 'YOUR', 'BE', 'YOU', 'BRING', 'THAT\'S', 'LITTLE', 'OTHER', 'MANAGES', 'ATE', 'ATE', 'EAT', 'SO', 'SOMEHOW', 'MAKE', 'ALL', 'UP', 'THEM', 'AS', 'THEM', 'YOU\'RE', 'WILL', 'ONLY', 'IF', 'GO', 'DO', 'I\'VE', 'HAD', 'TO', 'SOME', 'FOOD', 'THIS','DOES', 'NOT', 'IT.', 'IT,', 'SEEM', 'END', 'THERE\'S', 'WHETHER', 'DOUBT', 'WHAT', 'WHICH', 'RECOMMEND', 'THE', 'IS', 'A', 'IT\'S', 'OUT', 'JAN', 'IT', 'IT', 'IT', 'LIKE', 'THAN', 'WITH', 'SEEMS', 'WHICH', 'THAT', 'SAY', 'AT', 'ON', 'AN', 'BUT', 'APART', 'STILL', 'ARE', 'OR', 'TEST', 'IN', 'IT', 'AND', 'SET', 'TO', 'NO', 'OF', '', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'BB', 'CC', 'DD', 'EE', 'FF', 'GG', 'HH', 'II', 'JJ', 'KK', 'LL', 'MM', 'NN', 'OO', 'PP', 'QQ', 'RR', 'SS', 'TT', 'UU', 'VV', 'WW', 'XX', 'YY', 'ZZ'); 


foreach($result as $word => $count1) 
{ 
    if (in_array($word, $blacklist)) continue; 


    echo '<tr>';  
    echo '<td>'; 
    echo "$word"; 
    echo '</td>'; 

    echo '<td>'; 
    echo "$count1 "; 
    echo '</td>'; 

    echo '</tr>'; 

    } 

    echo "</table>"; 
+0

你需要一個明確的清單,甚至更好:語義規則。這是另一個級別... – 2012-02-06 23:55:34

+0

@Idiqual我更願意列出清單。 – John 2012-02-06 23:56:07

+0

這是不可能的,有無限的組合。如果你想做對,你必須使用語言分析。這是一個很大的錘子,所以它可能不適合你的需求。 – 2012-02-07 00:11:20

回答

0

您的單字foreach循環之後,這樣做:

$doublewords = array(); 
foreach ($words as $i=>$word) 
{ 
    if (!isset($words[$i+1])) continue; 
    $combined = strtolower($word." ".$words[$i+1]); 
    if (!isset($doublewords[$combined])) $doublewords[$combined] = 0; 
    $doublewords[$combined]++; 
} 

然後$doublewords包含任何雙字組合。像「薯條」這樣的東西比像「這樣的」這樣的隨機組合更頻繁地發生,所以它們最終會有更高的數量。

更新,使之成爲一個特定列表工作:

$doublewords = array(
    'french fries'=>0, 
    'french toast'=>0, 
); 
foreach ($words as $i=>$word) 
{ 
    if (!isset($words[$i+1])) continue; 
    $combined = strtolower($word." ".$words[$i+1]); 
    if (!isset($doublewords[$combined])) continue; 
    $doublewords[$combined]++; 
} 

(PS加入strtolower爲好。)

+0

我想使用特定的短語列表,而不管它們出現的頻率如何。 – John 2012-02-07 00:08:34

+0

您可能只顯示一個*小*主動... – mvds 2012-02-07 00:09:53

+0

但我爲您添加了預填充版本 – mvds 2012-02-07 00:11:36