Использование 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