探討自動構建高相關度內鏈方法

來源:互聯網
上載者:User

  內鏈的重要性不用我多講大家應該都知道了。內鏈(外鏈也一樣)的好壞相關度是很重要的指標。本文以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免費下載完整安裝包

  本文由四季服裝網原創,轉載請保留著作權



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。