日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

实现很简单的搜索引擎

發(fā)布時(shí)間:2024/1/1 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实现很简单的搜索引擎 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡(jiǎn)單實(shí)現(xiàn)了各個(gè)模塊的功能,對(duì)整體有了了解,當(dāng)然不是實(shí)用的系統(tǒng)。問(wèn)題很多,抽時(shí)間繼續(xù)學(xué)習(xí)。

系統(tǒng)的整體設(shè)計(jì)

(1)網(wǎng)絡(luò)爬蟲(chóng)模塊:該模塊是從URL庫(kù)中獲得輸入,解析URL中表明的Web服務(wù)器地址,建立連接,發(fā)送請(qǐng)求和接受數(shù)據(jù),將獲得的網(wǎng)頁(yè)數(shù)據(jù)存儲(chǔ)在原始網(wǎng)頁(yè)庫(kù)中,并從其中提取出連接信息放入網(wǎng)頁(yè)結(jié)構(gòu)庫(kù)(堆棧或者隊(duì)列)中,同時(shí)將待抓取的URL放入U(xiǎn)RL庫(kù),保證整個(gè)過(guò)程遞歸進(jìn)行,直到URL庫(kù)為空。使用Key-Value數(shù)據(jù)庫(kù)或者文件等實(shí)現(xiàn)URL的去重工作保證不對(duì)相同的URL重復(fù)爬取。

該模塊的主要功能

下載網(wǎng)頁(yè)數(shù)據(jù),為搜索引擎系統(tǒng)提供數(shù)據(jù)來(lái)源,通過(guò)網(wǎng)頁(yè)中的連接信息不斷獲得網(wǎng)絡(luò)上的網(wǎng)頁(yè)。

種子URL集合的選取原則

(a) 基于主題的數(shù)據(jù)采集是采集互聯(lián)網(wǎng)上與某一固定主題相關(guān)的數(shù)據(jù),所以要選取特定的種子URL,根據(jù)這些種子URL采集其周?chē)臄?shù)據(jù)。

(b) 選擇一些重要的、權(quán)威的、出度較大的網(wǎng)站的URL作為種子URL。

基本流程:

? ? ? ? 本實(shí)驗(yàn)中,采取深度優(yōu)先的爬取策略,爬取的流程為:首先是初始化,設(shè)置網(wǎng)頁(yè)爬取的最大深度,將種子連接壓入堆棧,并設(shè)置這些連接的深度為1,從硬盤(pán)中讀取保存已經(jīng)訪問(wèn)過(guò)的網(wǎng)頁(yè)的文件,將這些已訪問(wèn)過(guò)的URL保存在HashSet集合中。

? ? ? ? 循環(huán)從棧頂取出URL,直到該URL未被訪問(wèn)過(guò),新建Page對(duì)象,設(shè)置對(duì)象的URL屬性。新建URL對(duì)象,調(diào)用該對(duì)象的openStream方法,從該流中按行依次讀取網(wǎng)頁(yè)的內(nèi)容。如果該網(wǎng)頁(yè)的深度小于閾值,則需要獲得該page頁(yè)面中的URL。調(diào)用getUrlByString方法,該方法中用正則表達(dá)式提取文本中的鏈接,正則表達(dá)式為String patternString ="<[a|A]\\s+href=([^>]*\\s*>)",如果提取出的URL沒(méi)有在visitedHashSet出現(xiàn)過(guò),則將URL添加到page對(duì)象中網(wǎng)頁(yè)列表中,并設(shè)置該URL的深度為父網(wǎng)頁(yè)的深度加一。

? ? ? ? 完整讀取網(wǎng)頁(yè)的中的內(nèi)容后,需要將該網(wǎng)頁(yè)以HTM的文件格式保存在硬盤(pán)中,供后續(xù)的預(yù)處理、分詞、建索引等步驟。該實(shí)驗(yàn)中,用網(wǎng)頁(yè)URL的MD5碼作為網(wǎng)頁(yè)的唯一標(biāo)識(shí)。函數(shù)getMD5就是通過(guò)傳入U(xiǎn)RL字符序列產(chǎn)生唯一的MD5碼。由于網(wǎng)頁(yè)的數(shù)目較多,因此以1000為單位將網(wǎng)頁(yè)保存不同的文件夾下。該實(shí)驗(yàn)中,網(wǎng)頁(yè)保存在/file/download/目錄下。

