2012-02-06 4 views
0

아래 코드는 훌륭하게 작동합니다. 문자열 $commentstring에서 발생하는 단어 목록을 생성 횟수에 따라 순위를 매 깁니다. $blacklist의 숫자와 그 밖의 것은 생략합니다.문자열에있는 단어에서 구두점 제거

구두점으로 끝나는 단어를 고유 한 것으로 취급합니다. 따라서 american, american.american,은 모두 다른 것으로 간주됩니다. 구두점으로 끝나는 지 여부와 관계없이 어떻게 단어를 동일하게 만들 수 있습니까?

$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

루프 내부의'arsort()'를 보면 약간 혼란스러워졌습니다. 더 나은 성능과 동일한 결과를 얻으려면 foreach 루프 외부로 이동하십시오. –

+0

뭔가 빠졌을 수도 있지만 단순히 str_word_count()를 사용하고 블랙리스트를 필터링하는 것이 잘못된 이유는 무엇입니까? –

답변

0

freefaller의 해결책에 대한 대안은 문자열을 토큰 화하기 전에 없애고 싶은 모든 문장 부호를 제거하는 것입니다.

$text = str_replace(array('.',',',':'), '', $commentstring); 
$words = explode(' ', $text); 
0

정규식 사용을 고려 했습니까? preg 함수 (예 : preg_match_all)와 \ b [\ w] * \ b 행의 패턴을 확인하십시오.

0

간단히 말하면 단어에서 앞뒤에 구두점을 제거하는 것이 가장 쉽습니다. 그것을 "블랙리스트에 올라있는"단어 목록과 비교하십시오.

당신이 단어를 폭발 후 다음을 삽입 :

foreach ($words as &$w) { $w = preg_replace('/\W/', '', $w); } 

그것은 $words의 모든 항목에 걸쳐 반복 처리가 아닌 단어 문자를 제거하여이를 수정합니다. "단어"문자는 A-Za-z0-9이고 밑줄 (올바르게 입력 한 경우)입니다.


효율을 위해 arsort($result);을 foreach 루프 외부로 이동하십시오. 그것은 한 번 실행됩니다 보장 할 가능성이 당신이 처리하는 단어마다 한 번 실행하는 것보다 낫다.

+0

일부 블랙리스트에 포함 된 단어는 아포스트로피를 포함합니다. – Wiseguy

+0

그러면'/ \ W /'대신'/ [^ A-Za-z \ '] /'를 사용할 수 있습니다. –

관련 문제