基于python的搜索引擎论文_技术分享 - 基于python构建搜索引擎系列——(四)检索模型...
構建好倒排索引之后,就可以開始檢索了。
檢索模型有很多,比如向量空間模型、概率模型、語言模型等。其中最有名的、檢索效果最好的是基于概率的BM25模型。
給定一個查詢Q和一篇文檔d,d對Q的BM25得分公式為:
公式中變量含義如下:
qtf:查詢中的詞頻
tf:文檔中的詞頻
ld:文檔長度
avg_l:平均文檔長度
N:文檔數量
df:文檔頻率
b,k1,k3:可調參數
這個公式看起來很復雜,我們把它分解一下,其實很容易理解。第一個公式是外部公式,一個查詢Q可能包含多個詞項,比如“蘋果手機”就包含“蘋果”和“手機”兩個詞項,我們需要分別計算“蘋果”和“手機”對某個文檔d的貢獻分數w(t,d),然后將他們加起來就是整個文檔d相對于查詢Q的得分。
第二個公式就是計算某個詞項t在文檔d中的得分,它包括三個部分。第一個部分是詞項t在查詢Q中的得分,比如查詢“中國人說中國話”中“中國”出現了兩次,此時qtf=2,說明這個查詢希望找到的文檔和“中國”更相關,“中國”的權重應該更大,但是通常情況下,查詢Q都很短,而且不太可能包含相同的詞項,所以這個因子是一個常數,我們在實現的時候可以忽略。
第二部分類似于TFIDF模型中的TF項。也就是說某個詞項t在文檔d中出現次數越多,則t越重要,但是文檔長度越長,tf也傾向于變大,所以使用文檔長度除以平均長度ld/avg_l起到某種歸一化的效果,k1和b是可調參數。
第三部分類似于TFIDF模型中的IDF項。也就是說雖然“的”、“地”、“得”等停用詞在某文檔d中出現的次數很多,但是他們在很多文檔中都出現過,所以這些詞對d的貢獻分并不高,接近于0;反而那些很稀有的詞如”糖尿病“能夠很好的區分不同文檔,這些詞對文檔的貢獻分應該較高。
所以根據BM25公式,我們可以很快計算出不同文檔t對查詢Q的得分情況,然后按得分高低排序給出結果。
下面是給定一個查詢句子sentence,根據BM25公式給出文檔排名的函數:
defresult_by_BM25(self,sentence):
seg_list=jieba.lcut(sentence,cut_all=False)
n,cleaned_dict=self.clean_list(seg_list)
BM25_scores={}
fortermincleaned_dict.keys():
r=self.fetch_from_db(term)
ifrisNone:
continue
df=r[1]
w=math.log2((self.N-df+0.5)/(df+0.5))
docs=r[2].split('\n')
fordocindocs:
docid,date_time,tf,ld=doc.split('\t')
docid=int(docid)
tf=int(tf)
ld=int(ld)
s=(self.K1*tf*w)/(tf+self.K1*(1-self.B+self.B*ld/self.AVG_L))
ifdocidinBM25_scores:
BM25_scores[docid]=BM25_scores[docid]+s
else:
BM25_scores[docid]=s
BM25_scores=sorted(BM25_scores.items(),key=operator.itemgetter(1))
BM25_scores.reverse()
iflen(BM25_scores)==0:
return0,[]
else:
return1,BM25_scores
首先將句子分詞得到所有查詢詞項,然后從數據庫中取出詞項對應的倒排記錄表,對記錄表中的所有文檔,計算其BM25得分,最后按得分高低排序作為查詢結果。
類似的,我們還可以對所有文檔按時間先后順序排序,越新鮮的新聞排名越高;還可以按新聞的熱度排序,越熱門的新聞排名越高。
關于熱度公式,我們認為一方面要兼顧相關度,另一方面也要考慮時間因素,所以是BM25打分和時間打分的一個綜合。
比較有名的熱度公式有兩個,一個是Hacker News的,另一個是Reddit的,他們的公式分別為:
可以看出,他們都是將新聞/評論的一個原始得分和時間組合起來,只是一個用除法,一個用加法。所以我們也依葫蘆畫瓢,”自創“了一個簡單的熱度公式:
用BM25得分加上新聞時間和當前時間的差值的倒數,k1k1和k2k2也是可調參數。
按時間排序和按熱度排序的函數和按BM25打分排序的函數類似,這里就不貼出來了,詳細情況可以看我的項目News_IR_Demo。
至此,搜索引擎的搜索功能已經實現了,你可以試著修改./web/search_engine.py的第167行的關鍵詞,看看搜索結果是否和你預想的排序是一樣的。不過由于我們的數據量只有1000個新聞,并不能涵蓋所有關鍵詞,更多的測試可以留給大家線下完成。
總結
以上是生活随笔為你收集整理的基于python的搜索引擎论文_技术分享 - 基于python构建搜索引擎系列——(四)检索模型...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python pcm 分贝_语音文件 p
- 下一篇: websocket python爬虫_p