LiveInternetMail.ru
Форум русской поддержки Joomla!® CMS
27.05.2012, 00:21:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 1.7 FAQ Joomla 1.5 FAQ Joomla 1.0 FAQ Правила форума Новости Joomla Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор Тема: Морфологический поиск?  (Прочитано 638 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
DarkSideRnD
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 36


« : 10.01.2011, 19:19:04 »

Собственно, каким образом можно реализовать его в SOBI2?
Записан
DarkSideRnD
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 36


« Ответ #1 : 12.01.2011, 00:41:32 »

Нашел решение для стандартного поиска, вот как бы его теперь к SOBI2 прикрутить.

Создаём директорию helpers в components/com_search. Сохраняем в неё файл с указанным содержимым под именем rus_stemmer.php
Код:
<?php
class Lingua_Stem_Ru
{
    var $VERSION = "0.02";
    var $Stem_Caching = 0;
    var $Stem_Cache = array();
    var $VOWEL = '/аеиоуыэюя/';
    var $PERFECTIVEGROUND = '/((ив|ивши|ившись|ыв|ывши|ывшись)|((?<=[ая])(в|вши|вшись)))$/';
    var $REFLEXIVE = '/(с[яь])$/';
    var $ADJECTIVE = '/(ее|ие|ые|ое|ими|ыми|ей|ий|ый|ой|ем|им|ым|ом|его|ого|еых|ую|юю|ая|яя|ою|ею)$/';
    var $PARTICIPLE = '/((ивш|ывш|ующ)|((?<=[ая])(ем|нн|вш|ющ|щ)))$/';
    var $VERB = '/((ила|ыла|ена|ейте|уйте|ите|или|ыли|ей|уй|ил|ыл|им|ым|ены|ить|ыть|ишь|ую|ю)|((?<=[ая])(ла|на|ете|йте|ли|й|л|ем|н|ло|но|ет|ют|ны|ть|ешь|нно)))$/';
    var $NOUN = '/(а|ев|ов|ие|ье|е|иями|ями|ами|еи|ии|и|ией|ей|ой|ий|й|и|ы|ь|ию|ью|ю|ия|ья|я)$/';
    var $RVRE = '/^(.*?[аеиоуыэюя])(.*)$/';
    var $DERIVATIONAL = '/[^аеиоуыэюя][аеиоуыэюя]+[^аеиоуыэюя]+[аеиоуыэюя].*(?<=о)сть?$/';
 
    function s(&$s, $re, $to)
    {
        $orig = $s;
        $s = preg_replace($re, $to, $s);
        return $orig !== $s;
    }
 
    function m($s, $re)
    {
        return preg_match($re, $s);
    }
 
    function stem_word($word)
    {
        $word = JString::strtolower($word);
 
        $word = str_replace("ё","е",$word);
        # Check against cache of stemmed words
        if ($this->Stem_Caching && isset($this->Stem_Cache[$word])) {
            return $this->Stem_Cache[$word];
        }
        $stem = $word;
        do {
          if (!preg_match($this->RVRE, $word, $p)) break;
          $start = $p[1];
          $RV = $p[2];
          if (!$RV) break;
 
          # Step 1
          if (!$this->s($RV, $this->PERFECTIVEGROUND, '')) {
              $this->s($RV, $this->REFLEXIVE, '');
 
              if ($this->s($RV, $this->ADJECTIVE, '')) {
                  $this->s($RV, $this->PARTICIPLE, '');
              } else {
                  if (!$this->s($RV, $this->VERB, ''))
                      $this->s($RV, $this->NOUN, '');
              }
          }
 
          # Step 2
          $this->s($RV, '/и$/', '');
 
          # Step 3
          if ($this->m($RV, $this->DERIVATIONAL))
              $this->s($RV, '/ость?$/', '');
 
          # Step 4
          if (!$this->s($RV, '/ь$/', '')) {
              $this->s($RV, '/ейше?/', '');
              $this->s($RV, '/нн$/', 'н');
          }
 
          $stem = $start.$RV;
        } while(false);
        if ($this->Stem_Caching) $this->Stem_Cache[$word] = $stem;
        return $stem;
    }
 
    function stem_caching($parm_ref)
    {
        $caching_level = @$parm_ref['-level'];
        if ($caching_level) {
            if (!$this->m($caching_level, '/^[012]$/')) {
                die(__CLASS__ . "::stem_caching() - Legal values are '0','1' or '2'. '$caching_level' is not a legal value");
            }
            $this->Stem_Caching = $caching_level;
        }
        return $this->Stem_Caching;
    }
 
    function clear_stem_cache()
    {
        $this->Stem_Cache = array();
    }
}
?>

Открываем файл components/com_search/models/search.php, находим реализацию метода setSearch() класса SearchModelSearch. Изменяем код метода на следующий:
Код:
function setSearch($keyword, $match = 'all', $ordering = 'newest')
  {
    if(isset($keyword)) {
      /* Наши изменения *******************************************/
 
      // Указываем, где лежит код стеммера
      require_once(JPATH_COMPONENT.DS.'helpers'.DS.'rus_stemmer.php' );
      // Создаём экземплярчик класса стеммера
      $stemmer = new Lingua_Stem_Ru();
 
      // Разбиваем запрос на отдельные слова
      $words = explode(' ',$keyword);
 
      // (!) &$word - к каждому элементу массива обращаемся по указателю, иначе будет изменяться лишь *копия* элемента массива
      foreach ($words as &$word) {   
        // Отсекаем окончание словоформы 
        $word = $stemmer->stem_word($word);     
      }
      // Указатель нам больше не нужен - подчищаем за собой
      unset($word);
 
      // Склеиваем обрезанные слова в поисковый запрос
      $newKeyword = implode(' ',$words);     
 
      // Для поиска устанавливаем получившийся запрос
      $this->setState('keyword', $newKeyword);
 
      // Для отображения в поле ввода оставляем немодифицированный запрос
      $this->setState('original_keyword',$keyword);
 
      /* /Наши изменения *******************************************/
    }
 
    if(isset($match)) {
      $this->setState('match', $match);
    }
 
    if(isset($ordering)) {
      $this->setState('ordering', $ordering);
    }
  }

в файле components/com_search/views/search/view.html.php в самом конце заменяем одну строчку:
Код:
$this->assign('ordering',    $state->get('ordering'));
 
    // Наша строчка *********************************************************
    $this->assign('searchword',    $state->get('original_keyword'));
    // /Наша строчка *********************************************************   
    $this->assign('searchphrase',  $state->get('match'));
    $this->assign('searchareas',  $areas);
 
    $this->assign('total',      $total);
    $this->assign('error',      $error);
    $this->assign('action',       $uri->toString());
 
    parent::display($tpl);
  }
}

Помогите кто чем может  Smiley
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Рейтинг@Mail.ru Rambler Top100 Powered by SMF 1.1.16 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet