在信息檢索導論課程中,涉及到了倒排記錄表合併算法的實現,因此在這簡單分享一下我的實現的算法。
(1)兩個倒排記錄表的合併算法
僞代碼如下:
算法實現:
'''程序說明:
求兩個倒排記錄表的交集
輸入詞項的倒排記錄表時,當輸入-1,停止輸入其倒排記錄表
'''
#data字典存儲所有數據
data = {}
#分別輸入兩個詞項以及其對應的倒排記錄表
#輸入詞項word1以及它的倒排記錄表
word1 = str(input("請輸入詞項word1:"))
id_1 = []
while 1:
a1 = int(input('請輸入word1的倒排記錄表(輸入-1,停止輸入倒排記錄表):'))
if(a1 != -1):
id_1.append(a1)
else:
break
data[word1] = id_1
#輸入詞項word2以及它的倒排記錄表
word2 = str(input('請輸入詞項word2:'))
id_2 = []
while 1:
a2 = int(input("請輸入word2的倒排記錄表(輸入-1,停止輸入倒排記錄表):"))
if(a2 != -1):
id_2.append(a2)
else:
break
data[word2] = id_2
print('詞項a1爲:',word1)
print('詞項a2爲:',word2)
print('詞項a1的倒排記錄表爲:',data[word1])
print('詞項a2的倒排記錄表爲:',data[word2])
#求兩個詞項的並集
same_id = []
for i in data[word1]:
if(i in data[word2]):
same_id.append(i)
else:
continue
print("相同的倒排記錄表爲:",same_id)
(2)基於跳錶指針的倒排記錄表的合併算法
僞代碼:
算法實現:
'''代碼說明:基於跳錶指針求兩個倒排記錄表的交集
輸入詞項的倒排記錄表時,當輸入-1時,停止輸入其倒排記錄表
'''
import math
#存儲所有數據的字典
data = {}
#分別輸入兩個詞項以及其對應的倒排記錄表
#輸入詞項word1以及它的倒排記錄表
word1 = input("請輸入word1:")
id_1 = []
while 1:
a1 = int(input('請輸入word1的倒排記錄表:'))
if(a1 != -1):
id_1.append(a1)
else:
break
data[word1] = id_1
#輸入詞項word2以及它的倒排記錄表
word2 = input('請輸入word2:')
id_2 = []
while 1:
a2 = int(input("請輸入word2的倒排記錄表:"))
if(a2 != -1):
id_2.append(a2)
else:
break
data[word2] = id_2
#求兩個詞項的並集
#兩個倒排記錄表的長度
len1 = len(data[word1])
#詞項word1倒排記錄表需要設置的跳錶指針的步長
n1 = math.ceil((pow(len1,0.5)))
len2 = len(data[word2])
#詞項word2倒排記錄表需要設置的跳錶指針的步長
n2 = math.ceil((pow(len2,0.5)))
i = j = 0
result = []
count = 0
while i < len1 and j < len2:
if data[word1][i] == data[word2][j]:
result.append(data[word1][i])
i = i +1
j = j + 1
count = count + 1
elif data[word1][i] < data[word2][j]:
while (i + n1 < len1) and data[word1][i+n1] <= data[word2][j]:
i = i + n1
count = count + 1
else:
i = i + 1
count = count + 1
else:
while (j + n2 < len2) and data[word2][j+n2] <= data[word1][i]:
j = j + n2
count = count + 1
else:
j = j + 1
count = count + 1
print("倒排記錄表的並集爲:",result)
#print("跳轉次數爲:",count)
(3)輸入多個詞項與查詢時倒排記錄表的合併算法
查詢優化:
考慮n 個詞項的 AND ,按照表從小到大(即df文檔頻率從小到大)的順序進行處理,每次從長度最小的開始合併。
算法實現:
'''代碼說明:
1、合併多個詞項的倒排記錄表的查詢
2、輸入多個詞項時,輸入skip,停止輸入詞項,即跳出程序
3、輸入詞項的倒排記錄表,當輸入-1時,停止輸入其倒排記錄表
'''
print('在輸入每一個詞項的倒排記錄表時,輸入-1停止輸入')
print("在輸入詞項時,輸入skip,停止輸入詞項以及其倒排記錄表")
#存儲所有數據的字典
data = {}
data_term = {}
data_key = []
#分別輸入兩個詞項以及其對應的倒排記錄表
#輸入詞項word1以及它的倒排記錄表
while 1:
word = str(input("請輸入word:"))
if word != 'skip':
id_1 = []
while 1:
a1 = int(input('請輸入word的倒排記錄表:'))
if(a1 != -1):
id_1.append(a1)
else:
break
#以字典的形式保存word1的詞項以及倒排記錄表
data[word] = id_1
else:
break
#輸出總數據庫
#print('所有數據爲:',data)
#對數據庫中的倒排記錄表的長度進行從大到小排序
while len(data)>0:
min_num = 1000
for key in data:
if len(data[key])<=min_num:
min_num = len(data[key])
key_term = key
term = data[key]
#將最短的詞項以及其倒排記錄表存儲到data_term中
data_term[key_term]=term
#將最短的倒排記錄表的詞項按順序存儲到data_key列表中
data_key.append(key_term)
#在原數據庫中刪除最短詞項相關信息
data.pop(key_term)
#按倒排記錄表的由小到大的順序進行合併
id_term = []
for i in range(0,len(data_key)):
if(i==0):
id_term = data_term[data_key[i]]
else:
for j in id_term:
if(j in data_term[data_key[i]]):
continue
else:
id_term.remove(j)
print('合併後的倒排記錄表爲:',id_term)
(4)鄰近搜索中兩個倒排記錄表的搜索算法
僞代碼:
注意事項:
鄰近搜索中的搜索策略考慮兩個詞項的倒排記錄表前後位置之間的距離不大於某個值
算法實現 :
'''
程序說明:
1、鄰近搜索中兩個倒排記錄表的搜索算法
2、k爲臨近的距離
3、輸入詞項的倒排記錄表時,輸入-1,停止輸入倒排記錄表
'''
#存儲所有數據的字典
data = {}
#分別輸入兩個詞項以及其對應的倒排記錄表
#輸入詞項word1以及它的倒排記錄表
k = int(input("請輸入K的值:"))
word1 = str(input(print("請輸入word1:")))
id_1 = []
while 1:
a1 = int(input('請輸入word1的倒排記錄表:'))
if(a1 != -1):
id_1.append(a1)
else:
break
data[word1] = id_1
#輸入詞項word2以及它的倒排記錄表
word2 = str(input('請輸入word2:'))
id_2 = []
while 1:
a2 = int(input("請輸入word2的倒排記錄表:"))
if(a2 != -1):
id_2.append(a2)
else:
break
data[word2] = id_2
print('詞項a1爲:',word1)
print('詞項a2爲:',word2)
print('詞項a1的倒排記錄表爲:',data[word1])
print('詞項a2的倒排記錄表爲:',data[word2])
#求兩個詞項的並集
#存儲相同的倒排記錄表
same_id = []
for i in data[word1]:
for j in data[word2]:
if(abs(i-j)<=k):
if(i not in same_id):
same_id.append(i)
if(j not in same_id):
same_id.append(j)
else:
continue
print("相同的倒排記錄表爲:",sorted(same_id))