信息检索与搜索引擎技术_实验3 倒排索引、正排索引
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
XXXX大学信息工程与自动化学院学生实验报告
课程名称:信息检索与搜索引擎技术
一、上机目的及内容
1.上机目的
熟悉索引的作用和重要性;
熟悉正排索引和倒排索引及其建立;
2.上机内容
对 Doc1:清华/大学/清华/主页 Doc2:世纪/清华 Doc3:北京/大学
建立正排索引和倒排索引
二、实验环境
Windows操作系统 PC机一台,MyEclipse
三、实验原理
将词项集合建立成为倒排索引的过程分为两个步骤:首先要将文本词项集合处理成正排索引,在建立正排索引的时候把词项列表的结构建立起来;然后再有正排索引建立成倒排索引.
正排索引的建立方法:
1.顺序扫描集合中的词项.
2.当遇到在文档中第一次出现的词项时,要更新词项表,如果词项列表中已近含有这个
词,则把改词的DF加1,否则添加这个词项,置DF为1.
3.然后处理词项,生成词项的出现记录信息,插入到对应词项的Hit List中。
正排索引建立完成之后,依照索引中的WordID 为单位,将DocID进行填充,然后按照WordID对所有单位进行从小到大的排序,就可以得到基本的倒排索引。要得到由WordID为键值的索引项,只需要再将WordID和DocID的存贮位置互换,并按照WordID进行归并即可。最后再将词项列表中的Pointer指针置为指向对应词项的索引项存储地址。这样得到的索引就可以用来进行检索了。
四、实验记录
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
List
for(int i=0;i for(int j=0;j if(cixiang.size()==0){ Cixiang ci=new Cixiang(); ci.worldID=0; ci.term=doc[i][j]; 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); }else{ int k; for(k=0;k Cixiang ci=(Cixiang)cixiang.get(k); if(ci.term.equals(doc[i][j])){ if(ci.doc!=i) ci.DF++; cixiang.set(k,ci); int m; for( m=jilu.size()-1;m>-1;m--){ if(ci.doc==jilu.get(jilu.size()-1).docID && ci.worldID==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=doc[i][j]; ci.DF=1; cixiang.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;l System.out.print(((Cixiang)cixiang.get(l)).worldID+"\t"); System.out.print(((Cixiang)cixiang.get(l)).term+"\t"); System.out.println(((Cixiang)cixiang.get(l)).DF); } System.out.println(); System.out.println("DocID WorldID No.ofHit Hitlist"); for(int l=0;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.size();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 List for(int i=0;i Cixiang ci=zp.cixiang.get(i); for(int j=0;j if(i==zp.jilu.get(j).wordID){ jilu.add(zp.jilu.get(j)); } } cixiang.add(ci); } for(int i=0;i int k=0; for(int j=0;j if(i==jilu.get(j).wordID){ if(cixiang.get(i).pointer[0]==-1){ cixiang.get(i).pointer[0]=j; } k=j; }