?????? 將分析完的URL添加到visitedHashSet中,表明已經(jīng)訪問(wèn)過(guò)。將網(wǎng)頁(yè)中的鏈接列表push到鏈接的堆棧中。依次從堆棧中取出元素,執(zhí)行以上過(guò)程,直到堆棧為空。

將已訪問(wèn)過(guò)的URL寫(xiě)到URLlist.txt文件中,程序結(jié)束。

該模塊的流程圖如下圖所示:





(2)正文提取模塊:網(wǎng)頁(yè)中包含各種標(biāo)簽,廣告等內(nèi)容,該模塊的功能就是通過(guò)基于行塊分布函數(shù)的正文提取方法,識(shí)別和清除網(wǎng)頁(yè)內(nèi)容噪音內(nèi)容,并提取網(wǎng)頁(yè)的主題,包括網(wǎng)頁(yè)的標(biāo)題、摘要、正文等內(nèi)容。

該模塊的主要功能

從給定的網(wǎng)頁(yè)中抽取出標(biāo)題、摘要、正文等信息,去除網(wǎng)頁(yè)中的噪音,包括網(wǎng)站的導(dǎo)航信息和相關(guān)鏈接廣告等內(nèi)容。

該模塊的實(shí)現(xiàn)方法

本實(shí)驗(yàn)采用基于行塊分布函數(shù)的網(wǎng)頁(yè)正文提取方法(開(kāi)源項(xiàng)目)。

基本思想:脫離HTML標(biāo)簽,通過(guò)建立行塊分布函數(shù),用線(xiàn)性時(shí)間找出HTML文件的正文。一個(gè)網(wǎng)頁(yè)的正文部分一般是網(wǎng)頁(yè)中文字信息分布最密集的區(qū)域之一,也有可能是較長(zhǎng)信息的評(píng)論或出現(xiàn)大篇幅的導(dǎo)航信息。這種情況下就要結(jié)合行塊的長(zhǎng)度信息解決該問(wèn)題。通過(guò)分析網(wǎng)頁(yè)中行塊長(zhǎng)度的聚升點(diǎn)和聚降點(diǎn)尋找正文。

該算法的基本流程

首先設(shè)置行塊的厚度為3,正文區(qū)的密度閾值為150,增大該閾值可以去除網(wǎng)頁(yè)正文中成塊的新聞標(biāo)題,提高準(zhǔn)確率,但有可能將部分正文信息去除,降低了召回率。減小該閾值可以保證找到只有一句話(huà)的正文,但是降低了召回率。

獲取該HTML文件中的文本,根據(jù)<title>標(biāo)簽,用正則表達(dá)式提取出網(wǎng)頁(yè)中的標(biāo)題。將網(wǎng)頁(yè)中的HTML規(guī)范、注釋信息、javascript腳本、樣式信息、特殊字符等內(nèi)容用空白符代替,這樣就得到只有文字內(nèi)容的文本,將文本分行保存在list集合中,提供給后序步驟處理。以3行為一塊求出每塊的長(zhǎng)度,即每個(gè)塊的文本去掉空白符剩下的字符長(zhǎng)度。

設(shè)置正文的起始位置start、終止位置end、起始標(biāo)志boolstart和終止位置boolend。從第0個(gè)塊開(kāi)始依次遍歷每個(gè)塊,當(dāng)?shù)趇個(gè)塊的長(zhǎng)度大于閾值并且起始標(biāo)志boolstart為false,第i+1、i+2和第i+3行中某行長(zhǎng)度不為0,則說(shuō)明找到一個(gè)聚升點(diǎn)。設(shè)置起始標(biāo)志boolstart為false,起始位置start為i。接著繼續(xù)往下遍歷,當(dāng)?shù)趇行或第i+1行某行長(zhǎng)度為0,說(shuō)明找到一個(gè)聚降點(diǎn),設(shè)置終止位置end為i,終止標(biāo)志boolend為true。這時(shí)就找到一個(gè)正文段,提取出行號(hào)為start到end的文本作為網(wǎng)頁(yè)的正文。繼續(xù)遍歷往下的塊信息,只要找到一個(gè)聚升點(diǎn)和一個(gè)聚降點(diǎn),則找到一段正文。

