2014-02-08 81 views
12

我有這樣的文字:爲UTF8文本使用str_word_count

$text = "Başka, küskün otomobil kaçtı buraya küskün otomobil neden kaçtı 
      kaçtı buraya, oraya KISMEN @here #there J.J.Johanson hep. 
      Danny:Where is mom? I don't know! Café est weiß for 2 €uros. 
      My 2nd nickname is mike18."; 

最近,我用這個。

$a1= array_count_values(str_word_count($text, 1, 'ÇçÖöŞşİIıĞğÜü@#é߀1234567890')); 
arsort($a1); 

你可以用這個小提琴檢查:
http://ideone.com/oVUGYa

但這種方法並不能解決所有問題,UTF8。我不能將whole UTF8 set作爲參數寫入str_word_count。

所以我創造了這個:

$wordsArray = explode(" ",$text); 
foreach ($wordsArray as $k => $w) { 
    $wordsArray[$k] = str_replace(array(",","."),"",$w); 
} 
$wordsArray2 = array_count_values($wordsArray); 
arsort($wordsArray2); 

輸出應該是這樣的:

Array (
[kaçtı] => 3 
[küskün] => 2 
[buraya] => 2 
[@here] => 1 
[#there] => 1 
[Danny] => 1 
[mom] => 1 
[don't] => 1 
[know] => 1 
... 
... 
) 

這種運作良好,但它並沒有涵蓋所有的句子題。例如,我用str_replace刪除了逗號和點。

例如,這個解決方案不包括這樣的話:Hello Mike,how are you ?邁克,以及如何不會被視爲不同的單詞。

這不包括在str_word_count解決方案:KISMEN @here #there。在和破折號並不會被考慮在內。

這不會被覆蓋J.J.Johanson。雖然它是一個字,但它將被視爲JJJohanson

問題,感嘆號應從單詞中刪除。

是否有更好的方式獲得str_word_count行爲與UTF8的支持?存在於這個問題頂部的$text是我的參考。

(這將是更好,如果你可以提供一個撥弄你的答案)

+0

我可以想出一些解決方案......但是它們意味着你可以在這裏而不是在@這裏接受這個可以接受的嗎? – Wrikken

+0

不幸的是,我不想失去'@ here'&和'#there'。因爲大多數我們分析推文。 – trante

+0

也讀這個:http://stackoverflow.com/questions/8290537/is-php-str-word-count-multibyte-safe – 2014-02-18 02:06:40

回答

1

我認爲你在正確的軌道與explode上都有點,但不處理正則表達式。

你的代碼更改爲:

$namePattern = '/[\s,:?!]+/u'; 
$wordsArray = preg_split($namePattern, $text, -1, PREG_SPLIT_NO_EMPTY); 
$wordsArray2 = array_count_values($wordsArray); 
arsort($wordsArray2); 
print_r($wordsArray2); 

當然,你可能需要調整正則表達式($regexPattern),以滿足您的需求。

小提琴:http://ideone.com/JoIJqv

7

你將永遠不會有字計數的知府解決方案,因爲字計數的概念是不存在,或在某些語言太難了。 UTF8與否無關緊要。

日文和中文不是空間標記語言。他們甚至沒有一個靜態的單詞列表,你必須在查找動詞和名詞之前閱讀整個句子。

如果你想支持多種語言,你需要語言特定的tokenizer引擎。您可以研究全文索引,標記器,CJK標記器,CJK分析器以獲取更多信息。

如果您只想支持有限的選定語言,只需要改善您的正則表達式並使用更多的情況。

+0

非常有趣! – JSON

+0

韓國IS空間嚴格標記。 –

+0

其實在中文裏,我們很少計算某些東西的「單詞」,只計算它的字符:)(例如,桌子我們會計爲2個單詞而不是1) – Arefly