2012年9月25日星期二

探讨自动构建高相关度内链方法

探讨自动构建高相关度内链方法

  内链的重要性不用我多讲大家应该都知道了。内链(外链也一样)的好坏相关度是很重要的指标。本文以discuz程序为例,浅述怎样利用coreseek全文搜索系统建设高相关性的内链。

  一、现状

  现在自动生产内链一般有两种方法:一是通过插入有相同tag的内链;二是预先指定关键词,在文章内遇到相应关键词则自动插入内链的方法来做内链。

  不过这两种方法各有缺点,前一种方法如果是自动生成tag的话常常用生成大量没有的tag,相关度也没法保证,如果手动设置tag的话则是一项长期的非常繁琐工作;后一种方法要手动预设关键词,一来繁琐,二来没有预设的关键则不会自动生成内链,三来这种方法

  一般是中要遇到相应关键词则生成同一内链相关性不一定高。

  disuz自带的相关帖子功能也分为两种。一种是tag实现的,存在上面说的缺点;另一种为是纵横搜索带的,不过坑爹的是这种相关帖子是用javascript实现的,对于seo基本没用。

  二、怎样才能自动生成相关度高的内链呢?

  首先要解决的如何判断相关度高低的问题。我们可以用目标文章的标题去跟数据库中存在的文章标题或全文用类似Levenshtein之类算法作比较,找出相关性高的前一个或数个来做内链,而不是简单的捕捉某个特定的关键词或者tag。

  据我所了解coreseek全文搜索系统采用基于短语相似度和统计(BM25)的复合Ranking方法,可以轻松高效实现这样的功能,我们可以方便地拿来使用,有能力的也可以自己写程序来实现。

  三、下面以discuz为例说明如何实现。

  思路如下:每当贴子被访问时自动拿帖子的标题去coreseek里搜索,找出匹配度高的文章。然后把找到的文章链接添加到帖子中。

  1、首先要先正确安装coreseek,安装方法可以参考官网或我的网站四季服装网www#4ji#cn里找<<架设discuz下的coreseek全文搜索服务器及自建个性化分词词库>>这人贴子。安装看着很复杂,其实安装不难,跟着教程一步步做就行了。

  2、写一个discuz的插件实现上面所说的功能:

  不懂编程的先别飙汗,插件已经写好,下面会给出下载链接。

  这里只大概说一下插件的工作原理是:discuz的模版里面放了很多hook钩子,这里我们使用viewthread_postbottom,打开贴子后,viewthread_postbottom触发插件中的对应方法,该方法拿拿帖子的标题去coreseek里搜索,找出匹配度高的文章。

  然后把找到的文章链接添加到帖子中。

  四、主要源代码

  因能力有限,程序可能不够完善,欢迎指正。

<?php

/**
* A class of related article for Discuz! X2 & X2.5
* @author D2002
* Copyright @ http://www.4ji.cn
*/


class plugin_dean_related_article {
function plugin_dean_related_article() {
global $_G;
$this->display_qty = $_G['cache']['plugin']['dean_related_article']['display_qty'];
$this->weight = $_G['cache']['plugin']['dean_related_article']['weight'];
$this->index = $_G['cache']['plugin']['dean_related_article']['index'];
}


}


class plugin_dean_related_article_forum extends plugin_dean_related_article {
public function viewthread_postbottom_output() {
global $_G;
require_once libfile('class/sphinx');
$s = new SphinxClient();
$s->setServer($_G['setting']['sphinxhost'], intval($_G['setting']['sphinxport']));
$s->setMaxQueryTime(intval($_G['setting']['sphinxmaxquerytime']));
$s->SetRankingMode($_G['setting']['sphinxrank']);
$s->setLimits(0, $this->display_qty, $this->display_qty);
$s->setMatchMode(SPH_MATCH_ANY);

$subject = mb_convert_encoding($_G['forum_thread']['subject'],'UTF-8','GBK');
$ori_tid = $_G['forum_thread']['tid'];
if($this->index==1) $result = $s->query($subject, $_G['setting']['sphinxsubindex']);
else $result = $s->query($subject, "*");
$tids = array();
if($result) {
if(is_array($result['matches'])) {
foreach($result['matches'] as $value) {
if($value['attrs']['tid']&&$value['attrs']['tid']!=$ori_tid&&$value['weight']>=$this->weight) {
$tids[$value['attrs']['tid']] = $value['attrs']['tid'];
}
}
}
}

//return $tids;
$out="<div id='relate_subject'><div class='rs_main'><div class='rs_head'><h3 class='has_adv'>相关帖子</h3></div>";
$out.="<ul id='rel_list'>";
if(!empty($tids) ){
$ids = implode(",", $tids);
$query = DB::query("SELECT tid,subject FROM ".DB::table('forum_thread')." WHERE tid IN ($ids) AND displayorder>='0' ORDER BY tid DESC");
while ($thread = DB::fetch($query)) {

$threadlist[$thread['tid']]=$thread;
}
$flag=1;
foreach($threadlist as $th){
if($flag==1){
$out.="<li class='right_item'>";
$flag=0;
}else{
$out.="<li class='left_item'>";
$flag=1;
}
$out.="<a href='thread-$th[tid]-1.html'>$th[subject]</a></li>";
}
}else{
return array();
}

$out.="</ul></div></div>";
return array($out);

}

}
?>

  五、

  本文只是表达一个建造内链的思路,推广开去,这种方法轻松可以用于各种程序之中,甚至可以跨站使用。希望能帮到大家。

  六、

  因插件未经严格测试,而且需要安装coreseek为前提,所以没有在discuz应用官网发布。若有要需要可到我的网站四季服装网http://www#4ji#cn/thread-9326-1.html免费下载完整安装包

  本文由四季服装网原创,转载请保留版权


TAG:内链 相关度 站长 网站 网站推广 赚钱