在進(jìn)行實(shí)驗(yàn)之前,先了解相關(guān)反饋和盲反饋的一些概念:
紅橋ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書(shū)銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書(shū)合作)期待與您的合作!相關(guān)反饋是基于用戶的,由用戶標(biāo)出初次查詢結(jié)果相關(guān)還是不相關(guān),再經(jīng)過(guò)Rocchio算法或其他算法使檢索結(jié)果更能滿足用戶需求;
盲反饋也稱偽反饋,是由計(jì)算機(jī)自動(dòng)處理檢索結(jié)果,不需要用戶的參與也可以得到比較滿意的檢索效果。這種方法假定用戶初始檢索結(jié)果的前k篇文檔是相關(guān)的,再由系統(tǒng)抽選出這k篇文檔的特征詞,然后把這些特征詞和初始查詢?cè)~再放入搜索框中進(jìn)行二次檢索,這種行為我們稱之為“擴(kuò)展查詢?cè)~”。通過(guò)擴(kuò)展查詢?cè)~可以提高檢索系統(tǒng)的性能。
本項(xiàng)目就是基于盲反饋理論以及結(jié)合相應(yīng)算法編寫(xiě)一個(gè)檢索系統(tǒng),并通過(guò)一系列的評(píng)價(jià)指標(biāo)來(lái)測(cè)試此系統(tǒng)的性能。本系統(tǒng)是經(jīng)過(guò)小組成員結(jié)合相關(guān)理論后而確定實(shí)施的,本文從項(xiàng)目最初代碼的編寫(xiě),直到一個(gè)檢索系統(tǒng)的成功運(yùn)行,以及涉及到的信息檢索的理論,筆者都會(huì)一一講解。
編程環(huán)境的準(zhǔn)備:PHP+MySQL+Apache(項(xiàng)目初期沒(méi)有使用MySQL,隨著后期數(shù)據(jù)集的增大,可以考慮)
額外知識(shí):HTML+CSS+JS+Ajax(主要用于前臺(tái)的顯示)
語(yǔ)料庫(kù):本實(shí)驗(yàn)使用搜狗實(shí)驗(yàn)室提供的語(yǔ)料庫(kù)http://www.sogou.com/labs/dl/c.html
在測(cè)試時(shí)筆者使用的是mini版的10篇IT新聞(文件目錄名問(wèn)C000010)
在代碼編寫(xiě)過(guò)程中,筆者先使用過(guò)程化的方法,然后再把各個(gè)功能封裝到Tool.class.php的工具類中,便于以后代碼重用。
首先,建立自己的詞表。
筆者是這樣考慮的,假如有三篇文檔,文檔內(nèi)容為:
(html html)
(java html java)
(python java)
先對(duì)這三遍文檔去重,
(html)
(java html)
(python java)
然后合并這三篇文檔:
(html java html python java)
然后再對(duì)其去重,并且按字母升序排列:
(html java python)
這樣就可以得到我們自己的詞典了。
那為什么我們不直接把最初的三篇文檔先合并再去重,這樣不就可以省去對(duì)三篇文檔分別去重這一步了嗎?事實(shí)上我們也是這樣做的,上面是為了便于我們理解我們的文檔頻率df是怎么計(jì)算出來(lái)的,由紅色字體部分我們可以知道,有多少個(gè)重復(fù)的詞,這個(gè)詞的的文檔頻率就是多少。比如html的df為2,java的為2,python為1.
在中文分詞系統(tǒng)中,我們采用的是分詞工具SCWS,使用PHP調(diào)用他提供的方法get_tops可以得到分詞的情況,在內(nèi)部他已經(jīng)幫我們對(duì)每篇文檔去了重,并且計(jì)算出了每個(gè)詞的出現(xiàn)的次數(shù)times。
我們先來(lái)了解一下初始配置文件init.inc.php
此文件定義了兩個(gè)常量,TEXT_PATH是保存搜狗實(shí)驗(yàn)室的10篇IT新聞的硬路徑,ROOT_PATH是系統(tǒng)存儲(chǔ)位置的硬路徑;然后是require引入的兩個(gè)文件,func.inc.php用來(lái)存放使用到的函數(shù),以后會(huì)講到;Tool.class.php存放系統(tǒng)主要的功能,隨著功能的增多,可能會(huì)再創(chuàng)建一個(gè)類。以后需要用到的配置都存放到這個(gè)文件中。
在Tool.class.php文件中我們定義了一個(gè)靜態(tài)方法,用來(lái)獲得并存儲(chǔ)詞表:
class Tool{ //獲取并存儲(chǔ)詞表 static public function dic($seg){ $dic=array(); //詞表 for($i=0;$i這個(gè)方法需要傳遞一個(gè)參數(shù),這個(gè)參數(shù)是由Tool.class.php里定義的一個(gè)分詞方法segment得來(lái)的,稍后會(huì)講到。變量$seg是一個(gè)三維數(shù)組,$seg[i][j][]表示第i篇文檔的第j個(gè)詞。通過(guò)兩個(gè)for循環(huán),把該詞壓入數(shù)組$dic中(array_push方法可以壓入具有相同值的元素),然后array_unique對(duì)$dic去重,再按中文拼音字母升序排列,一個(gè)數(shù)組形式的詞表產(chǎn)生了。為了把該詞表存入文件名為dic的txt文件中,需要使用imploded方法把數(shù)組通過(guò)“,”連接成字符串,然后在使用文件方法fopen把詞表存入dic.txt.
上面提到的segment分詞方法代碼如下:
//scws分詞 static function segment($str){ if(!$scws=scws_new()) exit('創(chuàng)建SCWS對(duì)象失敗!'); //創(chuàng)建SCWS $scws->set_charset('gbk'); //設(shè)置字符集 if(!$scws->set_dict('C:\Program Files\scws\dict.xdb')) exit('詞典路徑設(shè)置失??!'); $scws->set_multi(1); $scws->set_ignore(true); //忽略標(biāo)點(diǎn) if(is_string($str)){ $scws->send_text($str); $top=$scws->get_tops(800); }else if(is_array($str)){ for($i=0;$i該方法需要傳第一個(gè)參數(shù)該參數(shù)可以說(shuō)字符串,也可以是包含內(nèi)容的數(shù)組。可以使用下面介紹的fileStr方法獲取10篇IT新聞的內(nèi)容并把它們存入數(shù)組中。segment方法內(nèi)部都是調(diào)用SCWS提供的分詞方法,如需詳細(xì)了解可以到SCWS官網(wǎng)查看文檔(該項(xiàng)目開(kāi)源)。筆者只介紹get_tops方法,該方法返回的是最終的分詞結(jié)果:
由于詞的數(shù)量太多,以后實(shí)驗(yàn)效果截圖只截取前面和最后的部分??梢钥吹絞et_tops的返回結(jié)果是一個(gè)三維數(shù)組[word]表示所截取的詞,[times]表示詞頻,[weight]表示權(quán)重(不是我們所了解的tf*idf),[attr]表示詞性。get_tops方法已經(jīng)為我們除去了大部分無(wú)意義的詞。與get_tops相對(duì)應(yīng)的是get_result,它返回的是所有分好的詞,包括停用詞、標(biāo)點(diǎn)符號(hào)等。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。