
作者:张华平
页数:328
出版社:清华大学出版社
出版日期:2019
ISBN:9787302531173
电子书格式:pdf/epub/txt
内容简介
大数据智能是大数据、人工智能与自然语言处理等学科交叉融合的关键技术。本书主要讲述大数据智能的框架平台、理论算法、关键技术和应用实践: 在大数据与人工智能方面主要讲述了大数据智能概述、大数据技术平台与架构、传统机器学习与深度学习算法;在自然语言处理方面详细讲解了大数据精准搜索、汉语分词、新词发现、文本分类聚类、情感分析等当前热门的自然语言处理关键技术;在应用实践方面,本书进一步提供了自主研发的NLPIR大数据智能分析工具平台,具体介绍警情大数据、网络赌博、微博挖掘、看图说话等多个实际的大数据应用项目,也引入《红楼梦》前后作者分析、2手房房价、歌词生成等有意思的课程实践案例。
本书立足于作者近20年的前沿研究进展和工程实践,结合北京理工大学“大数据分析与应用”研究生课程讲授经验,体系完整,内容深入浅出,理论与实践并重,吸收了当前的技术前沿成果,同时突出原创的研究成果。本书可作为大数据、人工智能与自然语言处理方向的科研人员、高校研究生与本科生的教材,也可作为大数据智能方向的工程技术人员和爱好者的参考书。
作者简介
张华平,男,汉族,北京理工大学副教授,博士,研究生导师,知名汉语分词系统ICTCLAS创始人,北京市海量语言信息处理与云计算工程中心大数据搜索与挖掘实验室主任,中国互联网协会大数据工作委员会(筹)执行主任,中国中文信息学会社会媒体处理专业委员会副秘书长,北京市顺义区政府专家咨询委员会委员,第三届全国社会媒体处理大会程序委员会主席,同时担任辽宁师范大学客座教授,首都师范大学兼职副教授;中国计算机学会青年科技论坛YOCSEF委员,中国计算机学会普及工委委员,国家自然科学基金函评专家,北京市重点产业知识产权联盟专家、同时担任《计算机学报》、《计算机研究与发展》、中国科技论文在线等杂志的特邀评审专家。2005年博士毕业于中科院计算所,研究方向为:大数据搜索与挖掘、自然语言处理、信息检索与信息安全。曾先后获得2016年度新疆自治区科技进步奖二等奖,2010年度钱伟长中文信息处理科学技术奖一等奖,中科院院长优秀奖、中科院计算所所长特别奖,中科院计算所“百星计划”首批入选者。发表《大数据搜索与挖掘》、《大数据大家谈》、《信息检索:算法与启发式规则》、《自然语言理解》等专译著4部。
本书特色
大数据智能是大数据、人工智能与自然语言处理等学科交叉融合的关键技术。本书主要讲述大数据智能的框架平台、理论算法、关键技术和应用实践: 在大数据与人工智能方面主要讲述了大数据智能概述、大数据技术平台与架构、传统机器学习与深度学习算法;在自然语言处理方面详细讲解了大数据精准搜索、汉语分词、新词发现、文本分类聚类、情感分析等当前热门的自然语言处理关键技术;在应用实践方面,本书进一步提供了自主研发的NLPIR大数据智能分析工具平台,具体介绍警情大数据、网络赌博、微博挖掘、看图说话等多个实际的大数据应用项目,也引入《红楼梦》前后作者分析、二手房房价、歌词生成等有意思的课程实践案例。
本书立足于作者近20年的前沿研究进展和工程实践,结合北京理工大学“大数据分析与应用”研究生课程讲授经验,体系完整,内容深入浅出,理论与实践并重,吸收了当前的技术前沿成果,同时突出原创的研究成果。本书可作为大数据、人工智能与自然语言处理方向的科研人员、高校研究生与本科生的教材,也可作为大数据智能方向的工程技术人员和爱好者的参考书。
目录
目录
第1章大数据智能概述/1
1.1数据的智能演化过程/1
1.2大数据/2
1.2.1大数据的概念/2
1.2.2大数据的特征/2
1.2.3大数据带来的决策方式的革命/3
1.2.4大数据面临的挑战及其对应的技术概览/5
1.2.5科学的大数据观/9
1.2.6大数据架构下的人才需求及产业结构/10
1.3人工智能/12
1.4自然语言处理/14第2章大数据技术平台与架构/16
2.1大数据技术概览/16
2.1.1大数据技术架构/16
2.1.2云计算/17
2.2Hadoop、Spark生态系统/20
2.2.1Hadoop生态系统/20
2.2.2Spark生态系统/26
2.2.3Spark和Hadoop的性能对比/31
2.3大数据挖掘与可视化工具/34第3章传统机器学习与数据挖掘/40
3.1机器学习介绍/40
3.2关联规则挖掘/41
3.2.1Apriori算法/43
3.2.2FP瞘rowth算法/43〖2〗〖4〗大数据智能分析目录〖3〗3.3分类/45
3.3.1SVM/45
3.3.2决策树/52
3.3.3朴素贝叶斯/56
3.3.4K近邻/59
3.4聚类/60
3.4.1基于划分的聚类方法/60
3.4.2基于层次的聚类方法/65
3.4.3基于密度的聚类方法/71
3.4.4聚类案例: 用户细分模型/74
3.5数据挖掘相关工具/74
3.5.1数据获取工具/75
3.5.2分词工具/77
3.5.3分类聚类工具/79
3.5.4Python调用方法/79第4章经典深度学习算法与平台/81
4.1神经网络基础/82
4.1.1神经元/82
4.1.2从神经元到神经网络/82
4.2循环神经网络/84
4.2.1RNN基本概念/84
4.2.2RNN的长期依赖问题与LSTM/85
4.2.3深度RNN和双向RNN/88
4.3卷积神经网络/89
4.4序列到序列模型/90
4.5注意力模型/91
4.6生成对抗网络/93
4.7TensorFlow计算图框架/95
4.7.1数据流图/95
4.7.2TensorFlow的特征/95
4.7.3官方入门教程/96
4.8PyTorch深度学习框架/103
4.8.1PyTorch是什么/103
4.8.2自动求导: 自动微分/104
4.8.3神经网络/105第5章信息检索与大数据搜索/110
5.1概述/110
5.2JZSearch大数据搜索引擎系统架构/110
5.3大数据精准搜索的基本技术/112
5.3.1索引字段类型/112
5.3.2索引词项的设计/113
5.3.3索引压缩技术/113
5.3.4内存交换/115
5.3.5增量索引/116
5.3.6数据库检索/117
5.4大数据精准搜索语法/118
5.4.1JZSearch排序算法/118
5.4.2JZSearch结果格式/119
5.4.3JZSearch检索语法说明/119
5.5JZSearch大数据精准搜索应用案例/123
5.5.1中国邮政集团邮址垂直搜索/124
5.5.2标准文档搜索引擎/124
5.5.3内网文档的知识搜索门户/125
5.5.4商品比价搜索/125
5.5.5维吾尔文搜索/125第6章汉语分词/127
6.1概述/127
6.2汉语分词的困难性/129
6.3基于机械匹配的汉语分词算法/132
6.3.1词典匹配法/132
6.3.2N最短路径法/136
6.4基于统计语言模型的汉语分词算法/137
6.4.1N元语言模型/138
6.4.2互信息模型/138
6.4.3最大熵模型/140
6.5NLPIR睮CTCLAS: 基于层叠隐马尔可夫模型的汉语分词算法/141
6.5.1层次隐马尔可夫模型/141
6.5.2基于类的隐马尔可夫分词算法/143
6.5.3N最短路径的切分排歧策略/145
6.6基于双向循环神经网络与条件随机场的词法分析/146
6.6.1概述/146
6.6.2基于双向循环神经网络的序列标注/146
6.6.3融合条件随机场的深度神经网络模型/148
6.7实验与分析/149
6.7.1评估方法/149
6.7.2实验分析1/149
6.7.3实验分析2/153第7章命名实体识别/157
7.1命名实体识别定义/157
7.2命名实体识别的研究主体/158
7.3命名实体识别的特点及难点/158
7.4命名实体识别的研究技术路径/159
7.5基于角色标注的命名实体识别/159
7.6实验与分析/162第8章新词发现/163
8.1基于规则的研究方法/164
8.1.1规则抽取方法/165
8.1.2规则过滤方法/165
8.2基于统计模型的研究方法/166
8.2.1凝固度/166
8.2.2信息熵/166
8.2.3新词IDF/167
8.3面向社会媒体的开放领域新词发现/167
8.3.1引言/167
8.3.2新词发现/168
8.3.3实验/171第9章文本分类与聚类/175
9.1文本预处理/175
9.2文本表示模型/176
9.2.1传统布尔检索与扩展布尔检索模型/177
9.2.2向量空间模型/177
9.2.3概率检索模型/180
9.2.4语言模型/181
9.3文本特征选择方法/182
9.3.1信息增量/183
9.3.2卡方统计/183
9.3.3交叉熵/183
9.4文本分类概述/184
9.5文本聚类概述/187
9.5.1聚类算法体系/187
9.5.2半监督聚类/188第10章话题发现算法/191
10.1多语语义串自动发现/195
10.2多语语义关键特征挖掘/197
10.2.1关键特征抽取/197
10.2.2单个文档Top N关键特征挖掘/198
10.3Top N热点话题发现和关联归并/198
10.3.1Top N热点话题发现/198
10.3.2话题归并/200
10.4多语文本话题发现与关联归类实验验证/201第11章情感分析/203
11.1概述/203
11.2情感分类/205
11.3应用/208
11.3.1用户评论分析与决策/208
11.3.2舆情监控/208
11.3.3信息预测/209
11.4情感词发现与极性权重自动计算算法/209
11.4.1引言/209
11.4.2情感词典构建模型/211
11.4.3实验/213
11.5基于树模型的无监督情感分析系统/216
11.5.1实现方法/216
11.5.2系统架构及流程/217
11.5.3实验分析及结论/219
11.6基于深度神经网络的短文本情感倾向性分析/221
11.6.1语料库建设/221
11.6.2词袋模型与文本建模/223
11.6.3基于Softmax和深度神经网络的短文本情感分析算法/225
11.6.4实验设计及实验结果/229第12章自动摘要/234
12.1概述/234
12.2基于关键词提取的自动摘要/238
12.3面向主题的自动摘要/244
12.4基于主题模型与信息熵的中文文档自动摘要技术研究/247
12.4.1主题模型/248
12.4.2信息熵/250
12.4.3句子信息熵的计算方法/250
12.4.4算法介绍/250
12.4.5实验结果/251
12.5自动摘要应用场景分析及大数据搜索与挖掘软件应用示例/252第13章大数据智能应用案例/254
13.1公安警情大数据挖掘/254
13.2网络赌博信息文本挖掘/257
13.2.1Web网页信息选择与提取/257
13.2.2中文分词及词性标注处理/258
13.2.3特征提取/259
13.2.4基于网络赌博信息的数据挖掘/260
13.2.5网络赌博信息可视化展示/262
13.3领导人支持信息挖掘/265
13.4微博博主的特征与行为大数据挖掘/268
13.4.1介绍/268
13.4.2宏观特征大数据挖掘/270
13.4.3实验与分析/275
13.4.4微博博主的价值观自动评估方法/275
13.5看图说话: 基于Mask睷CNN的图片中文描述生成器/277
13.5.1自下而上的注意力机制在图像描述中的应用/278
13.5.2Bottom睻p睞ttention和Top睤own睞ttention图像描述模型/280
13.5.3Dense睞ttention图像描述模型/281
13.5.4基于语义控制的长短时记忆模型/281
13.5.5模型训练相关说明及结果分析/283
13.5.6模型测试相关说明及结果分析/284
13.5.7测试结果分析/286第14章大数据智能课程经典作业汇编/288
14.1《红楼梦》前后作者同一性分析/288
14.2党的十九大报告语义智能分析/293
14.3文章风格对比: 方文山与汪峰/294
14.4智慧旅游大数据应用/295
14.5某大厦电力数据挖掘/298
14.6杭州市二手房房价分析/301
14.6.1概述/301
14.6.2房价分析系统案例介绍/301
14.6.3本例设计与实现/304
14.7数据挖掘在股票分析预测中的应用/306
14.7.1概述/306
14.7.2股票分析预测方法/307
14.7.3神经网络在股票分析预测应用中的研究现状/307
14.7.4实验结果/309
14.8基于TensorFlow的歌词自动生成/310
14.8.1算法说明/310
14.8.2实验结果/311
14.9基于LSTM的购物评论分类/312
14.9.1获取语料库比分词/312
14.9.2词向量的转换/313
14.9.3建立向量和单词列表/313
14.9.4将句子转换成序号矩阵/314
14.9.5模型训练/314
节选
第5章第5章信息检索与大数据搜索5.1概述
JZSearch大数据精准搜索引擎是笔者针对大数据垂直搜索需求的全文检索引擎,先后研制三年多,已经实际应用于中国邮政、中国标准搜索、微博搜索等多个应用系统。整个系统内容基于C++开发,支持文本、数字、日期、字符串等各种数据类型,多字段的高效搜索,支持AND/OR/NOT以及NEAR邻近等查询语法,支持多种少数民族语言的检索,可以无缝地与现有文本处理系统和数据库系统融合。其主要特性包括如下。
(1) 可以按照任意指定字段排序,支持指定字段的搜索,也可以搜索多个字段,以及复杂表达式的综合搜索。
(2) 支持精确匹配以及模糊匹配,默认为精确匹配,忽略字母大小写进行模糊匹配。
(3) 内嵌正负面情感等极性分析,也可以支持类别搜索。
(4) 语义联想搜索。如搜索“马铃薯”可以同时返回“土豆”的内容,搜索“北京市”可以返回“北京”或者“首都”的内容;用户可以根据业务需要定制语义联系词表。
(5) 支持增量索引。系统可以在搜索服务不停的前提下,继续索引新的数据;索引完成后,可以搜索新的数据。
(6) 自动备份与恢复机制。在建立索引和自动优化之前,系统会将已有的索引文件自动备份;在当前索引文件被破坏无法搜索的前提下,系统将自动恢复上次搜索正常的备份文件。
(7) 自动缓存机制。系统自动保存最近常用的搜索条件与结果,再次搜索时将直接推送搜索结果内容,可以将搜索响应速度提升30%以上;缓存会随着新的索引数据自动更新,不存在缓存延迟问题。
(8) 自动优化机制。在系统索引碎片较多时,系统会自动优化归并。
(9) 实现的是多线程搜索服务。兼容当前所有厂商的数据库系统,其中,SQL Server、Oracle、MySQL、DB2等支持Windows/Linux/FreeBSD等操作系统,支持C/C++/C#/Java二次开发。
5.2JZSearch大数据搜索引擎系统架构
JZSearch大数据精准搜索引擎的系统架构如图51所示。图51JZSearch大数据搜索引擎架构
整个系统包括6部分: 其中核心组件有索引器Indexer、搜索器Searcher、内部配套的词法分析工具NLPIR睮CTCLAS、搜索管理器Manager,以及外围组件,包括数据库适配器Adapter、供开发人员调用的SaaS API。依次介绍如下。
1. Indexer(索引器)
Indexer的主要功能是对各类结构化与非结构化数据进行高效索引,索引文件以索引桶的形式存储。
〖2〗〖4〗大数据智能分析第5章信息检索与大数据搜索〖3〗2. Searcher(搜索器)
Searcher的主要功能是对用户查询进行解析,并搜索所有的索引桶,按照排序算法要求输出各类形式的查询结果,最终返回给搜索用户。
3. NLPIR睮CTCLAS(词法分析工具)
NLPIR睮CTCLAS的主要功能是对用户查询与文档进行词法分析,提供分词结果供后续的计算提供词法粒度,可以解决汉语与英语的编码转换与词法处理工作。少数民族语言搜索的词法分析采用n瞘ram进行索引。
4. Manager(搜索管理器)
Manager的主要功能是为管理员提供精准搜索引擎的后台知识与索引文件提供管理工具,搜索管理器采用命令行、可视化界面及API的形式,实现同义与相关词扩展、索引自动归并、部分索引内容的删除、索引项自动统计等功能。
5. Adapter(数据库适配器)
Adapter的主要功能是自动对已有的数据库进行扫描遍历,实现对数据库的无缝支持,从而为数据库管理系统提供全文搜索功能。目前支持的数据库系统包括Oracle、SQL Server、MySQL,以及新型的HBase、MongoDB等数据库,从而为各类业务系统提供结构化与非结构化数据的联合搜索服务。
6. SaaS API(供开发人员调用的精准搜索引擎服务API)
JZSearch的索引与搜索系统可以自动搭建,针对已有的业务数据提供无值守的搜索服务。开发人员只要熟悉搜索语法,采用SaaS API即可使用搜索服务,嵌入自己的应用程序,实现大数据的精准搜索。
JZSearch大数据精准搜索引擎提供的是在线增量索引功能,即整个搜索服务不间断的情况下,实现增量索引,索引完成后,自动加载增量数据;如果索引桶碎片过多,则自动对索引桶进行归并操作。为实现各种不同状态的自动切换,JZSearch采用文件JZSearch.status对状态进行管理,具体的状态转换图如图52所示。
图52JZSearch大数据搜索引擎的状态转换图
5.3大数据精准搜索的基本技术〖最4/5〗5.3.1索引字段类型JZSearch兼容当前基本的数据类型,如表51所示。表51JZSearch索引字段类型
类型名类型值说明FIELD_TYPE_TEXT1文本类型FIELD_TYPE_INT2整型(32位整型数据)FIELD_TYPE_LONG3长整型(64位整型数据)FIELD_TYPE_DATETIME4日期时间型(目前等同于FIELD_TYPE_INT)FIELD_TYPE_FLOAT5浮点型FIELD_TYPE_BIGTEXT6存储在大文件中5.3.2索引词项的设计
JZSearch采用固定的静态索引词项,而不是动态变化的词典。在中英文搜索引擎的词典方面,包括8万中文词语以及7万左右的常用英文词典,主要优势在于: 静态词典可以采用高效的查询算法,这里采用完美双数组TRIE树词典管理与检索方法,可以实现每秒100万次的查询速度,算法时间复杂度仅与被查询词条的长度相关,而与词典规模无关,内存占用一般仅仅为2MB以内。动态词典的查询效率不到静态词典的1/10,而词典的查询在一般的信息处理中将占据90%以上的执行频率;同时,过大的搜索词项将导致索引的急剧膨胀。
静态词典需要较好解决词典未收录词(out瞣f瞯ocabulary)的处理,具体包括下面3种情况。
1. 英文的特殊形式处理
英文不规则动词的不同时态、名词的单复数等情况,JZSearch并不采用常见的词干处理的方法,这种方法过于简单,信息的丢失严重。这里收集了不同形态的变换对应关系,直接输出对应的词原型,绝大部分原型都在索引词典中收录了。
2. 未收录中文词的处理
NLPIR睮CTCLAS分词系统会产生系统未收录的人名、地名、新词等,这里采用索引词表对未登录词进行二次最大匹配,确保每个词都在索引词范围内,如“张华平”将按照“张”“华”“平”3个词分别索引。
3. 未收录的英文数字的处理
这里采用交叉三元组(每个三元组都已经收录到索引词典中)的形式分别索引,例如,需要索引未登录的ABCDE,则依次索引项ABC、BCD、CDE;可以确保搜索ABCDE的任何两个以上字符的子串都可以查询到。单个或者两个字符的索引都是直接搜索,三元组可以确保搜索的效率。
5.3.3索引压缩技术
倒排索引文件研究的一个关键目标是研究一些算法来减少I/O带宽和存储开销。索引文件的大小决定其所占用的存储开销。此外,由于大索引文件需要更大的I/O带宽来读取,因此,其大小也直接影响处理时间。
尽管文本压缩已被广泛研究,但是在压缩倒排索引文件方面的研究工作相对来讲还是比较少的。然而,在Moffat和Zobel的研究中,他们使用了一种相对比较容易解压缩的索引生成方式。压缩索引后的大小不到原始文档集的10%,而且更让人印象深刻的是,这里面还包含停用词。
尽管有些研究表明,假设内存代价相对较低,可以不必关注于索引压缩,但仍然需要做些工作。《国王詹姆斯圣经》(大约5MB)包含9020个词项,而传统的TREC文档集(稍多于2GB)包含538 244个词项。当遇到新的领域时,新词的数量总会有一些增长,但是认为词表数量大约稳定在100万或200万个还是合理的。对于每一个索引词,索引词的平均长度为6,文档频率计数器需要4字节,倒排表入口的指针需要4字节,总共需要14字节。保守估计有200万个索引词,未经压缩的索引很可能在32MB以内。甚至可以上升一个数量级,存储索引所需的内存空间保守地讲也会在1GB以下。
假如索引相对较小,而且可以很容易加载到内存中,就不用过多地讨论索引压缩的技术细节了。这里注意到,词干还原降低了压缩的需求,相对直接的方法就是使用哈夫曼编码。同样,使用短语可以提高召回率和准确率。按照短语存储索引也可以很好地压缩索引。这还取决于如何识别和限制短语。大多数系统往往会去除出现频率较低的短语。
具体存储数值时,JZSearch采用字节对齐(Byte Aligned,BA)的索引压缩算法。通过使用字节边界来实现BA压缩,运行时会付出些代价,但可以获得一定的压缩比。BA算法易于实现,而且压缩比比较高(使用停用词后,压缩文件大小占未压缩索引文件大小的比例大约是15%)。尽管变长压缩可以获得更好的压缩比,但其代价更高,需要预先遍历索引内容,BA算法与索引项无关,可以快速高效地实现,在实际索引中更受推崇。索引压缩尽管需要一定的解压缩时间,但是将大大降低I/O时间,综合来看,索引压缩提高了索引和搜索的效率。
JZSearch采用行程编码(Ran睱ength Enwding,RLE)方法存储索引的文档编号DocID与位置信息Offset,这两部分的信息都是自动增量的。以文档DocID为例,对于任意一个文档DocID,仅仅需要计算当前DocID以及待处理DocID之间的偏移量。例如,倒排表第i篇文档的编号为DocIDi,倒排的下一个文档编号为DocIDi+1,实际存储的时候i+1个文档存储的值为DocIDi+1-DocIDi,可以采用较小的值来存储。对于没有其他文档ID存在的情况下,就存储文档ID的压缩形式。采用这种技术,相对较小的数值可以保证在整个数据中占较大比重。这种方案可以很有效地减小ID的范围,允许它们以更精小的形式存储。
随后,采用接下来的方法进行数据压缩。对于一个给定的输入值,保留最左面的两个比特,用来存储整个存储值占用的字节数。两个比特位的表现形式有4种可能的组合,因此,对于所有的文档ID,可以使用一个两比特位的指示器。整型数据的存储长度可以为6比特、14比特、22比特或者30比特。最佳的情况下,所有的值都小于26=64,通过上述方法,每个单独的数据记录大小使用一个字节就可以存储。在没有压缩的情况下,所有的文档ID都需要使用4字节存储。
对于待压缩的每一个值,需要计算存储值所需的最小字节数(注意: 这种说法并不是特别精确,因为并不需要做零点位移。因此,一位移的存储空间可能会比实际需要的空间大小少一些。因为这种存储方法往往需要额外的增量操作,而且它仅适合于数据边界的情况。因此,该方法极少使用)。表52给出可以存储的值范围,同样长度指示器分别为1字节、2字节、3字节以及4字节。如果文档集中的文档数目超过230,这种方法可以将指示器长度扩展为3比特,这样表示的范围就达到了261-1。表52整型数据的存储范围及其字节数
长度所需字节数长度所需字节数0≤x<64116 384≤x<4 194 304364≤x<16 38424 194 304≤x<1 073 741 8244给定任意一个索引词t1,考虑其索引的条目,假定t1在文档1、文档3、文档7、文档70和文档250中出现。BA压缩使用最高的两个比特位来表明存储该值需要的字节数。对于前4个值,只需要一个字节就可以表示;对于最后一个值180,需要两个字节来表示。需要注意的是: 只需要计算倒排表中每一项的差。最后的差值为250-70=180。现在需要计算所有的最终数值。这些数值和压缩后的相应比特字符串如表53所示。表53字节对齐方式压缩
值压缩的比特串值压缩的比特串100 0000016300 111111200 00001018001 000000 10110100400 000100在没有压缩之前,倒排表中的每条记录需要4字节,5条记录总共需要20字节。这些数值和它们对应压缩前的比特字符串详见表54。表54对应压缩前的比特字符串
值未压缩的比特串值未压缩的比特串100000000 00000000 00000000 000000017000000000 00000000 00000000 01000110300000000 00000000 00000000 0000001125000000000 00000000 00000000 11111010700000000 00000000 00000000 00000111在这个例子中,未压缩的数据需要160比特,使用BA压缩后仅需要48比特。压缩比为48/160=30%。
5.3.4内存交换
缓存技术是提高系统性能和可扩展性的一种重要手段,在计算机各个领域都有广泛应用。缓存技术最先应用于CPU设计中,由于内存的访问速度较CPU寄存器要慢几个数量级,然而CPU的存储容量有限,且比内存昂贵,所以将内存中的一部分内容缓存到CPU中,从而缓和CPU与内存之间的性能差距,提高系统性能。同样地,将慢速的磁盘中的内容缓存到内存中,可以减少对磁盘的I/O操作,提高存取效率。常用的缓存替换算法有FIFO(先进先出)算法、LRU(最近最少访问策略)算法。
尽管目前服务器中配置的内存已经相当大,而且可以通过增加内存来满足JZSearch索引需求的空间。但是这对一个应用系统来说,无疑是令人头痛的。而且检索系统的应用环境并没有那么简单,比如与另外占用内存很大的系统同时运行在一台机器上,或者运行在一台配置比较低的PC上,这些都要求JZSearch在内存的使用上有很强的伸缩性,所以索引缓存必不可少。
5.3.5增量索引
在实际应用中,源文档集并不是一成不变的,而是随着时间的变化不断增加或变化。例如,新增加标准、标准修订、标准作废、标准实施等,每时每刻都可能有数据的增加、删除和数据内容的修改。对于这样的文档集称为动态文档集或动态文本。对于动态文本,如果采用静态的倒排索引,查询结果往往不能反映出最新的标准信息,新发布的标准无法出现在查询结果中,而已作废的标准状态没有改变。因此,倒排索引需要随着源数据的变化而更新。
向倒排索引中添加新的文档,需要抽取出文档中的词,再从词典中搜索出这些词的Handle或者索引顺序,然后根据索引文件找到该词的倒排链表,并在倒排链尾部添加该词的索引。然而,一篇文档往往包含几百到几千个词,每增加一篇文档就需要对当前索引进行一次更新。为保证倒排索引的检索效率,每个词的倒排链在磁盘上是连续存放的。每更新一次倒排链,需要重新分配磁盘空间,然后将旧的倒排链数据复制到新的空间,并在尾部添加新的倒排链数据。这样会导致过多的磁盘读写以及磁盘复制操作。因此,使用这种直接的方法往倒排索引中添加新索引数据是非常低效的。
Cutting和Pedersen的研究表明,在倒排索引更新的过程中,将倒排索引缓存在内存中可以大幅度地提高效率。每篇文档的添加首先在内存中进行,只有当内存缓冲区不够时才更新磁盘上的索引数据,这样可以大大减少磁盘读写操作。这种方法需要定期地(一般是当内存缓冲区耗尽时)将内存中的倒排索引和磁盘上的倒排索引合并。
第一种更新方法重新扫描文档集建立新的索引以替换旧的索引,是更新索引最简单直接的方法,这种方法称为索引重建(Re瞓uild)。这种方法的实现最简单,适合于数据更新周期较长、对检索实时性要求不高的场景中。但是对于持续不断有新文档增加(如通用搜索引擎中采集器不断采集到的新网页)的场景,不但会导致频繁的磁盘读写,而且会有频繁的索引切换,对检索器来说就有点捉襟见肘了。
第二种更新方法是单独更新每条倒排链,称为原地索引更新方法(In瞤lace)。由于每个词的倒排链大小差异非常大,预先为每条倒排链分配多余的空间不但算法非常复杂,而且仍可能导致频繁的磁盘复制操作。
因此,这里采用第三种方法,这种方法是将内存索引和磁盘索引归并排序,形成新的磁盘索引,称为立即合并策略或再合并策略(Re瞞erge)。这种方法不仅提高了新索引的构建效率,而且大大减少了磁盘读写、磁盘复制操作。这种方法分为两步: 第一步是在内存中缓存索引,这里需要确定缓存的大小以及缓存写入磁盘的时机;第二步是索引归并,这一步需要根据应用场景选择合适的归并策略。
5.3.6数据库检索
针对数据库中的数据,索引器首先需要从数据库中读出数据,然后转换成适用于索引器的数据格式,最后对转换的数据建立索引。根据检索结果的呈现需求,将需要返回的字段内容存储到索引目录下。
ADO(ActiveX Data Objects)是基于组件的数据库编程接口,它是一个和编程语言无关的COM组件系统。通过ADO访问数据库的通常方法如下。
(1) 创建一个到数据库的ADO连接。
(2) 打开数据库连接。
(3) 创建ADO记录集Recordset。
(4) 从记录集读取需要的数据。
(5) 关闭记录集。
(6) 关闭连接。
ADO Connection对象用于创建一个到达某个数据源的开放连接。通过此连接,用户可以对数据库进行访问和操作。如果需要多次访问某个数据库,应使用Connection对象来建立一个连接。也可以由Command或Recordset对象传递一个连接字符串来创建某个连接。其主要的方法如下。HRESULT CreateInstance();
//创建一个到数据库的ADO连接
HRESULT Open(_bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options);
//打开数据库连接。第一个参数为数据库连接字符串ADO Recordset 对象用于容纳一个来自数据库表的记录集。一个 Recordset 对象由记录和列(字段)组成。在 ADO 中,此对象是最重要且最常用于对数据库的数据进行操作的对象。其主要的属性和方法如下。_variant_t GetCollect ( const _variant_t & Index );
//从当前记录中返回一个字段,字段名作为参数传入,返回结果存放到_variant_t变量中
HRESULT CreateInstance(__uuidof(Recordset);
//创建一个结果集实例
HRESULT Open(const _variant_t & Source, const _variant_t & ActiveConnection, enum CursorTypeEnum, enum LockTypeEnum LockType, long Options);
//执行一条SQL语句,并将结果保存到创建的实例中
adoEOF;
//表示结果集记录指针是否移到最后
HRESULT MoveNext();
//记录指针移到下一个记录
HRESULT Close();
//关闭通过Open打开的结果集实例通过以上两个ADO对象,就可以从数据库中读取出所需要的记录及其内容。读取出来的记录内容需要转换成字符串格式,才能调用检索内核建立索引。这其中需要注意的是BLOB类型的转换,由于使用SafeArrayAccessData转换得到的字符串是从堆中申请的,所以在使用完该字符串后需要调用SafeArrayUnaccessData函数释放内存,否则将会造成大量的内存泄露。
在建立数据库连接时,另一个关键的问题是数据的查询方式,即SQL语句的书写方式。由于使用的ADO访问数据库的方式不是一次性从数据库中读取出所有记录(如果一次性读取,在数据库中数据量非常大的情况下,会导致内存耗尽),而ADO默认的方式是每次读取一定数量的结果放到缓存中,当需要的记录不在缓存中时,需要从数据库中读取。由于ADO的缓存机制不适合于上文所述的应用场景,所以在查询时采用合适的分页机制是十分必要的。















