Стемминг и подсчёт слов с одинаковой основой в тексте на PHP

Кот программиста

Стеммер Портера часто используется копирайтерами, сеошниками, др. в программных решениях для поиска и аналитики текстов, т. к. прост и не требует больших ресурсов. Из этой статьи вы узнаете, что такое стемминг и  Стеммер Портера, сможете бесплатно скачать его PHP реализацию для русского и английского языков и приобрести полезный скрипт аналитики текстов «Stemmer».

Что такое Стемминг?Стемминг (от англ. stem — основа) — процесс нахождения основы слова для заданного исходного слова.

Алгоритм стемминга — вариант решения задачи нахождения основы слова, которая является давней проблемой в области компьютерных наук. Первый опубликованный стеммер был написан Джулии Бет Ловинс ещё в 1968 году.

В предлагаемом решении используется Стеммер Портера — алгоритм стемминга, опубликованный Мартином Портером в 1980 году, который не использует баз основ слова, а последовательно применяет к исходному слову ряд правил для отсечения окончаний и суффиксов слов, основываясь на особенностях того или иного языка.

Бесплатно скачать PHP-скрипт «Стеммер Портера» можно по ссылкам:

  • stemmer_ru.php — Стеммер Портера для русского языка [скачать]
  • stemmer_en.php — Стеммер Портера для английского языка [скачать]

Примечание: следует учесть, что для русского языка используется кодировка UTF-8 и функции для работы с многобайтными строками. В частности, будет не лишним указать:

header('Content-Type: text/html; charset=UTF-8');
mb_internal_encoding('UTF-8');

Использовать «Стеммер Портера» можно подключив php-скрипт, создав объект и вызвав его функции getWordBase($word), где $word — переменная, значением которой является исходное слово, для которого нужно найти основу слова, например:

$word = 'стемминга';
include_once('stemmer_ru.php'); // подключение PHP-скрипта
$ru = new Stemmer_RU; // создание объекта
$stem = $ru->getWordBase($word); // получение основы слова
echo $stem; // выведет — стемминг

Для мульти-язычного текста советую добавить проверку входящих в слово знаков, например:

$word = 'стемминга';
include_once('stemmer_ru.php');
include_once('stemmer_en.php');
$ru = new Stemmer_RU;
$en = new Stemmer_EN;
if( preg_match("'^[а-я]+$'iu", $word) ){
  $stem = $ru->getWordBase($word);
} elseif( preg_match("'^[a-z]+$'iu", $word) ){
  $stem = $en->getWordBase($word);
}

Для получения слов из текста я использую следующий код:

$words = preg_match_all("'\w{2,}'u", $in, $m) ? $m[0] : array();

В данном случае спецсимвол \w представляет собой любую цифру, буку или знак подчеркивания, а значение {2,} определяет количество вхождений от 0 и более. Подробней о регулярных выражениях читайте «Шпаргалка: регулярные выражения в PHP»

Стемминг и подсчёт слов с одинаковой основой в тексте

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

Стемминг и подсчёт слов с одинаковой основой в тексте
Стемминг и подсчёт слов с одинаковой основой в тексте

Скопировав PHP-скрипт на локальный сервер или сервер хостинг провайдера, вы получаете простой и удобный сервис анализа текстов.

Результат работы «Stemmer» — таблица, состоящая из двух частей: Stems (основы слов) и Words (словоформы).

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

В каждой строке таблицы отображаются основа и её словоформы. При этом для основы отображено общее количество словоформ, а для каждой словоформыколичество её упоминаний в тексте.

Примечание: если количество равно единице (1) оно не отображается.

На данный момент PHP-скрипт «Stemmer» можно
купить за символическую сумму — 10 рублей и более.

Описание товара | Покупка товара

И так, имея под рукой Стеммер Портера, нахождение основы слова не займёт у вас много времени и ресурсов. Следовательно, вы можете решать ряд смежных задач поиска и аналитики текстов. В качестве наглядного примера, предложен PHP-скрипт «Stemmer». Имея символическую цену, он станет полезным приобретением для копирайтеров, сеошников, др.

Анонимный
Анонимный комментирует...

Какой максимальный объем обрабатываемого текста? Можно ли доработать так чтобы считал не отдельные слова, а словосочетания из 2х и 3х слов?

Константин Кирилюк
Константин Кирилюк комментирует...

В самом скрипте ограничения на объём текста нет, но есть ограничение по ресурсам сервера: объём памети, лимит времени выполнения скрипта и прочее. Увы, но Стеммер Портера тоже чего-то потребляет, плюс обработка самого результата.

Что же до слово-сочетаний, то это реализуемо; подумаю, может и сделаю что-то такое.

seoonly.ru
seoonly.ru комментирует...

Спасибо за код!

Unknown
Unknown комментирует...

Поставил на сервак. Английский текст обрабатывает хорошо, а на русском не дает результата.
В чем может быть косяк?
Скрин https://yadi.sk/i/kZn9o9BQ32jd6Q

Константин Кирилюк
Константин Кирилюк комментирует...

Самый вероятный вариант — при заливке скриптов на сервер у файлов слетела UTF кодировка. Т.е. нужно будет перекодировать в UTF-8.

Первое, что советую глянуть — в какой кодировке браузер отображает страницу.

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

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

Константин Кирилюк
Константин Кирилюк комментирует...

Вспомнил ещё один момент. Попробуй заменить строку:

$in = preg_match_all("'\w{2,}'u", $in, $m) ? $m[0] : array();

на следующую:

$in = preg_match_all("'[a-zа-яё]{2,}'u", $in, $m) ? $m[0] : array();

Не все сервера нормально поддерживают спецсимвол \w, зачастую он не включает кикрилицу.