12

我有这段文字:

$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 问题。我不能将整个 UTF8 集作为参数写入 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 and how 不会被视为不同的词。

这在 str_word_count 解决方案中没有涵盖:KISMEN @here #there. 在和破折号标志,不会被考虑在内。

这将不包括在内J.J.Johanson。虽然是一个字,但是会被当作JJJohanson

问题,感叹号应从单词中删除。

有没有更好的方法来获得str_word_count支持UTF8?这个$text问题顶部存在的内容对我来说是参考。

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

4

2 回答 2

7

你永远不会有一个完美的字数解决方案,因为字数概念在某些语言中不存在或者太难了。UTF8 与否无关紧要。

日语和汉语不是空间象征性语言。他们甚至没有静态单词列表,您必须在找到动词和名词之前阅读整个句子。

如果您想支持多种语言,您将需要特定语言的分词器引擎。您可以研究全文索引、tokenizer、CJK-tokenizer、CJK-analyzer 以获取更多信息。

如果您只想支持有限的选定语言,只需通过越来越多的案例改进您的正则表达式模式。

于 2014-02-18T06:13:57.283 回答
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

于 2014-02-11T21:17:51.190 回答