1. 程式人生 > >資訊索引導論學習筆記(1)——布林檢索

資訊索引導論學習筆記(1)——布林檢索

資訊檢索

資訊檢索(Information Retrieval,簡稱IR):從大規模非結構化資料(通常是文字)的集合(通常儲存在計算機上)中找出滿足使用者資訊需求的資料(通常是文件)的過程 資訊檢索按照規模分類:
  • 以web搜尋為代表的大規模級別
  • 小規模級別,典型示例為個人資訊檢索
  • 中等規模級別,面向企業、機構和特定領域的搜尋

倒排索引

順序掃描:這種線性掃描就是一種最簡單的計算機文件檢索方式。這個過程通常稱為grepping,它來自於Unix下的一個文字掃描命令grep。 順序掃描無法滿足的幾種情況:
  1. 大規模文件集條件下的快速查詢。
  2. 更靈活的匹配方式。比如grep命令下不能支援諸如Romans NEAR countrymen之類的查詢
  3. 需要對結果進行排序
詞項-文件的關聯矩陣
詞項-文件的關聯矩陣,其中每一行代表一個詞,每列表示一個劇本。當詞t在劇本d中存在時,矩陣元素(t, d)的值為1,否則為0 為想要查詢 Brutus AND Caesar AND NOT Calpurnia,我們分別取出 Brutus,Caesar及Calpurnia對應的行向量,並對Calpurnia對應的向量求反,然後進行基於位的與操作,得到: 110100 AND 110111 AND 101111 = 100100 詞項-文件(term-doc)的關聯矩陣具有高度稀疏性,僅僅儲存非零的位置明顯更好 倒排索引的構建
  • 對每個詞項t,記錄所有包含t的文件,建立詞條序列<詞條,docID>二元組
  • 對詞項、文件排序。按詞項排序,然後每個詞項按docID排序
  • 合併詞項,並記錄詞項的文件頻率df(對每個詞項t,記錄所有包含t的文件數目)

布林查詢處理

and查詢處理 比如說,我們要尋找既包含字串“Brutus”又包含字串“Calpurnia”的文件,我們可以採用歸併的方法(類似於歸併排序中的merge操作),進行如下幾步:
  1. 取出包含字串“Brutus”的倒排記錄表
  2. 取出包含字串“Calpurnia”的倒排記錄表
  3. 通過合併兩個倒排記錄表,找出既包含“Brutus”又包含“Calpurnia”的文件

利用歸併的演算法,可以在O(n)的時間複雜度求出交集,書上用連結串列,我為了方便,直接用陣列了
#include <stdio.h>

int main(void)
{
	int arr1[7] = {1, 2, 4, 11, 31, 45, 173}; /*Brutus文件集合*/
	int arr2[4] = {2, 31, 54, 101}; /*Calpurnia文件集合*/
	int result[7] = {0}; /*交集集合*/
	int i, j, k, len1, len2;

	/*變數初始化*/
	len1 = sizeof(arr1) / sizeof(int);
	len2 = sizeof(arr2) / sizeof(int);

	/*歸併演算法*/
	for (i = j = k = 0; i < len1 && j < len2;) {
		if (arr1[i] == arr2[j]) {
			result[k] = arr1[i];
			i ++;
			j ++;
			k ++;
		} else if (arr1[i] < arr2[j]) {
			i ++;
		} else if(arr1[i] > arr2[j]) {
			j ++;
		}
	}

	/*列印輸出*/
	for (i = 0; i < k; i ++) {
		printf("%d ", result[i]);
	}
	printf("\n");

	return 0;
}

通用的查詢優化策略(詞典中儲存文件頻率df的一個充分理由) (madding OR crowd) AND (ignoble OR strife) AND (killed OR slain)

  • 每個布林表示式都能轉換成上述形式(合取正規化)
  • 獲得每個詞項的df
  • 通過將詞項的df相加,估計每個OR表示式對應的倒排記錄表的大小
  • 按照上述估計從小到大依次處理每個OR表示式
布林邏輯轉換(數學理論) 這種變換基於關於邏輯等價的規則:
  • 雙重否定律
  • 德×摩根定律:非(P 且 Q) = (非P)  |  (非Q) 非(P 或 Q) = (非 P) 且 (非 Q)
  • 分配律

參考連結