1、XXXX大学信息工程与自动化学院学生实验报告课程名称:信息检索与搜索引擎技术 实验项目名称倒排索引、正排索引指导教师教师评语 教师签名: 年 月 日一、上机目的及内容1.上机目的熟悉索引的作用和重要性;熟悉正排索引和倒排索引及其建立;2.上机内容对 Doc1:清华/大学/清华/主页 Doc2:世纪/清华 Doc3:北京/大学建立正排索引和倒排索引二、实验环境 Windows操作系统 PC机一台,MyEclipse 三、 实验原理 将词项集合建立成为倒排索引的过程分为两个步骤:首先要将文本词项集合处理成正排索引,在建立正排索引的时候把词项列表的结构建立起来;然后再有正排索引建立成倒排索引.正排索
2、引的建立方法:1. 顺序扫描集合中的词项.2. 当遇到在文档中第一次出现的词项时,要更新词项表,如果词项列表中已近含有这个词,则把改词的DF加1,否则添加这个词项,置DF为1.3. 然后处理词项,生成词项的出现记录信息,插入到对应词项的Hit List中。正排索引建立完成之后,依照索引中的WordID 为单位,将DocID进行填充,然后按照WordID对所有单位进行从小到大的排序,就可以得到基本的倒排索引。要得到由WordID为键值的索引项,只需要再将WordID和DocID的存贮位置互换,并按照WordID进行归并即可。最后再将词项列表中的Pointer指针置为指向对应词项的索引项存储地址。
3、这样得到的索引就可以用来进行检索了。四、 实验记录package com.liu.suoyin;import java.util.*;public class Suoyin public static void main(String args) Zhengpai zp=suoyin();daopai(zp);public static Zhengpai suoyin()String doc =清华,大学,清华,主页,世纪,清华,北京,大学;List cixiang=new ArrayList();List jilu=new ArrayList();for(int i=0;idoc.lengt
4、h;i+)for(int j=0;jdoci.length;j+)if(cixiang.size()=0)Cixiang ci=new Cixiang();ci.worldID=0;ci.term=docij;ci.DF=1;ci.doc=i;cixiang.add(ci);Jilu jl=new Jilu();jl.docID=i;jl.wordID=0;jl.NoOfHit=1;jl.HitLise.add(j);jilu.add(jl);elseint k;for(k=0;k-1;m-)if(ci.doc=jilu.get(jilu.size()-1).docID & ci.worldI
5、D=jilu.get(m).wordID)Jilu jl=jilu.get(m);jl.HitLise.add(j);jl.NoOfHit+;jilu.set(m,jl);break;if(m=0)Jilu jl=new Jilu();jl.docID=i;jl.wordID=ci.worldID;jl.NoOfHit=1;jl.HitLise.add(j);jilu.add(jl);break;if(k=(cixiang.size()Cixiang ci=new Cixiang();ci.worldID=cixiang.size();ci.term=docij;ci.DF=1;cixiang
6、.add(ci);Jilu jl=new Jilu();jl.docID=i;jl.wordID=ci.worldID;jl.NoOfHit=1;jl.HitLise.add(j);jilu.add(jl);System.out.println(worldID Term DF);for(int l=0;lcixiang.size();l+)System.out.print(Cixiang)cixiang.get(l).worldID+t);System.out.print(Cixiang)cixiang.get(l).term+t);System.out.println(Cixiang)cix
7、iang.get(l).DF);System.out.println();System.out.println(DocID WorldID No.ofHit Hitlist);for(int l=0;ljilu.size();l+)System.out.print(doc+(1+(Jilu)jilu.get(l).docID)+t);System.out.print(Jilu)jilu.get(l).wordID+t);System.out.print(Jilu)jilu.get(l).NoOfHit+t );for(int m=0;m(Jilu)jilu.get(l).HitLise.siz
8、e();m+)System.out.print( (int)(Jilu)jilu.get(l).HitLise.get(m)+ );System.out.println();Zhengpai zhengpai=new Zhengpai();zhengpai.cixiang=cixiang;zhengpai.jilu=jilu;return zhengpai;public static void daopai(Zhengpai zp)List cixiang=new ArrayList();List jilu=new ArrayList();for(int i=0;izp.cixiang.siz
9、e();i+)Cixiang ci=zp.cixiang.get(i);for(int j=0;jzp.jilu.size();j+)if(i=zp.jilu.get(j).wordID)jilu.add(zp.jilu.get(j);cixiang.add(ci);for(int i=0;icixiang.size();i+)int k=0;for(int j=0;jjilu.size();j+)if(i=jilu.get(j).wordID)if(cixiang.get(i).pointer0=-1)cixiang.get(i).pointer0=j;k=j;cixiang.get(i).
10、pointer1=k;System.out.println();System.out.println(worldID Term DF pointer);for(int l=0;lcixiang.size();l+)System.out.print(Cixiang)cixiang.get(l).worldID+t);System.out.print(Cixiang)cixiang.get(l).term+t);System.out.print(Cixiang)cixiang.get(l).DF+ );System.out.println(Cixiang)cixiang.get(l).pointe
11、r0+,+(Cixiang)cixiang.get(l).pointer1);System.out.println(nWorldID DocID No.ofHit Hitlist);for(int l=0;ljilu.size();l+)System.out.print(Jilu)jilu.get(l).wordID+t);System.out.print(doc+(1+(Jilu)jilu.get(l).docID)+t);System.out.print(Jilu)jilu.get(l).NoOfHit+t );for(int m=0;m(Jilu)jilu.get(l).HitLise.
12、size();m+)System.out.print( (int)(Jilu)jilu.get(l).HitLise.get(m)+ );System.out.println();class Cixiangint worldID;String term;int DF;int doc;int pointer=-1,-1;class ZhengpaiList cixiang=new ArrayList();List jilu=new ArrayList();class Jiluint docID;int wordID;int NoOfHit;List HitLise=new ArrayList();运行结果:a. 正排索引b. 倒排索引四、实验总结倒排索引源于实际应用中需要根据属性的值来查找记录。倒排索引不是由记录来确定属性值,而是由属性值来确定记录的位置的。-6-