當(dāng)遍歷完所有的塊信息后,設(shè)置網(wǎng)頁(yè)的正文、摘要(目前摘要的提取是將文本的前30個(gè)字符作為摘要。也可將文檔中包含權(quán)重最大的詞的一段文本作為文檔的摘要)。

算法結(jié)束。

算法的基本流程如下圖所示:





(3)網(wǎng)頁(yè)去重模塊:在大量網(wǎng)頁(yè)中,存在內(nèi)容完全相同的網(wǎng)頁(yè),也有一些網(wǎng)頁(yè)內(nèi)容基本相同,只是有細(xì)節(jié)上細(xì)微的不同,例如轉(zhuǎn)載網(wǎng)頁(yè)等。系統(tǒng)需要將這種網(wǎng)頁(yè)進(jìn)行去重處理。該系統(tǒng)采用基于指紋識(shí)別的思想對(duì)網(wǎng)頁(yè)進(jìn)行重復(fù)性判斷。

該模塊的主要功能

網(wǎng)絡(luò)上可能會(huì)出現(xiàn)多個(gè)域名對(duì)應(yīng)同一個(gè)網(wǎng)站的情況或者網(wǎng)站的互相轉(zhuǎn)載。去除重復(fù)的網(wǎng)頁(yè)是為了避免同一個(gè)網(wǎng)站的內(nèi)容被多次采集和索引。? 網(wǎng)頁(yè)消重就是指去除網(wǎng)頁(yè)集合中轉(zhuǎn)載網(wǎng)頁(yè)(即文本內(nèi)容基本相同)的過(guò)程。

該模塊的基本思想

為每個(gè)文檔計(jì)算出一組指紋(fingerpint),這些指紋可以是網(wǎng)頁(yè)內(nèi)容中的一系列字符串的hash值或者M(jìn)D5散列值,若兩個(gè)文檔擁有一定數(shù)量的相同指紋,則認(rèn)為兩個(gè)文檔的內(nèi)容重疊性較高,即二者是內(nèi)容轉(zhuǎn)載的。

算法的基本流程

分析網(wǎng)頁(yè)文檔時(shí),提取并記錄網(wǎng)頁(yè)中出現(xiàn)的關(guān)鍵詞,同時(shí)根據(jù)公式賦予每個(gè)關(guān)鍵詞一個(gè)權(quán)值,這些關(guān)鍵詞的權(quán)值構(gòu)成一個(gè)向量空間,可以用來(lái)表示網(wǎng)頁(yè)。

將網(wǎng)頁(yè)中權(quán)重最大的前N個(gè)關(guān)鍵詞按字母進(jìn)行排序后再拼接成一個(gè)字符串,記為Concatenate(sort(T)),用MD5對(duì)這個(gè)字符串產(chǎn)生散列值MD5(Concatenate(sort(T)))。

若兩個(gè)網(wǎng)頁(yè)的散列值相同,則認(rèn)為二者是相互轉(zhuǎn)載的。在實(shí)際程序運(yùn)行期間,每當(dāng)需要分析一個(gè)新的文檔時(shí),提取文檔的前N個(gè)關(guān)鍵詞,并按上述方法產(chǎn)生MD5散列值,將該散列值與之前分析完的所有文檔進(jìn)行比較,當(dāng)這個(gè)新的文檔的MD5散列值已經(jīng)出現(xiàn)過(guò)時(shí),說(shuō)明這個(gè)文檔時(shí)重復(fù)文檔,刪掉即可。

(4)中文分詞模塊:中文與英文不同,英文詞與詞之間有天然的分隔符,中文詞匯大多是連續(xù)的,因此需要進(jìn)行自動(dòng)分詞工作。該模塊采用正向最大匹配的算法進(jìn)行分詞,用Trie樹(shù)保存詞典。

該模塊的主要功能

目前的中文檢索系統(tǒng)中大多支持基于詞的檢索,因此需要對(duì)文本進(jìn)行自動(dòng)的詞語(yǔ)切分,該過(guò)程也就是中文分詞。

該模塊的實(shí)現(xiàn)

