使用布林模型和向量空間模型進行文件檢索


簡介

機器學習中的文件檢索是資訊檢索這一更大範疇的一部分,在資訊檢索中,系統會嘗試根據使用者的查詢找到與搜尋查詢相關的文件,並根據相關性或匹配程度對它們進行排序。

文件檢索有多種方法,其中兩種流行的方法是:

  • 布林模型

  • 向量空間模型

讓我們簡要了解一下以上每種方法。

布林模型

這是一種基於集合的檢索模型。使用者查詢以布林形式表示。查詢使用 AND、OR、NOT 等連線。文件可以被視為一個關鍵字集合。根據查詢,基於相關性檢索文件。不支援部分匹配和排序。

示例(布林查詢):

[[美國 & 法國] | [宏都拉斯 & 倫敦]] & 餐廳 &! 曼哈頓]

布林模型的步驟和流程圖

布林模型是一種倒排索引搜尋,用於查詢文件是否相關。它不返回文件的排名。

假設我們的語料庫中有 3 個文件。

文件ID

文件文字

1.

泰姬陵是一座美麗的紀念碑

2.

維多利亞紀念館也是一座紀念碑

3.

我喜歡去阿格拉

術語矩陣將如下建立。

術語

doc_1

doc_2

doc_3

taj

1

0

0

mahal

1

0

0

is

1

1

0

a

1

1

0

beautiful

1

0

0

monument

1

1

0

victoria

0

1

0

memorial

0

1

0

also

0

1

0

i

0

0

1

like

0

0

1

to

0

0

1

visit

0

0

1

agra

0

0

1

讓我們有一個像“taj mahal agra”這樣的查詢。

查詢將建立為:

taj [100] & mahal [100] & agra [001]

或 100 & 100 & 001 = 000,因此在這裡我們可以看到使用 AND 沒有一個文件是相關的。

然後,我們可以嘗試包含其他運算子,例如 OR,或者除了這些之外使用不同的關鍵字。

此語料庫的倒排索引可以建立為:

taj - 集合(1)

mahal – 集合(1)

is - 集合(1,2)

a - 集合(1,2)

beautiful - 集合(1)

monument - 集合(1,2)

victoria – 集合(2)

memorial - 集合(2)

also - 集合(2)

i - 集合(3)

like - 集合(3)

to - 集合(3)

visit - 集合(3)

agra- 集合(3)

向量空間模型

向量空間模型是一種統計檢索模型。

  • 在此模型中,文件表示為詞袋。

  • 詞袋允許單詞出現多次

  • 使用者可以使用帶搜尋查詢的權重,例如 q = < 電子商務 0.5;產品 0.8;價格 0.2

  • 它基於查詢和文件之間的相似性。

  • 輸出是排名的文件。

  • 它還可以包含單詞的多次出現。

圖形表示

示例

import pandas as pd
from contextlib import redirect_stdout
import math
trms = []
Keys = []
vector_dic = {}
dictionary_i = {}
random_list = []
t_frequency = {}
inv_doc_freq = {}
wt = {}
def documents_filter(docs, rw, cl):
   for i in range(rw):
      for j in range(cl):
         if(j == 0):
            Keys.append(docs.loc[i].iat[j])
         else:
         
            random_list.append(docs.loc[i].iat[j])
            
            if docs.loc[i].iat[j] not in trms:
            
                     trms.append(docs.loc[i].iat[j])
                     
      listcopy = random_list.copy()
      dictionary_i.update({docs.loc[i].iat[0]: listcopy})
      random_list.clear()
      
def calc_weight(doccount, cls):
   for i in trms:
      if i not in t_frequency:
            t_frequency.update({i: 0})
            
      for key, val in dictionary_i.items():
         for k in val:
            if k in t_frequency:
               t_frequency[k] += 1
      inv_doc_freq = t_frequency.copy()
      for i in t_frequency:
         t_frequency[i] = t_frequency[i]/cls
      for i in inv_doc_freq:
         if inv_doc_freq[i] != doccount:
            inv_doc_freq[i] = math.log2(cls / inv_doc_freq[i])
         else:
         
            nv_doc_freq[i] = 0
      for i in inv_doc_freq:
         wt.update({i: inv_doc_freq[i]*t_frequency[i]})
         
      for i in dictionary_i:
         for j in dictionary_i[i]:
            random_list.append(wt[j])
            
      copy = random_list.copy()
      vector_dic.update({i: copy})
      random_list.clear()
      
def retrieve_wt_query(q):
   qFrequency = {}
   for i in trms:
      if i not in qFrequency:
         qFrequency.update({i: 0})
   for val in q:
      if val in qFrequency:
         qFrequency[val] += 1
   for i in qFrequency:
      qFrequency[i] = qFrequency[i] / len(q)
      
   return qFrequency
   
def compute_sim(query_Weight):
      num = 0
      deno1 = 0
      deno2 = 0
      sim= {}
      for doc in dictionary_i:
         for trms in dictionary_i[doc]:
            num += wt[trms] * query_Weight[trms]
            deno1 += wt[trms] * wt[trms]
            deno2 += query_Weight[trms] * query_Weight[trms]
         if deno1 != 0 and deno2 != 0:
            simi = num / (math.sqrt(deno1) * math.sqrt(deno2))
            sim.update({doc: simi})
            num = 0
            deno1 = 0
            deno2 = 0
            
      return (sim)
      
def pred(simi, doccount):

   with open('result.txt', 'w') as f:
      with redirect_stdout(f):
         ans = max(simi, key=simi.get)
         print(ans, "- most relevent document")
         print("documents rank")
         for i in range(doccount):
            ans = max(simi, key=lambda x: simi[x])
            print(ans, "ranking ", i+1)
            simi.pop(ans)
            
def main():
   docs = pd.read_csv(r'corpus_docs.csv')
   rw = len(docs)
   cls = len(docs.columns)
   documents_filter(docs, rw, cls)
   calc_weight(rw, cls)
   print("Input your query")
   q = input()
   q = q.split(' ')
   q_wt = retrieve_wt_query(q)
   sim = compute_sim(q_wt)
   pred(sim, rw)
main()

輸出

Input your query
hockey
{'doc2': 0.4082482904638631}
doc2 - most relevent document
documents rank
doc2 ranking 1

結論

文件檢索是如今每個搜尋任務的基石。無論是搜尋、資料庫檢索還是一般資訊檢索,我們都能在布林模型和向量空間模型等模型的應用中找到答案。

更新於: 2023-03-23

6K+ 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.