這是基於 python 的文件搜尋引擎的基本實現,用於回答本機系統上文字檔案中的查詢。我們使用「tf-idf術語權重」和「餘弦相似度」對匹配文件的相關性進行排名。 tf-idf 計算是預先計算的,使得搜尋速度更快。為了加快搜尋速度,也使用了詞幹分析(Porter Stemmer)。提供了使用 Python 的 Tkinter 函式庫的基本使用者介面。
python2 createIndex_tfidf.py stopwords.dat testIndex.dat titleIndex.dat
createIndex_tfidf.py 將只執行一次來計算語料庫上的 tdf-idf 值
python2 queryIndex_tfidf.py stopwords.dat testIndex.dat titleIndex.dat
此步驟總共建立了三個不同的檔案:
標題索引.dat
該文件儲存分配給語料庫中每個文件的唯一 docId(文檔 ID)。
測試索引.dat
在此建立索引檔案(也稱為倒排索引資料結構),其中包含所有文件中出現的所有唯一術語(停用詞除外)的資訊。在titleIndex 中。有關術語的資訊儲存在索引文件中,如下所示: term|docID0:pos1,pos2;docID1:pos3,pos4,pos5;…..|tf0,tf1,tf2...|idf 這裡 tf0,tf1,tf2分別表示docID0,docID1,docID2 中術語的詞頻。 idf 代表逆文檔頻率,pos1 代表該術語在對應文檔中的位置,依此類推。
線.dat
該文件儲存有關該術語在各種文件中出現的行的資訊。該行資訊表示為: term|docID0:line1,line2;docID1:line3,line4,line5
在建立這些文件之前,會在停用詞清單中檢查文件的所有術語。此外,每個術語在添加到索引之前都會由 Porter Stemmer 進行詞幹提取。
在此,首先,檔案lines.dat、titleIndex.dat 和testIndex.dat 中的所有資訊再次使用Python 中的字典儲存回來。
現在,支援的不同類型的查詢是:
單字查詢 (OWQ) 這是一個單一術語查詢,其輸出是包含所詢問術語的文檔清單以及該術語在對應文件中出現的行號。
多詞查詢 (MWQ) MWQ 中的輸入是單字序列,輸出是包含任何查詢術語以及行號的文件清單。
片語查詢(PQ) PQ 中的輸入同樣是單字序列,符合文件是依指定順序包含所有查詢術語的文檔。
現在我們已經找到了存在查詢的文檔列表,現在是時候對它們進行排名了。我們這裡使用的排名方案是基於 tf-idf。 Tf-Idf 是一種加權方案,它根據文件中的每個術語的術語頻率 (tf) 和逆文檔頻率 (idf) 為其分配權重。權重分數較高的術語被認為更重要。它是資訊檢索中最受歡迎的加權方案之一。
術語的術語頻率(tf)是特定於文檔的。它基本上是文件 D 中術語 t 出現的次數。我們可以用一個大小等於文檔編號的向量來表示文檔。文件中唯一術語的數量,每個值表示給定文件中術語的計數。將文件表示為公共向量空間中的向量稱為向量空間模型,它是資訊檢索的基礎。但這裡有一個缺點。隨著文件大小的增加,tf 的權重也會隨著術語頻率的增加而增加。因此,包含與其他文件相同資訊且複製多次的文件將被認為更重要。為了消除這個缺點,我們將向量中的每個值除以其範數,使向量成為單位向量。
我們不能只使用術語頻率來計算文件中某個術語的權重,因為 tf 認為所有術語同等重要。然而,有些術語出現的頻率較低,而且比其他術語更具歧視性。如果我們純粹使用 tf 作為排名的衡量標準,那麼如果我們搜尋像聲波這樣的主題,我們最終可能會得到很多包含光波和其他波的文檔,因為術語的頻率是唯一的參數。
為了減輕這種影響,我們使用逆文檔頻率。術語的文檔頻率基本上是包含該術語的文檔的數量。因此,術語的逆文檔頻率(idf)是語料庫中的文檔數量除以術語的文檔頻率。一般來說,我們發現idf的因子相當大,如果我們使用log(idf)會得到更好的結果。由於 log 是一個遞增函數,我們可以使用它而不會影響我們的結果。
我們已經定義了 tf 和 idf,現在我們可以將它們組合起來產生文檔 d 中術語 t 的最終分數。我們將再次將文件表示為向量,每個條目都是文檔中相應術語的 tf-idf 權重。文件 d 中術語 t 的 tf-idf 權重只是其 tf 與其 idf 的乘積。
現在我們已經根據 tf-idf 權重建立了每個文件的向量。是時候使用給定的文件向量來回答查詢了。首先,我們將在與建立文件向量類似的基礎上建立一個查詢向量本身,即基於 tf-idf 分數(考慮查詢文件本身)。現在我們已經準備好了查詢向量,我們將找到包含我們的查詢的所有文件。現在我們將計算查詢向量和查詢所在的文件向量的點積。點積越高,查詢向量與文件向量越相似,這表示文件向量和查詢向量之間的角度較小。這種查找查詢和文件之間相似性的技術稱為餘弦相似性。