目前網(wǎng)絡(luò)上有很多的開(kāi)源分詞工具IKAnalyzer、ICTCLAS、Paoding等等,本實(shí)驗(yàn)中采用自己設(shè)計(jì)的分詞方法進(jìn)行分詞。

本實(shí)驗(yàn)采用正向最大匹配的算法進(jìn)行分詞。

算法的基本思想

正向最大匹配算法的基本思想:從左到右將待分詞的文本中的幾個(gè)連續(xù)字符與詞表匹配,如果匹配上則找到一個(gè)詞。當(dāng)下一個(gè)掃描不是詞表中的詞或某個(gè)詞的前綴,則結(jié)束。繼續(xù)分析后面的文本。

用Trie樹(shù)保存詞典。Trie樹(shù)也稱(chēng)為前綴樹(shù),用Trie樹(shù)保存詞典能將文本的所有可能分詞找出,無(wú)論該詞有多長(zhǎng)。Trie樹(shù)還適用于查找單詞前綴,如查找所有以“中華民”開(kāi)頭的單詞,包括“中華民國(guó)”、“中華民族”等。

Trie樹(shù)的結(jié)構(gòu)如下圖3-3:




Trie樹(shù)的最壞的情況下搜索的時(shí)間代價(jià)是O(h),h為T(mén)rie樹(shù)的層數(shù)。

(1)每個(gè)結(jié)點(diǎn)都是詞語(yǔ)的一個(gè)漢字。

(2)結(jié)點(diǎn)中的指針指向了該漢字在某一個(gè)詞中的下一個(gè)漢字。這些指針存放在以漢字為key的hash結(jié)構(gòu)中。

(3)結(jié)點(diǎn)中的“#”表示當(dāng)前結(jié)點(diǎn)中的漢字是從根節(jié)點(diǎn)到該漢字結(jié)點(diǎn)所組成的詞的最后一個(gè)字。

正向最大匹配的具體實(shí)現(xiàn)過(guò)程為:

首先:讀取保存文本內(nèi)容的文件。

設(shè)置起始位置startPosition,startPosition用于保存分詞的開(kāi)始位置,依次遍歷文本中的每一個(gè)字符,先初始化Tocken為空,令position為startPosition的位置,當(dāng)Trie樹(shù)包含position位置的字符letter時(shí),根據(jù)指針獲得該字符letter對(duì)應(yīng)的節(jié)點(diǎn)node,判斷該node的結(jié)尾標(biāo)識(shí)是否為true,為true說(shuō)明找到一個(gè)分詞,found設(shè)置為true,繼續(xù)遍歷下一個(gè)position對(duì)應(yīng)的字符,當(dāng)遍歷到的字符不是某個(gè)詞的前綴時(shí),停止遍歷。

判斷found是否為true,若為true,則將這次遍歷找到的最長(zhǎng)的詞保存下來(lái),并將startPosition后移該詞的長(zhǎng)度個(gè)位置,若found為false,則說(shuō)明沒(méi)有找到一個(gè)分詞,將startPosition后移一個(gè)位置。當(dāng)startPosition超出文本的長(zhǎng)度時(shí),算法結(jié)束。

分完詞的文件保存在file/wordFiles/目錄下。

該過(guò)程的流程圖如下圖所示。





(5)倒排索引模塊:該模塊是網(wǎng)頁(yè)預(yù)處理的核心部分,采用基于增量的倒排索引結(jié)構(gòu)保存倒排文件,便于倒排文件的更新等操作。

倒排索引概念

倒排索引的索引的對(duì)象是文檔或文檔集合中的單詞,存儲(chǔ)這些單詞在一個(gè)文檔或者一組文檔中的存儲(chǔ)位置,是對(duì)文檔或文檔集合的一種最常用的索引機(jī)制。

倒排文件的組成部分

倒排文件一般包括兩個(gè)部分:詞匯表(vocabulary)和記錄表(posting list)。詞匯表是文檔或者文檔集合中所有不同單詞的集合。對(duì)于詞匯表中的每一單詞,其在文檔中出現(xiàn)的文檔編號(hào)列表的集合構(gòu)成記錄表。

本實(shí)驗(yàn)采用的索引文件結(jié)構(gòu)

