使用布林模型和向量空間模型進行文件檢索
簡介
機器學習中的文件檢索是資訊檢索這一更大範疇的一部分,在資訊檢索中,系統會嘗試根據使用者的查詢找到與搜尋查詢相關的文件,並根據相關性或匹配程度對它們進行排序。
文件檢索有多種方法,其中兩種流行的方法是:
布林模型
向量空間模型
讓我們簡要了解一下以上每種方法。
布林模型
這是一種基於集合的檢索模型。使用者查詢以布林形式表示。查詢使用 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
結論
文件檢索是如今每個搜尋任務的基石。無論是搜尋、資料庫檢索還是一般資訊檢索,我們都能在布林模型和向量空間模型等模型的應用中找到答案。
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP