У меня есть этот текст:
$text = "Başka, küskün otomobil kaçtı buraya küskün otomobil neden kaçtı kaçtı buraya, oraya KISMEN @here #there JJJohanson 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 ?
Майк и как не будут рассматриваться как разные слова.
Это не рассматривается в решении KISMEN @here #there
: KISMEN @here #there
. Знак «Вкл» и «Стрелка» не учитывается.
Это не будет покрыто JJJohanson
. Хотя это слово, оно будет рассматриваться как JJJohanson
Вопрос, восклицательные знаки должны быть удалены из слов.
Есть ли лучший способ получить поведение str_word_count
с поддержкой UTF8
? Текст $text
который существует в верхней части этого вопроса, является ссылкой для меня.
(Было бы лучше, если бы вы могли дать скрипку свой ответ)
У вас никогда не будет префиксного решения для подсчета слов, потому что концепция словария не существует или слишком сложна на некоторых языках. 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