? ? ? ? 傳統(tǒng)的靜態(tài)信息檢索系統(tǒng)由于文檔集合相對(duì)穩(wěn)定,索引一旦建立很少進(jìn)行更新,需要更新時(shí)要重新建立整個(gè)檢索文件。由于搜索引擎的索引結(jié)構(gòu)需要支持高效的更新功能。因此,本實(shí)驗(yàn)中,采用一種增量索引結(jié)構(gòu)。在建立倒排索引時(shí),每個(gè)詞項(xiàng)的記錄表以連接塊的形式存放于倒排索引文件中。

? ? ? ? 本次實(shí)驗(yàn)的索引結(jié)構(gòu)如下圖3-6所示:



該索引結(jié)構(gòu)分為三個(gè)文件:

詞項(xiàng)文件:該文件保存三個(gè)值的集合,第一個(gè)保存文檔集合中出現(xiàn)的所有詞項(xiàng),用Term表示,第二個(gè)值為該詞項(xiàng)對(duì)應(yīng)的IDF值,即詞項(xiàng)的反文檔頻率。該值的計(jì)算過(guò)程將在后面進(jìn)行論述。第三個(gè)值是該詞項(xiàng)對(duì)應(yīng)的記錄表在記錄表文件中的位置(類(lèi)型為long的一個(gè)偏移量)。

記錄表文件:記錄表中存放posting list集合,每個(gè)posting list按塊存儲(chǔ),存儲(chǔ)的格式如圖中所示:首先是詞項(xiàng)對(duì)應(yīng)的文檔集合的個(gè)數(shù),接下來(lái)是每個(gè)文檔的記錄,包括文檔的編號(hào)、文檔中該詞項(xiàng)出現(xiàn)的次數(shù)、最后一個(gè)是指向位置文件的指針,該指針保存指向位置文件的偏移量。

塊的最后是一個(gè)指向下一塊的指針,該指針保存指向記錄表中該詞項(xiàng)對(duì)應(yīng)的另一個(gè)posting list塊的位置。

位置文件:該文件保存位置信息,同樣是按塊進(jìn)行存儲(chǔ)。每個(gè)塊中首先是位置的個(gè)數(shù),然后是具體的位置列表。

每當(dāng)新的一批文檔集合需要插入該索引結(jié)構(gòu)時(shí),首先將這批文檔集合在內(nèi)存中建立索引結(jié)構(gòu),然后更新該索引結(jié)構(gòu)。

該模塊的實(shí)現(xiàn)

該模塊主要有一下幾個(gè)類(lèi):

MFile類(lèi):用于保存文檔信息,包括文檔的編號(hào)、文檔對(duì)應(yīng)的URL、文檔的標(biāo)題、文檔的摘要、文檔的大小以及用于相關(guān)性排序的文檔權(quán)重等屬性。

Word類(lèi):用于保存新來(lái)的一批文檔中的詞項(xiàng)信息,包括該詞的文本內(nèi)容、詞的權(quán)重(即IDF值)、出現(xiàn)該詞的文檔列表等信息。

Vocabulary類(lèi):用于保存新來(lái)的一批文檔中所有的詞匯表,包括所有詞匯,用HashMap保存。

DWord類(lèi):用于保存從硬盤(pán)中讀取的詞匯信息,包括該詞的文本內(nèi)容、出現(xiàn)過(guò)該詞的文檔數(shù)目、該詞的權(quán)重(即IDF值)、該詞在索引文件中的偏移量等信息。

DVocabulary類(lèi):該類(lèi)用于保存從硬盤(pán)中讀取的詞匯表信息,包括所有詞匯,用HashMap保存。

Index類(lèi):該類(lèi)用于建立索引結(jié)構(gòu)。

該模塊的類(lèi)圖如下圖3-7所示:



建立索引結(jié)構(gòu)的過(guò)程:

首先,將整個(gè)詞項(xiàng)文件讀入內(nèi)存(由于該文件并不大,因此可以直接放在內(nèi)存里,供后續(xù)步驟使用),每個(gè)詞項(xiàng)包括該詞的文本信息、權(quán)重和該詞對(duì)應(yīng)的記錄表中對(duì)應(yīng)的偏移量,用DWord對(duì)象保存該詞項(xiàng),并將該DWord對(duì)象保存到新建的DVocabulary對(duì)象中,讀完后DVocabulary對(duì)象保存的就是所有的詞項(xiàng)信息。

