PHP. Автоматическая генерация ключевых слов для сайта

Данный материал предоставлен сайтом PacificSky.Ru исключительно в ознакомительных целях. Администрация не несет ответственности за его содержимое.
Автоматическая генерация ключевых слов для сайта

PHP. Автоматическая генерация ключевых слов для сайта


В данной статье рассмотрен пример реализации кода, для автоматической генерации ключевых слов на основании текста статьи.
Допустим вы реализуете сбой (блог, cms и тд). И вам захотелось автоматически генерировать ключевые слова для своего контента.
Если это так, то данная статья вам будет интересна.

В статье будет приведен пример в котором будут отбираться ключевые слова .
Слова буду отбираться на основании повторения их в тексте статьи.
Проще говоря. У нас есть текст произвольной длины. Мы будем собирать все слова содержащиеся в тексте и подсчитывать количество их повторений.
Чем чаще будут повторяться слова, тем выше они будут выдаваться в массиве ключевых слов. Мы можем делать отбор слов по частоте их повторений в тексте, а так же ограничить результирующее количество ключевых слов.

Для написания данной статья я воспользовался статьей: Подсчет количества совпадений слов в массиве
Нужно взять функцию написанную в данной статье и модифицировать ее.

И так. Приступим.

$text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et " .
    "dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex" .
    " ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat" .
    " nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit" .
    " anim id est laborum.";


Будем считать, что текст содержащийся в переменной $text, это текст вашей статьи.
Создадим массив слов, упоминающийся в данном тексте.
$array = explode(' ', $text);


Я разбираю текст на массив слов с условием, что слова разделены символом 'пробел'.
Еще один пример разделения строки на массив слов.
Понимаю, что это не правильно, так как в массив могут попадать слова с лишними символами, но это только пример.

Так же можно применить альтернативный (и вероятно правильный)
вариант поиска слов в тексте с помощью регулярного выражения.

Ограничимся количеством возвращаемых ключевых слов:
$maxKeywordCount = 10; // Максимальное количество ключевых слов


Модифицированная функция подсчета слов в массиве:
/**
 * @param $arrayWords - Массив слов полученный из текста
 * @param int $repeatWordCount - Учитывать слова с указанным количеством повторений
 * @param int $minWordLength - Учитывать слова с данным количеством символов
 *
 * @return array - Полученный массив с ключевыми словами
 */
function keywords($arrayWords, $repeatWordCount = 2, $minWordLength = 3) {
    $tmpArr = [];
    $resultArray = [];

    foreach ($arrayWords as $val) {
        if (strlen($val) >= $minWordLength) {
            $val = mb_strtolower($val);
            if (array_key_exists($val, $tmpArr)) {
                $tmpArr[$val]++;
            } else {
                $tmpArr[$val] = 1;
            }
        }

        if ($tmpArr[$val] >= $repeatWordCount) {;
            $resultArray[$val] = $tmpArr[$val];
        }
    }


$arrayWords - Массив слов
$repeatWordCount = 2 - Учитывать слова, которые повторяются указанное количество раз
$minWordLength = 3 - Учитывать слова длинна которых не менее указанного количества символов


В самой функции все слова приводятся к нижнему регистру, для корректного подсчета слов с буквами разного регистра.
$val = mb_strtolower($val);


Подсчитываем повторение слов и записываем с массив, где ключом является само слово, а значением количество повторений
if (array_key_exists($val, $tmpArr)) {
    $tmpArr[$val]++;
} else {
    $tmpArr[$val] = 1;
}


Далее в данном цикле мы пишем в результирующий массив слова с указанным минимальным количеством повторений:
if ($tmpArr[$val] >= $repeatWordCount) {;
    $resultArray[$val] = $tmpArr[$val];
}


Сортируем массив в обратном порядке, сохраняя ключи, для сортировки по убыванию слов с максимальным количеством повторений.
arsort($resultArray);


И напоследок отбираем требуемое, указанное количество слов:
array_slice(keywords($array), 0, $maxKeywordCount)


Функция array_slice нам нужна для отбора первых 10 значений массива (Указанных в переменной $maxKeywordCount).
Первым параметром в функцию array_slice мы передаем массив ключевых слов, вторым параметром указываем позицию с которой мы будем отбирать массив (в нашем случае это 0 позиция), третий параметр это конечная позиция элемента.

Пример всего кода:

/**
 * @param $arrayWords - Массив слов полученный из текста
 * @param int $repeatWordCount - Учитывать слова с указанным количеством повторений
 * @param int $minWordLength - Учитывать слова с данным количеством символов
 *
 * @return array - Полученный массив с ключевыми словами
 */
function keywords($arrayWords, $repeatWordCount = 2, $minWordLength = 3) {
    $tmpArr = [];
    $resultArray = [];

    foreach ($arrayWords as $val) {
        if (strlen($val) >= $minWordLength) {
            $val = mb_strtolower($val);
            if (array_key_exists($val, $tmpArr)) {
                $tmpArr[$val]++;
            } else {
                $tmpArr[$val] = 1;
            }
        }

        if ($tmpArr[$val] >= $repeatWordCount) {;
            $resultArray[$val] = $tmpArr[$val];
        }
    }

    arsort($resultArray);

    return $resultArray;
}

var_dump(array_slice(keywords($array, 1), 0, $maxKeywordCount));


Результат выполнения кода:
'dolore' => int 2
'dolor' => int 2
'occaecat' => int 1
'reprehenderit' => int 1
'voluptate' => int 1
'velit' => int 1
'esse' => int 1
'cillum' => int 1
'fugiat' => int 1
'nulla' => int 1


В результате мы получили 10 ключевых слов. 2 Из которых имеют 2 повторения в тексте, остальные по одному.
По хорошему на будущее нужно реализовать отбор слов через регулярное выражения с условием отбора на любой знак, кроме букв, включая пробел.
Возможно в будущем статья будет дописана и доработана.
На этом все.

Комментариев 2

  1. Офлайн
    Автор, неплохо придумал
  2. Офлайн
    Fixlix 14 декабря 2018 22:05
    Цитата: Web Designer (Master)
    Автор, неплохо придумал

    Спасибо
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.