可见,n越大时,表示这个单词w与C的关系越大,而n小于1时,则与论文本身关系较大。可以看出,极端的情况,当n为0时,则w只与原论文有关系了,与我们获得的那些评价都没有关系了,因此获得的句子实际上对其他论文也没有什么影响了。因此,对于本实验,应当将n设置的越大越好。 4.3算法的实现 具体实现算法时,会出现一些问题:我们假设一篇论文可以划分成1000个句子,每个句子有20个不同单词,我们总共有2000篇论文,那就有4亿个单词。那么,对于每一个句子s,我们在进行上面的算法时,需要进行如下一步 这就需要对这4亿个单词进行遍历一遍,并且分别计算括号中的那一步。而每篇论文有1000个句子,就相当于要计算4000亿次,这个计算量对我们来说太庞大了,因此,我在这里选取了一个简便一点的方法,就是在上面的一步时,并不是对整个单词空间进行计算,而只是对论文d和评论集合C中出现的所有单词进行遍历计算打分。 可以看出,对于一个既不在d中又不在C中的单词, = 0.对结果也没有影响。因此,上面的公式只是理论的公式,具体应用时,只需要对d和C中出现的单词进行计算即可,这就节省了大量的计算量。整个流程如图表 3,需要用到图表 2中的前三步算法获得的评论列表。这里之所以不用图表 2的最终结果,是因为我们需要更多的信息,信息越多,获得的概括越具有影响力。 图表 4.4获得基于影响的概括 通过上面的模型,可以对A中的每个句子进行打分,然后根据所得分数进行从大到小排序。这里因为每篇论文只有1000左右的句子,数量级并不是很大,就自己写了一个简单的冒泡排序算法来排序。之后,选择其中得分最高的k个句子,组合在一起,就获得了原文基于影响的概括了。从整个建模的过程中也可以看出,所谓基于影响,就是通过那些对A进行评价的句子集C,分别获得Si与这些句子的相似程度,与其相似程度最高的,证明这个句子被其他作者提及的最多,影响最大。而这个概括与摘要的区别就是,影响较大的句子,可能原来的作者并没有想到,因此在摘要中并没有提及(正所谓无心插柳柳成荫);而摘要中提及的部分,影响可能反而没有那么大。 图表 3
第5章 搭建搜索引擎 本章内容主要介绍如何利用PARADISE搜索引擎平台来搭建我们的论文检索系统。通过这段内容,我们可以了解到PARADISE使用的基本过程,最终我们会发现,如果想搭建其他方向的搜索引擎,使用PARADISE也是非常方便的。 5.1 PARADISE结构简介 PARADISE系统,全称是Platform for Applying, Researching And Developing Intelligent Search Engine, 是网络实验室搜索引擎组耗时一年多在一个国家863项目支持下开发的,其目的是建立一个搜索引擎平台,将搜索引擎的各个部分模块化,使得这个搜索引擎不只针对专一的某一个领域,而是可以针对各个领域。其功能有点类似于Lucene系统,与其不同的是PARADISE是用C++编写的。PARADISE有以下几大的模块,见表格 3。 表格 3 analysis index search front_evidence (1)analysis是预处理模块,用于对网页进行去噪、消重以及编码转换等处理,如果是针对paper的pdf转换后的text文件建立索引,这一步骤就可以省略了。 (2)index是索引模块,用于将需要检索的部分建立倒排索引。具体如何使用5.2会提到。 (3)search是搜索模块,将index建成之后,就可以利用index数据开启搜索服务,对于每一个词,去倒排索引里面查找包含它的文档id号(网页中为url),从而完成检索。 (4)front_evidence是前台模块,完成一个类似于天网搜索引擎的前台界面。除了显示结果之外,还进行摘要处理。这个地方需要注意的就是与index部分有一定的结合,会在后面提到。
除了以上4个大的模块之外,PARADISE还提供了很多可供选择以及继承修改的小模块。 例如,在search的语言模型这个部分,可以选择需要的模型,也可以自己重写一些语言模型。压缩的时候,可以选择vint、pfordelta等等各种压缩算法PARADISE系统接口设计得非常好,当需要对上面任何一个模块进行修改时,不需要修改源代码,只需要自己重写一些继承的类就可以了。
5.2修改索引部分 对于本次的文献检索部分,只需要继承一个索引部分的类就可以了,具体代码如下(这里只贴出最关键的两端代码,中间还省略了一些代码),其中黄色背景的是需要我们修改的部分。 void main(){ Analyzer* analyzer = new NaiveAnalyzer(); compressorFactory = new PForDeltaCompressorFactory(); IndexWriter * writer = new IndexWriter(fsdir, analyzer, compressorFactory); writer->setMergeThreshold(mergesize); PDFParser parser; if (begin != 0) { while (begin > 0) { parser.hasNext(); begin--;}} int doc_id = 1; Timer t; while (parser.hasNext()) { shared_ptr<paradise::PDFContent> pContent = parser.getContent(); addDocument(pContent, writer, doc_id); if (num >= 0 && doc_id >= num) { break;}} } 在上面的这段代码中,可以看出,首先建立了一个分析模块,然后选择压缩方式为pfordata,然后建立一个IndexWriter,这个是建立索引的类。而我们需要做的事情,就是: 重写一个Parser类,这里的名称为PDFParser,这个parser需要有hasNext,getContent这两个函数即可。 重写一个Content类,里面存有所需要建立索引的document的内容,由上面的getContent类返回。 重写addDocument函数,如下,其中关键部分用黄色背景标注。 int addDocument(shared_ptr<paradise::PDFContent> pContent, IndexWriter* pWriter, int & doc_id) { paradise::index::document::Document document; 首页 上一页 1 2 3 4 5 6 下一页 尾页 4/6/6 相关论文
首页 上一页 1 2 3 4 5 6 下一页 尾页 4/6/6