分別讀取記錄表文件和位置文件的文件尾位置。

遍歷所有分好詞的文件,新建MFile對(duì)象,并設(shè)置該對(duì)象的標(biāo)題、文件編號(hào)等信息。遍歷該文件中所有的分詞,調(diào)用vocabulary對(duì)象的add方法,若該詞不存在,則新建Word對(duì)象(該詞文本、MFile對(duì)象和位置號(hào)為構(gòu)造函數(shù)的參數(shù));若該詞已經(jīng)存在,則將該文件對(duì)象和位置號(hào)保存到已有的word對(duì)象中。當(dāng)遍歷完所有分好詞的文件后,vocabulary對(duì)象中即保存了新來(lái)的這批文檔中的詞項(xiàng)信息。

接著遍歷vocabulary對(duì)象中所有的Word對(duì)象,根據(jù)該Word對(duì)象查找dVoabulary對(duì)象中是否出現(xiàn)過(guò)該詞。

如果沒(méi)有出現(xiàn)過(guò)該詞,則新建DWord對(duì)象,設(shè)置該對(duì)象的文本、對(duì)應(yīng)的文檔數(shù)(即該批文檔的數(shù)目)、對(duì)應(yīng)的記錄表的偏移量(即當(dāng)前記錄表的文件尾位置)。將DWord對(duì)象添加到dVoabulary對(duì)象中。定位到記錄表的文件尾位置,首先寫(xiě)入該詞對(duì)應(yīng)的文檔數(shù),然后依次將文件號(hào)、指向位置文件的指針寫(xiě)入記錄文件。將nextPointer位置寫(xiě)入0,表明該塊與另外一塊相連。

如果該詞在詞項(xiàng)文件中出現(xiàn)過(guò),則首先更新對(duì)應(yīng)的DWord對(duì)象的文件數(shù),即在原來(lái)的值上加上新來(lái)的這批文檔中所包含該詞的文件數(shù)。然后根據(jù)DWord對(duì)象的offset屬性找到該詞在記錄表中第一個(gè)記錄塊,循環(huán)遍歷這些相連的記錄塊,直到找到最后一個(gè)記錄塊的nextPointer指針,此時(shí)該指針的值為0,將該nextPointer指針設(shè)置為記錄表文件尾位置。然后定位到記錄表的文件尾位置,同樣首先將該詞對(duì)應(yīng)的文件數(shù)寫(xiě)到該文件中,然后依次將文件號(hào)和該詞在文件中位置的個(gè)數(shù)寫(xiě)入記錄文件,并且將位置列表寫(xiě)入位置文件。

當(dāng)處理完這批文檔后,需要更新詞項(xiàng)文件中的內(nèi)容。遍歷dVoabulary對(duì)象中的所有DWord對(duì)象,重新計(jì)算該詞項(xiàng)的IDF值。該IDF值為詞項(xiàng)的反文檔頻率,計(jì)算公式為log2(N/DF),N為所有的文檔總數(shù),DF為包含該詞項(xiàng)的文檔數(shù)量。如果包含該詞項(xiàng)的文檔越多,則說(shuō)明該詞在區(qū)分文檔內(nèi)容的能力上卻低,蓋茨向的IDF也就越小。計(jì)算完權(quán)重后,將所有的詞項(xiàng)信息重新寫(xiě)回到詞項(xiàng)信息文件中。

建立索引的過(guò)程即結(jié)束。

該過(guò)程的流程圖如下圖3-8所示。




(6)相關(guān)性排序模塊:該模塊采用空間向量模型對(duì)檢索出來(lái)文檔進(jìn)行相關(guān)性排序,并將結(jié)果反饋給用戶(hù)。

相關(guān)性排序概念

用戶(hù)在進(jìn)行信息檢索時(shí),希望獲得與其需求密切相關(guān)的檢索結(jié)果,因此信息檢索系統(tǒng)的核心問(wèn)題是:當(dāng)用給定查詢(xún)后,對(duì)文檔集中的每一個(gè)與用戶(hù)查詢(xún)相關(guān)程度進(jìn)行判斷。也就是對(duì)所有相關(guān)文檔按照相關(guān)度由大到小的排序過(guò)程。

