Как получить наиболее часто встречающиеся слова в тексте

Весьма занимательная задача — анализ текста. Например, получить наиболее часто встречающиеся слова в тексте страницы. Что делать дальше с этими словами — ваше дело.

Итак, у нас есть текст:

$text = "ваш текст";

Первым делом его стоит привести к одному регистру букв:

$text =  mb_convert_case($text, MB_CASE_LOWER, "UTF-8");

Почему не просто strtolower($text)? Потому как с кириллицей оно работает весьма плохо.

Дальше чистим текст от знаков препинания, скобок, кавычек. По-хорошему стоит удалить из текста «всё что не буквы и не пробельные символы».

$text = preg_replace('[,()\"\'\.]/', '', $text)

А затем разбиваем все это дело на слова:

$words = preg_split('/[\s]+/', $text);

И вот тут начинается самое интересное. Как правило, первое приходящее на ум решение — перебор «в лоб»: берём первое слово, смотрим сколько раз встречается, берём второе… Это не оптимально и очень долго если текст большой. Второй обычно следует идея получить уникальные слова в $words и считать их количество. По затратам времени немного быстрее, но всё равно не самый оптимальный способ. Есть ещё третий вариант:

$words = array_count_values($words);
arsort($words);

array_count_values — подсчитывает количество всех значений массива. arsort — сортирует массив в обратном порядке.

Итого, на выходе будет что-то вроде:

Array
(
[и] => 4
[в] => 4
[он] => 3
[будет] => 3
[на] => 2
[так] => 2
...
)

Ну да, предлоги будут наиболее часто встречающимися в тексте. Тут уже результаты чистить придётся. Поможет в этом array_diff(), куда в качестве второго аргумента можно передать массив из слов, которые нам не нужны.

Кстати, полученные результаты весьма сырые и вряд ли отражают полную картину. Мы же даже не учитывали словоформы. Например: блогам, блогами, блогу. Слово одно, а вот падежи разные. Что делать? Подключать ispell или phpmorphy. Но это уже отдельная тема. В чем же тогда смысл данной статьи? Помочь новичками понять что решения «в лоб» не оптимальны. И что стоит чаще обращаться к документации.

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