信息索引导论学习笔记(1)——布尔检索
2013-06-09 17:49
330 查看
信息检索
信息检索(Information Retrieval,简称IR):从大规模非结构化数据(通常是文本)的集合(通常保存在计算机上)中找出满足用户信息需求的资料(通常是文档)的过程信息检索按照规模分类:
以web搜索为代表的大规模级别
小规模级别,典型示例为个人信息检索
中等规模级别,面向企业、机构和特定领域的搜索
倒排索引
顺序扫描:这种线性扫描就是一种最简单的计算机文档检索方式。这个过程通常称为grepping,它来自于Unix下的一个文本扫描命令grep。顺序扫描无法满足的几种情况:
大规模文档集条件下的快速查找。
更灵活的匹配方式。比如grep命令下不能支持诸如Romans NEAR countrymen之类的查询
需要对结果进行排序
词项-文档的关联矩阵
词项-文档的关联矩阵,其中每一行代表一个词,每列表示一个剧本。当词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操作),进行如下几步:
取出包含字符串“Brutus”的倒排记录表
取出包含字符串“Calpurnia”的倒排记录表
通过合并两个倒排记录表,找出既包含“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表达式
布尔逻辑转换(数学理论)
可以参考我之前写的一篇博客:http://blog.csdn.net/zinss26914/article/details/9056049
这种变换基于关于逻辑等价的规则:
双重否定律
德×摩根定律:非(P 且 Q) = (非P) | (非Q) 非(P 或 Q) = (非 P) 且 (非 Q)
分配律
参考链接
http://www.cnblogs.com/god_bless_you/archive/2012/08/10/2631975.html相关文章推荐
- 信息检索导论学习笔记 --第一章 布尔检索
- 信息检索导论:第一章 布尔检索 学习笔记
- 信息检索导论学习笔记(一) 布尔检索
- 【SQL Server学习笔记】索引调优、统计信息、查询调整、资源调控
- [Linux学习笔记] Linux常用命令 - 用户版本信息查看
- 经典SQL学习笔记 (六)-用户管理、视图、序列、索引、权限
- Java学习笔记之信息隐藏(Information Hiding)
- 【ext js 学习笔记】获取后台返回的自定义错误信息
- [算法导论] 单源最短路径 - Dijkstra 学习笔记
- 信息安全工程师 学习笔记(三十七)
- linux基础学习笔记之查看系统硬件信息命令
- DFT和FFT详解(算法导论学习笔记)
- 【算法导论学习笔记】第3章:函数的增长
- 算法导论学习笔记-第2章 算法入门
- SpringMVC注记方式验证学习笔记——验证出错提示信息文本与验证注记的关联
- iOS学习笔记(十三)——获取手机信息(UIDevice、NSBundle、NSLocale)
- linux查看系统信息软件安装信息命令学习笔记
- Androin学习笔记二十一:wifi的简单使用方法----获得本机或主机信息
- 信息检索导论学习笔记 -- 第二章:词项词典及倒排记录表
- 初学HTML的学习笔记——meta元信息标记