我有这样的文字:
$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 ?
Mike以及如何将其视为不同的单词。
str_word_count解决方案中未涵盖此问题:KISMEN @here #there
。 at和dash符号,不会被考虑在内。
这不会涵盖J.J.Johanson
。虽然这是一个单词,但它将被视为JJJohanson
问题,感叹号应该从文字中删除。
是否有更好的方法可以通过str_word_count
支持获得UTF8
行为?存在于此问题顶部的$text
是我的参考。
(如果你能提供一个小提琴你的答案会更好)
答案 0 :(得分:7)
你永远不会有一个完美的字数统计解决方案,因为字数统计概念在某些语言中不存在或太难。 UTF8与否无关紧要。
日语和中文不是空间象征主义语言。他们甚至没有静态单词列表,你必须在找到动词和名词之前阅读整个句子。
如果您想支持多种语言,则需要使用特定语言的标记生成器引擎。您可以研究全文索引,标记器,CJK标记器,CJK分析器以获取更多信息。
如果您只想支持有限的选定语言,只需在越来越多的案例中改进您的正则表达式。
答案 1 :(得分: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
)以满足您的需求。