本實(shí)驗(yàn)使用的相關(guān)性模型

三種經(jīng)典的模型:布爾模型、空間向量模型和概率模型等。本實(shí)驗(yàn)采用的是空間向量模型(好吧,真正的搜索引擎應(yīng)該pagelink之類(lèi)的算法,這里用最簡(jiǎn)單的,作為示例)。在空間向量模型中,文檔和查詢(xún)均被看成由索引項(xiàng)構(gòu)成的向量。

計(jì)算網(wǎng)頁(yè)與查詢(xún)的相關(guān)性。即計(jì)算查詢(xún)?cè)~與文本索引項(xiàng)構(gòu)成的兩個(gè)向量的夾角。計(jì)算公式如下圖3-9所示。




其中dik是文檔di中詞項(xiàng)k的權(quán)重,qk是查詢(xún)時(shí)Q中詞項(xiàng)k的權(quán)重。

計(jì)算相關(guān)度的流程為:

首先創(chuàng)建Dvocabulary對(duì)象,讀取保存所有詞項(xiàng)信息的文件index.tl,將每個(gè)詞項(xiàng)信息保存到DWord對(duì)象中,包括詞項(xiàng)的文本、權(quán)重和該詞項(xiàng)對(duì)應(yīng)的記錄表中的偏移量。將該DWord對(duì)象保存到Dvocabulary對(duì)象中,Dvocabulary對(duì)象中即保存了所有的詞項(xiàng)信息。

讀取保存所有文件信息的文件docinfo.txt,以便于根據(jù)用戶(hù)輸入選擇網(wǎng)頁(yè)的ID快速找到相應(yīng)網(wǎng)頁(yè)的URL,標(biāo)題和摘要等。然后等待用戶(hù)輸入。

當(dāng)用戶(hù)輸入完成后,獲取用戶(hù)查詢(xún)的文本。

對(duì)用戶(hù)查詢(xún)的文本進(jìn)行分詞,得到查詢(xún)?cè)~的列表。

遍歷所有的用戶(hù)查詢(xún)?cè)~,根據(jù)該詞從DVocabulary中得到對(duì)應(yīng)的Dword對(duì)象。根據(jù)DWord對(duì)象中的offset值讀取記錄表文件,若有多塊記錄表,則根據(jù)nextPointer依次讀取每個(gè)塊,從而從記錄表中得到該詞相關(guān)的文件集合。

將各個(gè)詞對(duì)應(yīng)的文件集合進(jìn)行集合的交操作,得到的文件包含所有的查詢(xún)?cè)~。

對(duì)每個(gè)相關(guān)文檔用空間向量模型計(jì)算該文檔與查詢(xún)的相關(guān)度。

根據(jù)文檔號(hào)從文檔信息中得到公式中dik*dik的值。

計(jì)算dik*qk和qk*qk的值,從而求出兩個(gè)向量的夾角的值。

當(dāng)求出所有相關(guān)文檔的相關(guān)度后,按照相關(guān)度的值對(duì)這些文檔進(jìn)行排序,并將排序結(jié)果展示給用戶(hù)。可以通過(guò)強(qiáng)制設(shè)定某個(gè)閾值,控制被檢索出來(lái)的文檔的數(shù)量。檢索結(jié)果可以被用于相關(guān)反饋中,以便對(duì)原始的查詢(xún)式進(jìn)行修正。

搜索結(jié)果如下圖所示。

參考:

劉挺,秦兵,張宇,車(chē)萬(wàn)翔. ?信息檢索系統(tǒng)導(dǎo)論.?

邱哲,符滔滔,王學(xué)松. ? 開(kāi)發(fā)自己的搜索引擎.?

李曉明,閆宏飛,王繼民. ? 搜索引擎-原理、技術(shù)與系統(tǒng).?

王冬,左萬(wàn)利. ? 一種增量倒排索引結(jié)構(gòu)的設(shè)計(jì)與實(shí)現(xiàn).?


總結(jié)

以上是生活随笔為你收集整理的实现很简单的搜索引擎的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。