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