Использование str_word_count для текстов UTF8

У меня есть этот текст:

$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 ? Майк и как не будут рассматриваться как разные слова.

Это не рассматривается в решении str_word_count: KISMEN @here #there. Знак "Вкл" и "Фишка" и не принимается во внимание.

Это не будет покрыто J.J.Johanson. Хотя это слово, оно будет рассматриваться как JJJohanson

Вопрос, восклицательные знаки должны быть удалены из слов.

Есть ли лучший способ получить поведение str_word_count с поддержкой UTF8? $text, который существует в верхней части этого вопроса, является ссылкой для меня.

(Было бы лучше, если бы вы могли дать скрипку свой ответ)

Ответ 1

У вас никогда не будет префиксного решения для подсчета слов, потому что концепция слов-слов не существует или слишком сложна на некоторых языках. UTF8 или нет, не имеет значения.

Японский и китайский языки не являются языком пространственного токенизма. У них даже нет статического списка слов, вам нужно прочитать все предложение, прежде чем найти глагол и существительное.

Если вы хотите поддерживать несколько языков, вам понадобится конкретный движок токенизатора. Вы можете исследовать полнотекстовый индекс, токенизатор, CJK-токенизатор, CJK-анализатор для получения дополнительной информации.

Если вы хотите поддерживать только ограниченные выбранные языки, просто улучшите ваши регулярные выражения все чаще и чаще.

Ответ 2

Я думаю, что вы на правильном пути с 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) для удовлетворения ваших потребностей.

Fiddle: http://ideone.com/JoIJqv