framework.zend.com
Stable релиз 2.0 / 1.12

Фильтр для создания правильных keywords

К комментариям

Недавно, в разрабатываемом на Zend Framework проекте, возникла проблема создания качественных keywords. Я решил ее при помощи написания класса фильтра. Этот фильтр удаляет из текста все стоп-слова и стоп-символы. После чего текст обрабатывается так, что в результате мы имеем строку из самых часто используемых в тексте слов.

Единственный вопрос, который может возникнуть - это что такое стоп-слова и стоп символы? Я уже писал об это в статье про шинглы. Но для тех, кому не хочется читать про шинглы, повторюсь. Стоп-слова и стоп-символы - это тот самый “мусор”, который не учитывается поисковиками при анализе текста. Далее следует код фильтра. Пользуйтесь на здоровье.

<?php

/**
* Vlasov_Filter_Keywords
*
* Фильтр создающий строку для употребления в качестве мета тэга keywords.
*
* @author Кирилл "Кирпич" Власов http://techforweb.ru/
* @version 0.2
*
*/

class Vlasov_Filter_Keywords implements Zend_Filter_Interface
{
/**
* Массив стоп-символов, которые будут удаленны из строки
*
* @var array
*/

protected $_stopSymbols = array();

/**
* Массив стоп-слов, которые будут удаленны из строки
*
* @var array
*/

protected $_stopWords = array();

/**
* Лимит ключевых слов (если 0 значит не лимитированно)
*
* @var integer
*/

protected $_limit = 0;

/**
* Разделитель ключевых слов
*
* @var string|null
*/

protected $_separator = null;

/**
* Конструктор класса
*
* @param integer $limit лимит ключевых слов
* @param array|string $stopWords стоп-слова
* @param array|string $stopSymbols стоп-символы
* @param string|null $separator разделитель ключевых слов
*/

public function __construct($limit = 0, $stopWords = array(), $stopSymbols = array(), $separator = ',')
{
if (!is_array($stopWords)) {
$stopWords = explode(' ', strval($stopWords));
}

if (!is_array($stopSymbols)) {
$stopSymbols = explode(' ', strval($stopSymbols));
}

$this->_limit = intval($limit);
$this->_separator = $separator;
$this->_stopSymbols = $stopSymbols;
$this->_stopWords = $stopWords;
}

/**
* Основной метод фильтрующий строку
*
* @param string $value строка для обработки
* @return string результат
*/

public function filter($value)
{
$keywords = array();
$value = str_replace($this->_stopSymbols, null, $value);

foreach (explode(' ', $value) as $word) {
if (strlen($word) && !in_array(strtolower($word), $this->_stopWords)) {
$keywords[] = trim($word);
}
}

$keywords = array_count_values($keywords);
arsort($keywords);

$keywords = array_keys($keywords);

if ($this->_limit) {
$keywords = array_slice($keywords, 0, $this->_limit);
}

return join($this->_separator . ' ', $keywords);
}
}

Это пример использования:

<?php

// Подключаем фильтр и интерфейс. Лучше, конечно, использовать автозагрузку.
require_once 'Zend/Filter/Interface.php';
require_once 'Vlasov/Filter/Keywords.php';

// Мой любимый набор стоп-слов
$stopWords = 'без более бы был была были было быть вам вас весь во вот все всего всех вы где да даже для
до его ее если есть ещё же за здесь из из-за или им их как как-то ко когда кто ли либо
мне может мы на надо наш не него неё нет ни них но ну об однако он она они оно от очень по под
при со так также такой там те тем то того тоже той только том ты уже хотя чего чей чем
что чтобы чьё чья эта эти это а б в г д е ё ж з и к л м н о п р с т у ф х ц ч ш щ э ь ы ю я';

// Не менее любимые стоп-символы
$stopSymbols = 'x27 x22 x60 \t \n \r \' , . / « » # ; : @ ~ [ ] { } = - + ) ( * & ^ % $ < > ? !';

// Выводим десять самых часто-используемых слов
$filter = new Vlasov_Filter_Keywords(10, $stopWords, $stopSymbols);
echo $filter->filter('Проснувшись однажды утром после беспокойного сна, Грегор Замза обнаружил, что он у себя
в постели превратился в страшное насекомое. Лежа на панцирнотвердой спине, он видел,
стоило ему приподнять голову, свой коричневый, выпуклый, разделенный дугообразными
чешуйками живот, на верхушке которого еле держалось готовое вот-вот окончательно сползти одеяло.
Его многочисленные, убого тонкие по сравнению с остальным телом ножки беспомощно
копошились у него перед глазами.');

Подробнее об о том, что такое фильтры в Zend Framework и как их использовать читайте в официальной документации или здесь. Собственно, добавить больше не чего. Для людей умеющих читать код все ясно.

Оригинал статьи.

метки: Zend_Filter, keywords
Лучший способ следить за обновлениями сайта это подписаться на RSS
Если информация была полезной для вас, вы можете поддержать сайт.
Комментарии:
Александр 03.06.2009 13:37 #
а что в результате выдаст?
Ответить
Александр Махомет 03.06.2009 13:50 #
Строку ключевых слов значимых для поисковой системы, созданную на основе строки с текстом.
Ответить
BelAnt 05.06.2009 11:52 #
Еще бы морфологический разбор к этому прикрутить, а то рейтинг слов не корректно считается ... великий и могучий русский язык.
Ответить
Роман 18.06.2009 01:12 #
>> $keywords[] = trim($word);
считаю, что лучше бы так написать
>> $keywords[trim($word)] = Null;
Ответить
Роман 18.06.2009 01:15 #
Относительно последнего коммента можно допустим вместо Null считать популярность определённого слова и делать уже не asort и сортировку численную (пузырьком допустим)
Ответить
illusive 25.06.2009 12:19 #
Спасибо, как раз надо будет в скором времени реализовать такой функционал на один "портальчик". А Вы не пробовали использовать стеммеры для формирования более релевантных мета-тегов, с помощью отсеивания общекоренных слов?
Ответить
Уважаемые пользователи. Комментарии не для того чтобы:
  1. Спрашивать почему у вас не работает код, для этого есть тема форума закрепленная за статьей.
  2. Спрашивать как реализовать ту или иную функциональность, для этого необходимо создать свою тему на форуме.

Комментарии для того чтобы: высказать свое аргументированное мнение о статье, указать какие участки вызывают непонимание, что нужно исправить/улучшить, просто сказать спасибо.

Комментарии имеют древовидную структуру.
Если вы хотите ответить на определенный комментарий - нажмите на ссылку "Ответить" возле этого комментария.

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