class LsSimilarTopics extends Module {
public function Init() {
}
public function GetSimilarTopics($oTopic){
$iNumTitle = 0;
foreach (array_unique(preg_split('/[\s,]+/',$oTopic->getTitle())) as $var)
{
if (mb_strlen($var,'UTF-8')>1 and $var!='—') $iNumTitle++;
}
$iNumTags = 0;
foreach (array_unique(preg_split('/[\s,]+/',$oTopic->getTags())) as $var)
{
if (mb_strlen($var,'UTF-8')>1 and $var!='—') $iNumTags++;
}
$iNumTags = count(array_unique(preg_split('/[\s,]+/',$oTopic->getTags())));
$iNumTags = ($iNumTags > Config::Get('module.similartopics.num_tags')-1 )? Config::Get('module.similartopics.num_tags'): $iNumTags;
$sTitleTags='@topic_tags "'.$oTopic->getTags().'"/'.$iNumTags.' @(topic_title,topic_text) "'.$oTopic->getTitle().'"/'.round($iNumTitle*Config::Get('module.similartopics.percent_title'));
$aTopics=array();
if($data=$this->Sphinx_FindSimilarTopics($sTitleTags,Config::Get('module.similartopics.count')+1,array('topic_publish' => 1))){
foreach($data['matches'] as $k=>$v){
$obj=$this->Topic_GetTopicById($k);
if($k!=$oTopic->getId() && isset($obj)) $aTopics[]=$obj;
}
}
return $aTopics;
}
}
в конфиг similartopics внести строчки
$config['num_tags'] = 2; // какое количество тегов должно совпадать с тегами других топиков, что бы другие топики были «похожим»
$config['percent_title'] = 0.6; // процент количества всех слов из заголовка, которые должны совпасть с заголовками и текстами других топиков, чтобы именоваться похожими
Мб проверка на тире лишняя. Я повторных тестов не делал, поэтому решил оставить, время выполнения скрипта от неё не возрастёт.
Забыл уточнить… это всё работает для последних SVN. Не для 0.3.1
поэкспериментировал с различными локалями. И с ISO_8859-5, и с KOI8-R, и с CP1251… чёт ничего не изменяется от этого… Не считая языка в самой консоли. То русский, то английский, то кряки )
На всяк случай перезапустил nginx и apache (хз надо ли было)
Но к сожалению все эти действия моей ситуации не помогли — всё те же крякозябры. На самом деле у меня теперь ещё и в Putty некоторые результаты показываются неверной кодировкой, например перезапуск мемкеша выдал следующее:
Хм. Единственное, что я узнал из этой кучи текста — это «У FastVPS хороший саппорт»… и то это всё относительно, по данному сообщению понятно лишь то, что саппорт может выполнить примитивное администрирование. За дополнительные деньги саппорт везде хороший будет. Бесполезное сообщение… пока бесполезное. Надеюсь после тестирования появится более интересная инфа. Вот пример полезного обзора. Ждём-с нечто подобное.
Хм… str_word_count работает не так как хотелось бы… она не считает русские слова почему то… Когда я решил вывести в консоль FirePHP значение $sTitle и $sTags, то все русские слова отображались крякозябрами (но на сайте всё норм отображается)
Куда копать? Или мб кто знает аналог функции по подсчёту слов в строке?
Так… поразбирался немного… по сути вы просто берёте запрос «поиска» и применяете его для похожести. То бишь то же самое, что вставить набор тегов топика в поиск по сайту. Я правильно понимаю или нет?
А демо посмотреть как-нибудь можно? А то что-то судя по скрину ну оооч большие сомнения, что этот модуль удобнее и симпотичнее тимера.
Вообще планировал с тимера перейти на Redmin… Оч нефиговые возможности… но разбираться надо, не всё так интуитивно понятно, как в тимере
class LsSimilarTopics extends Module {
public function Init() {
}
public function GetSimilarTopics($oTopic){
$iNumTitle = 0;
foreach (array_unique(preg_split('/[\s,]+/',$oTopic->getTitle())) as $var)
{
if (mb_strlen($var,'UTF-8')>1 and $var!='—') $iNumTitle++;
}
$iNumTags = 0;
foreach (array_unique(preg_split('/[\s,]+/',$oTopic->getTags())) as $var)
{
if (mb_strlen($var,'UTF-8')>1 and $var!='—') $iNumTags++;
}
$iNumTags = count(array_unique(preg_split('/[\s,]+/',$oTopic->getTags())));
$iNumTags = ($iNumTags > Config::Get('module.similartopics.num_tags')-1 )? Config::Get('module.similartopics.num_tags'): $iNumTags;
$sTitleTags='@topic_tags "'.$oTopic->getTags().'"/'.$iNumTags.' @(topic_title,topic_text) "'.$oTopic->getTitle().'"/'.round($iNumTitle*Config::Get('module.similartopics.percent_title'));
$aTopics=array();
if($data=$this->Sphinx_FindSimilarTopics($sTitleTags,Config::Get('module.similartopics.count')+1,array('topic_publish' => 1))){
foreach($data['matches'] as $k=>$v){
$obj=$this->Topic_GetTopicById($k);
if($k!=$oTopic->getId() && isset($obj)) $aTopics[]=$obj;
}
}
return $aTopics;
}
}
в конфиг similartopics внести строчки
$config['num_tags'] = 2; // какое количество тегов должно совпадать с тегами других топиков, что бы другие топики были «похожим»
$config['percent_title'] = 0.6; // процент количества всех слов из заголовка, которые должны совпасть с заголовками и текстами других топиков, чтобы именоваться похожими
Мб проверка на тире лишняя. Я повторных тестов не делал, поэтому решил оставить, время выполнения скрипта от неё не возрастёт.
Забыл уточнить… это всё работает для последних SVN. Не для 0.3.1
Спасибо Максиму за помощь
Куда далее копать?
Как я
Выполнил команду: export LANG=«ru_RU.UTF-8»
Проверил командой: locale. Вывод:
На всяк случай перезапустил nginx и apache (хз надо ли было)
Но к сожалению все эти действия моей ситуации не помогли — всё те же крякозябры. На самом деле у меня теперь ещё и в Putty некоторые результаты показываются неверной кодировкой, например перезапуск мемкеша выдал следующее:
Кстати после перезапуска сервера кодировка почему-то заново сбрасывается в POSIX. У меня VPS. Перезагрузку выполнял командой shutdown -r now
ru_RU.utf8 в этом списке имеется
которая в конце конфига?
Куда копать? Или мб кто знает аналог функции по подсчёту слов в строке?
в SimilarTopics.class.php
в Sphinx.class.php
Слегка поясню что же я сделал:
1) Ищется теперь только в опубликованных
2) Усложнён запрос, теперь он формулируется так:
Теперь теги ищются среди тегов, а заголовок в заголовках и текстах, причём совпадения в тегах по двум словам, а в заголовке должны совпасть 60% слов.
P.S. Конечно в конфигурациях сфинкса (там где вы писали запросы к БД) нужно в запрос к топикам добавить поле topic_tags
Написал просто ппц как, но мне простительно, см. время коммента. Надеюсь кто нить разберётся в этом ночном бреде
Ну тогда хотелось бы добавить следущее: необходимо добавить поиск только по опубликованным топикам.
А как это сделать? Что-то не догоняю никак…
2) Копировать надо не в тупую а в умную. У Эвента EventCountry() первыми строками идёт:
Вот это скорее всего вас и выкидывает на 404
+
это:
$this->AddEvent('group','EventGroup');
исправить на это:
$this->AddEventPreg('/^group$/i','/^.+$/i','/^(page(\d+))?$/i','EventGroup');
Ну это всё как минимум для начала. Далее я думаю разберётесь и допилите всё до конца.
Заранее спасибо
Вообще планировал с тимера перейти на Redmin… Оч нефиговые возможности… но разбираться надо, не всё так интуитивно понятно, как в тимере