现代信息检索0112893黄星鹏.docx
《现代信息检索0112893黄星鹏.docx》由会员分享,可在线阅读,更多相关《现代信息检索0112893黄星鹏.docx(12页珍藏版)》请在冰豆网上搜索。
现代信息检索0112893黄星鹏
现代信息检索大作业
项目名称:
倒排索引构建
姓名:
黄星鹏学号:
0112893
合作者:
姓名:
邱屹学号:
0112898
姓名:
许智超学号:
0112877
完成时间2013年12月14日
目录
1引言-1-
1.1倒排索引简介-1-
1.11Lucene倒排索引原理-1-
1.12索引的研究状况和发展趋势-4-
1.2本文的主要工作-5-
1.3论文的结构安排-5-
2相关工作及理论基础-5-
2.1特征项的权值计算-5-
2.11.常用的特征项权值计算方法-6-
2.12 多重因子加权的特征项权值计算方法-6-
3本文所做的工作-7-
3.1逆文档频率的概念-7-
3.2逆文档频率的作用-8-
3.2.1TF-IDF的概念-8-
3.2.2TFIDF的理论-9-
3.2.3TFIDF权重计算-10-
3.3逆文档频率计算-11-
3.4实验过程-11-
4结束语-14-
参考文献-15-
1引言
1.1倒排索引简介
倒排索引源于实际应用中需要根据属性的值来查找记录。
这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。
由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(invertedindex)。
带有倒排索引的文件我们称为“倒排索引文件”,简称“倒排文件”(invertedfile)。
1.11Lucene倒排索引原理
Lucene是一个高性能的java全文检索工具包,它使用的是倒排文件索引结构。
该结构及相应的生成算法如下:
设有两篇文章1和2
文章1的内容为:
TomlivesinGuangzhou,IliveinGuangzhoutoo.
文章2的内容为:
HeoncelivedinShanghai.
由于lucene是基于关键词索引和查询的,首先我们要取得这两篇文章的关键词,通常我们需要如下处理措施
a.我们现在有的是文章内容,即一个字符串,我们先要找出字符串中的所有单词,即分词。
英文单词由于用空格分隔,比较好处理。
中文单词间是连在一起的需要特殊的分词处理。
b.文章中的”in”,“once”“too”等词没有什么实际意义,中文中的“的”“是”等字通常也无具体含义,这些不代表概念的词可以过滤掉
c.用户通常希望查“He”时能把含“he”,“HE”的文章也找出来,所以所有单词需要统一大小写。
d.用户通常希望查“live”时能把含“lives”,“lived”的文章也找出来,所以需要把“lives”,“lived”还原成“live”
e.文章中的标点符号通常不表示某种概念,也可以过滤掉
在lucene中以上措施由Analyzer类完成
经过上面处理后
文章1的所有关键词为:
[tom][live][guangzhou][i][live][guangzhou]
文章2的所有关键词为:
[he][live][shanghai]
有了关键词后,我们就可以建立倒排索引了。
上面的对应关系是:
“文章号”对“文章中所有关键词”。
倒排索引把这个关系倒过来,变成:
“关键词”对“拥有该关键词的所有文章号”。
文章1,2经过倒排后变成:
关键词文章号
guangzhou1
he2
i1
live1,2
shanghai2
tom1
通常仅知道关键词在哪些文章中出现还不够,我们还需要知道关键词在文章中出现次数和出现的位置,通常有两种位置:
a)字符位置,即记录该词是文章中第几个字符(优点是关键词亮显时定位快);b)关键词位置,即记录该词是文章中第几个关键词(优点是节约索引空间、词组(phase)查询快),lucene中记录的就是这种位置。
加上“出现频率”和“出现位置”信息后,我们的索引结构变为:
关键词文章号[出现频率]出现位置
guangzhou1[2]3,6
he2[1]1
i1[1]4
live1[2],2[1]2,5,2
shanghai2[1]3
tom1[1]1
以live这行为例我们说明一下该结构:
live在文章1中出现了2次,文章2中出现了一次,它的出现位置为“2,5,2”这表示什么呢?
我们需要结合文章号和出现频率来分析,文章1中出现了2次,那么“2,5”就表示live在文章1中出现的两个位置,文章2中出现了一次,剩下的“2”就表示live是文章2中第2个关键字。
以上就是lucene索引结构中最核心的部分。
我们注意到关键字是按字符顺序排列的(lucene没有使用B树结构),因此lucene可以用二元搜索算法快速定位关键词。
实现时lucene将上面三列分别作为词典文件(TermDictionary)、频率文件(frequencies)、位置文件(positions)保存。
其中词典文件不仅保存有每个关键词,还保留了指向频率文件和位置文件的指针,通过指针可以找到该关键字的频率信息和位置信息。
Lucene中使用了field的概念,用于表达信息所在位置(如标题中,文章中,url中),在建索引中,该field信息也记录在词典文件中,每个关键词都有一个field信息(因为每个关键字一定属于一个或多个field)。
为了减小索引文件的大小,Lucene对索引还使用了压缩技术。
首先,对词典文件中的关键词进行了压缩,关键词压缩为<前缀长度,后缀>,例如:
当前词为“阿拉伯语”,上一个词为“阿拉伯”,那么“阿拉伯语”压缩为<3,语>。
其次大量用到的是对数字的压缩,数字只保存与上一个值的差值(这样可以减小数字的长度,进而减少保存该数字需要的字节数)。
例如当前文章号是16389(不压缩要用3个字节保存),上一文章号是16382,压缩后保存7(只用一个字节)。
下面我们可以通过对该索引的查询来解释一下为什么要建立索引。
假设要查询单词“live”,lucene先对词典二元查找、找到该词,通过指向频率文件的指针读出所有文章号,然后返回结果。
词典通常非常小,因而,整个过程的时间是毫秒级的。
而用普通的顺序匹配算法,不建索引,而是对所有文章的内容进行字符串匹配,这个过程将会相当缓慢,当文章数目很大时,时间往往是无法忍受的。
1.12索引的研究状况和发展趋势
第一,国内内容索引的研究注重对传统文献的索引理论的研究,而国外更加注重网络环境下现代索引技术的研究,但总体来讲,对网络信息的标引正日益成为国内外内容索引研究的热点问题。
长期以来,图书内容索引在西方受到广泛的重视,西文著作从19世纪末、日文著作从20世纪初便开始普遍重视编制书后内容索引的工作,前50年有内容索引的图书占的比率尚略有起伏,进入50年代后呈逐年稳定上升的态势,从70年代起即超过了全部图书的90%,由此可见国外文献中内容索引的应用已经相当普遍,因此,对传统文献内容索引的研究较少,更注重对现代化的索引研究,主要集中在网路环境中内容索引的应用。
相比较而言我国书末索引工作开始较晚,一直以来都有学者撰文指出我国书末索引的落后现状,希望能改变国内文献内容索引的落后面貌,但是,对内容索引的研究并没有形成一个较为全面的研究体系,无论是对内容索引的类型、功能、编制还是评价标准等,都只是零散的研究,并不全面。
但是通过比较国内外的研究主题我们也可以发现,国内外对内容索引的研究越来越集中于对现代索引技术的研究。
第二,内容索引研究对象越来越多。
国内对内容索引的研究从古籍和工具书的内容索引扩展到图书、期刊、论文等的内容索引,而随着网络技术的发展,内容索引逐渐应用到图片、视频等多媒体资源的组织与利用上。
相比较而言,国外对传统文献方面的内容索引研究并不多,主要以电子资源为主,早期主要是对文本和期刊的研究,后来逐渐发展到对网络环境中信息资源的组织和利用,主要也是对图片与视频等多媒体资源进行组织利用,并且其研究对象有逐渐扩大的趋势。
第三,内容索引的应用范围越来越广。
国内内容索引主要集中于图书馆、出版社和计算机等领域,主要用于文献信息的组织和利用,相比较而言,国外内容索引应用的范围更加广泛,内容索引不仅应用于学术出版、评价、计量,还不断适应当前网络环境的发展,用于搜索引擎、数据库、web2.0、多媒体资源等领域的信息检索和信息组织,并且在电子商务、电子政务等领域也有所发展。
从最近几年关于内容索引的研究我们可以看出,内容索引的应用范围已经越来越广,而信息检索将依旧是内容所以研究的热点问题。
第四,内容索引的研究视角越来越多元化。
除了传统的索引理论角度之外,对索引研究的过程中还注重引入新的理论与方法,如语义、知识地图、标签、元数据、文献计量、网络计量等理论和方法,为索引理论和方法的研究带来新的视角。
1.2本文的主要工作
本文主要工作是深入理解什么是逆文档频率idf,以及逆文档频率的作用,逆文档频率对于构建倒排所用的意义,以及逆文档频率的计算方法。
1.3论文的结构安排
本论文的结构安排是:
第一部分:
什么是倒排索引,以及倒排索引在国内外的研究现状及发展趋势;
第二部分:
为了深入理解和更好地构建倒排索引,我们查阅了许多资料,在该部分总结所查阅资料的要点;
第三部分:
介绍本文在构建倒排索引中所做的主要工作;
第四部分:
结束语,总结工作,展望未来。
2相关工作及理论基础
2.1特征项的权值计算
通过文本的预处理,文档就可以表示为一个词集,
也称为特征项集。
但作为一个有效的文本内容的特征表示词集,必须具备以下两个特征:
①完全性。
特征词能够确实标识文本内容;②区分性。
特征词将目标文本与其他文本相区分的能力。
特征词是组成文本的基本元素。
通常根据词条在文件中是否出现、出现频率或者其他重要性度量等综合因素,给其赋予一定的权重,可以提取一定数目的权重较大的词条作为文本的特征表示。
对于某个特征词,长文档中的TF会比在短文档中大。
为了避免这种影响,往往会对TF进行标准化处理。
下面是比较常见的一种标准化处理过的传统TFIDF公式:
wik=tfikmaxi{tfik}×log(1+Nnk)
其中,wik表示文档i中第k维的向量值,tfik表示文档i中第k个特征项的TF值,maxi{tfik}表示文档i中所有特征项中TF的最大值,N表示文本集的文档数,nk表示文本集中出现该特征项的文本数对TF进行对数处理也是比较常见的一种标准化方法:
wik=logtfik×idfik=log(1+Nnk)
2.11.常用的特征项权值计算方法
目前,常用的权值计算方法有以下几类:
①布尔函数:
wi(d)=1,tfi(d)≥10,tfi(d)=0
②平方根函数:
wi(d)=tfi(d)
③对数函:
wi(d)=log(tfi(d)+1)
⑤TFIDF函数:
wi(d)=tfi(d)×log(N)
其中,N为所有文档的数目,ni为文本集中出现特征项ti的文档数目,tfi表示文本d中出现ti的次数。
2.12 多重因子加权的特征项权值计算方法
布尔函数是通过0和1两个值来指示一个单词是否出现在一个文本当中。
这种计算方法忽略了不同单词对一个文本的重要程度,认为所有出现的单词对一个文本来说同等重要的,然而很显然的是:
不同的单词对一个文本来说其重要性是不一样的。
平方根函数和对数函数指的是一个单词在一个文本中出现的次数,通常情况下,对于一个文本来说,如果一个单词在这个文本中出现得非常多,那么它就非常可能与这个文本的主题密切相关,所以重要性就很高;反之,重要性就很低。
TFIDF既考虑了单词在一个文本中出现的次数,又考虑了单词在整个文本数据集中出现的频率。
但是,仅仅凭词频是不能反映词语在文本中出现的重要程度,有的词在文本中出现的次数很多,它可能与文本的主题无关。
因此,文章从词语的出现频率和语义两个角度来考虑,提出了多重因子加权的特征项权值计算方法。
3本文所做的工作
3.1逆文档频率的概念
(IDFinversedocumentfrequency)又称反文档频率,是文档频率(DFdocumentfrequency)的倒数主要用于概念TF-IDF(termfrequency–inversedocumentfrequency)中。
TF-IDF(termfrequency–inversedocumentfrequency)是一种用于资讯检索与资讯探勘的常用加权术。
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
TF-IDF加权的各种形式常被搜寻引擎应用,作为文件与用户查询之间相关程度的度量或评级。
除了TF-IDF以外,因特网上的搜寻引擎还会使用基于连结分析的评级方法,以确定文件在搜寻结果中出现的顺序。
TFIDF的主要思想是:
如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
TFIDF实际上是:
TF*IDF,TF词频(TermFrequency),IDF反文档频率(InverseDocumentFrequency)。
TF表示词条在文档d中出现的频率。
IDF的主要思想是:
如果包含词条t的文档越少,也就是n越小,IDF越大,则说明词条t具有很好的类别区分能力。
如果某一类文档C中包含词条t的文档数为m,而其它类包含t的文档总数为k,显然所有包含t的文档数n=m+k,当m大的时候,n也大,按照IDF公式得到的IDF的值会小,就说明该词条t类别区分能力不强。
但是实际上,如果一个词条在一个类的文档中频繁出现,则说明该词条能够很好代表这个类的文本的特征,这样的词条应该给它们赋予较高的权重,并选来作为该类文本的特征词以区别与其它类文档。
这就是IDF的不足之处。
3.2逆文档频率的作用
TF-IDF(termfrequency–inversedocumentfrequency)是一种用于资讯检索与资讯探勘的常用加权术。
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
TF-IDF加权的各种形式常被搜寻引擎应用,作为文件与用户查询之间相关程度的度量或评级。
除了TF-IDF以外,因特网上的搜寻引擎还会使用基于连结分析的评级方法,以确定文件在搜寻结果中出现的顺序。
TFIDF的主要思想是:
如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
TFIDF实际上是:
TF*IDF,TF词频(TermFrequency),IDF反文档频率(InverseDocumentFrequency)。
TF表示词条在文档d中出现的频率。
IDF的主要思想是:
如果包含词条t的文档越少,也就是n越小,IDF越大,则说明词条t具有很好的类别区分能力。
如果某一类文档C中包含词条t的文档数为m,而其它类包含t的文档总数为k,显然所有包含t的文档数n=m+k,当m大的时候,n也大,按照IDF公式得到的IDF的值会小,就说明该词条t类别区分能力不强。
但是实际上,如果一个词条在一个类的文档中频繁出现,则说明该词条能够很好代表这个类的文本的特征,这样的词条应该给它们赋予较高的权重,并选来作为该类文本的特征词以区别与其它类文档。
这就是IDF的不足之处。
3.2.1TF-IDF的概念
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。
除了TF-IDF以外,因特网上的搜索引擎还会使用基于链接分析的评级方法,以确定文件在搜寻结果中出现的顺序。
有很多不同的数学公式可以用来计算TF-IDF。
这边的例子以上述的数学公式来计算。
词频(TF)是一词语出现的次数除以该文件的总词语数。
假如一篇文件的总词语数是100个,而词语“母牛”出现了3次,那么“母牛”一词在该文件中的词频就是3/100=0.03。
一个计算文件频率(IDF)的方法是测定有多少份文件出现过“母牛”一词,然后除以文件集里包含的文件总数。
所以,如果“母牛”一词在1,000份文件出现过,而文件总数是10,000,000份的话,其逆向文件频率就是lg(10,000,000/1,000)=4。
最后的TF-IDF的分数为0.03*4=0.12。
3.2.2TFIDF的理论
TFIDF算法是建立在这样一个假设之上的:
对区别文档最有意义的词语应该是那些在文档中出现频率高,而在整个文档集合的其他文档中出现频率少的词语,所以如果特征空间坐标系取TF词频作为测度,就可以体现同类文本的特点。
另外考虑到单词区别不同类别的能力,TFIDF法认为一个单词出现的文本频数越小,它区别不同类别文本的能力就越大。
因此引入了逆文本频度IDF的概念,以TF和IDF的乘积作为特征空间坐标系的取值测度,并用它完成对权值TF的调整,调整权值的目的在于突出重要单词,抑制次要单词。
但是在本质上IDF是一种试图抑制噪音的加权,并且单纯地认为文本频数小的单词就越重要,文本频数大的单词就越无用,显然这并不是完全正确的。
IDF的简单结构并不能有效地反映单词的重要程度和特征词的分布情况,使其无法很好地完成对权值调整的功能,所以TFIDF法的精度并不是很高。
此外,在TFIDF算法中并没有体现出单词的位置信息,对于Web文档而言,权重的计算方法应该体现出HTML的结构特征。
特征词在不同的标记符中对文章内容的反映程度不同,其权重的计算方法也应不同。
因此应该对于处于网页不同位置的特征词分别赋予不同的系数,然后乘以特征词的词频,以提高文本表示的效果。
当前,真正在搜索引擎等实际应用中广泛使用的是tf-idf模型。
tf-idf模型的主要思想是:
如果词w在一篇文档d中出现的频率高,并且在其他文档中很少出现,则认为词w具有很好的区分能力,适合用来把文章d和其他文章区分开来。
TF-IDF模型是搜索引擎等实际应用中被广泛使用的信息检索模型,但对于TF-IDF模型一直存在各种疑问。
本文为信息检索问题一种基于条件概率的盒子小球模型,其核心思想是把“查询串q和文档d的匹配度问题”转化为“查询串q来自于文档d的条件概率问题”。
它从概率的视角为信息检索问题定义了比TF-IDF模型所表达的匹配度更为清晰的目标。
此模型可将TF-IDF模型纳入其中,一方面解释其合理性,另一方面也发现了其不完善之处。
另外,此模型还可以解释PageRank的意义,以及PageRank权重和TF-IDF权重之间为什么是乘积关系。
Tf-idf算法流程图
3.2.3TFIDF权重计算
传统的TFIDF权重计算方法是由Salton在1988年提出的。
指导思想是:
在同一个文本中出现的频率较高,在不同文本中出现的频率较小的词应该赋予较高的权值。
它主要考虑两个方面:
词语在文本中出现的频率(TF),用于计算该词描述文档内容的能力;反文档频率(IDF),用于计算该词区分文档的能力。
特征词条的权值与词条频率成正比,与文档频率成反比。
3.3逆文档频率计算
假定所有文档数目为N,文档频率为dft,IDF的计算方法为:
idft=log(N/dft)
3.4实验过程
在本次实验中,我主要做的是遍历整个倒排文件,输入到txt文档里的过程。
voidinvertList_traverse(invertList*iL){
FILE*fp1;
if((fp1=fopen("result.txt","w"))==NULL){
printf("Error!
");
exit
(1);
}
//while(p->next!
=NULL){
//p=p->next;
//}
//CFilecFile("MyFile.dat",CFile:
:
modeReadWrite);
wordList*wL;
invertList*i;
intn=1;
i=iL->nextInvt;
printf("单词的倒排结构显示如下:
\n");
printf("单词编号");
printf("单词");
printf("文件数");
printf("文档编号权重\n");
fprintf(fp1,"单词的倒排结构显示如下:
\n");
fprintf(fp1,"单词编号");
fprintf(fp1,"单词");
fprintf(fp1,"文件数");
fprintf(fp1,"文档编号权重\n");
while(i!
=NULL){
printf("%-6d",n);
printf("%-20s",i->letter);
printf("%-6d",i->files);
//fwrite(&n,LEN,1,fp1);
//fwrite(&i->letter,LEN,1,fp1);
//fwrite(&i->files,LEN,1,fp1);
fprintf(fp1,"%-8d",n++);
fprintf(fp1,"%-22s",i->letter);
fprintf(fp1,"%-8d",i->files);
//printf("--->");
wL=i->nextWord;
fprintf(fp1,"{");
printf("{");
//fprintf(fp1,sizeof(invertNode),1,fp1);
//cFile.Write(i,sizeof(invertList));
while(wL!
=NULL){
printf("(");
printf("%3d,",wL->fileID);
printf("%-6.3f",wL->weight);
printf(")");
fprintf(fp1,"(");
fprintf(fp1,"%-3d",wL->fileID);
fprintf(fp1,"%-6.3f,",wL->weight);
fprintf(fp1,")");
wL=wL->next;
}
printf("}\n");
fprintf(fp1,"}\n");
i=i->nextInvt;
}
fclose(fp1);
}
floatcalculate_weight(floatfiles,floatwords){
floattf,df;
floatidf;
//floatN;
floattf_idf;
tf=words;
df=files;
idf=log10(700/df);
tf_idf=tf*idf;
returntf_idf;
}
4结束语
我们目前面临的是一