将str_word_count用于UTF8文本

时间:2014-02-08 21:54:52

标签: php utf-8 text-manipulation

我有这样的文字:

$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是我的参考。

(如果你能提供一个小提琴你的答案会更好)

2 个答案:

答案 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)以满足您的需求。

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