Использование 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 который существует в верхней части этого вопроса, является ссылкой для меня.

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

2 ответа

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

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

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

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

Я думаю, вы на правильном пути 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

Другие вопросы по тегам