信息检索与搜索引擎技术实验向量空间模型.docx
《信息检索与搜索引擎技术实验向量空间模型.docx》由会员分享,可在线阅读,更多相关《信息检索与搜索引擎技术实验向量空间模型.docx(17页珍藏版)》请在冰点文库上搜索。
![信息检索与搜索引擎技术实验向量空间模型.docx](https://file1.bingdoc.com/fileroot1/2023-5/10/6624887c-f8d8-48cf-95f1-d340f7dc1127/6624887c-f8d8-48cf-95f1-d340f7dc11271.gif)
信息检索与搜索引擎技术实验向量空间模型
昆明理工大学信息工程与自动化学院学生实验报告
(2014—2015学年第1学期)
课程名称:
信息检索与搜索引擎技术开课实验室:
信自楼4452014年12月23日
年级、专业、班
计科111
学号
2
姓名
成绩
实验项目名称
向量空间模型
指导教师
李卫疆
教师评语
该同学是否了解实验原理:
A.了解□B.基本了解□C.不了解□
该同学的实验能力:
A.强□B.中等□C.差□
该同学的实验是否达到要求:
A.达到□B.基本达到□C.未达到□
实验报告是否规范:
A.规范□B.基本规范□C.不规范□
实验过程是否详细记录:
A.详细□B.一般□C.没有□
教师签名:
年月日
一、上机目的及内容:
给定文档语料:
d1:
北京安立文高新技术公司
d2:
新一代的网络访问技术
d3:
北京卫星网络有限公司
d4:
是最先进的总线技术。
。
。
d5:
北京升平卫星技术有限公司的新技术有。
。
。
设计一个针对这些文档的信息检索系统。
具体要求是:
1)给出系统的有效词汇集合(说明取舍原因)。
2)写出d1和d2在VSM中的表示(使用tf*idf,写出各项的数字表达式,具体数值不必实际计算出来)。
3)画出系统的倒排文件示意图。
4)按照向量夹角的余弦计算公式,给出针对查询“技术的公司”的前3个反馈结果。
二、实验原理
给定文档语料:
•d1:
北京安立文高新技术公司
•d2:
新一代的网络访问技术
•d3:
北京卫星网络有限公司
•d4:
是最先进的总线技术。
。
。
•d5:
北京升平卫星技术有限公司的新技术有。
。
。
设计一个针对这些文档的信息检索系统。
具体要求是:
1)给出系统的有效词汇集合(说明取舍原因)。
北京、安、立、文、高新、技术、公司、新、网络、访问、卫星、有限、先进、总线、升、平
的、是、最、有,这些词作为停用词不能加入系统的有效集合
一、代,去除后并不影响原来句子语义的表达也不能算作系统的有效集合。
2)写出d1和d2在VSM中的表示(使用tf*idf,写出各项的数字表达式,具体数值不必实际计算出来)。
得到的矩阵:
Term
d1
d2
d3
d4
d5
Term出现次数
北京
1
0
1
0
1
3
安
1
0
0
0
0
1
立
1
0
0
0
0
1
文
1
0
0
0
0
1
高新
1
0
0
0
0
1
技术
1
1
0
0
1
3
公司
1
0
1
0
1
3
新
0
1
0
0
1
2
网络
0
1
1
0
0
2
访问
0
1
0
0
0
1
卫星
0
0
1
0
1
2
有限
0
0
1
0
1
2
先进
0
0
0
1
0
1
总线
0
0
0
1
0
1
升
0
0
0
0
1
1
平
0
0
0
0
1
1
说明:
TF:
表示词项在该文档或者查询词中出现的频度。
即该词项出现次数除以该文档的长度(所有词的个数)
:
表示词项k在Di中的出现次数。
:
表示该文档的长度(所有词的个数)
IDF:
表示词项在文档集合中的重要程度。
一个词项出现的文档数越多,说明该词项的区分度越差,其在文档集合中的重要性就越低。
N:
表示集合中的文档数;
:
表示出现词项k的文档数。
d1中各词项的数字表达式
“北京”的
“安”的
“立”的
“文”的
“高新”的
“技术”的
“公司”的
d2中各词项的数字表达式:
“新”的
“网络”的
“访问”的
“技术”的
3)画出系统的倒排文件示意图。
4)按照向量夹角的余弦计算公式,给出针对查询“技术的公司”的前3个反馈结果。
该部分由代码实现。
三、实验方法、步骤
1.建立Java项目,
2.建立DocumentStruct.java类文件并编辑
3.建立TextVector.java类文件并编辑,如图4-1,图4-2所示
图4-1
图4-2
4.建立TF.java类文件并编辑,如图图4-7所示
图4-4
5.建立IDF.java类文件并编辑,如图图4-5所示
图4-5
6.建立CaculateSim.java类文件并编辑,如图4-6所示
图4-6
7.建立MainApp.java类文件并编辑,图4-7所示
图4-7
8.完成后的项目文件夹如图4-8所示
图4-8
9.运行结果如图4-9所示
1.DocumentStruct.java代码:
packageacm.model;
publicclassDocumentStruct{
publicDocumentStruct(){
this.documentID=0;
this.documentSimValue=0;
this.documentContent="None";
this.documentName="None";
}
publicDocumentStruct(intID,doublesim,Stringname,Stringcontent){
this.documentID=ID;
this.documentSimValue=sim;
this.documentName=name;
this.documentContent=content;
}
publicStringgetDocumentContent(){
returndocumentContent;
}
publicvoidsetDocumentContent(StringdocumentContent){
this.documentContent=documentContent;
}
publicStringgetDocumentName(){
returndocumentName;
}
publicvoidsetDocumentName(StringdocumentName){
this.documentName=documentName;
}
publicdoublegetDocumentSimValue(){
returndocumentSimValue;
}
publicvoidsetDocumentSimValue(doubledocumentSimValue){
this.documentSimValue=documentSimValue;
}
publicintgetDocumentID(){
returndocumentID;
}
publicvoidsetDocumentID(intdocumentID){
this.documentID=documentID;
}
publicDocumentStruct[]sortDocBySim(DocumentStruct[]docList){
DocumentStructtemp;
for(inti=0;ifor(intj=i;jif(docList[i].getDocumentSimValue()temp=docList[i];
docList[i]=docList[j];
docList[j]=temp;
}
}
}
returndocList;
}
privateStringdocumentName;
privateStringdocumentContent;
privatedoubledocumentSimValue;
privateintdocumentID;
}
2.TextVector.java代码:
packageacm.model;
publicclassTextVector{
publicTextVector(intdimension,int[]termCount,intdocumentTermCount,intdocumentCount,int[]documentContainTermCount){
vectorWeight=newdouble[dimension];
for(inti=0;ivectorWeight[i]=caculateWeight(termCount[i],documentTermCount,documentCount,documentContainTermCount[i]);
}
}
publicdoublecaculateWeight(inttermCount,intdocumentTermCount,intdocumentCount,intdocumentContainTermCount){
TFtermTF=newTF(termCount,documentTermCount);
IDFtermIDF=newIDF(documentCount,documentContainTermCount);
termTF.caculateTF();
termIDF.caculateIDF();
return(termTF.getTf()*termIDF.getIdf());
}
publicdouble[]getVectorWeight(){
returnvectorWeight;
}
publicvoidsetVectorWeight(double[]vectorWeight){
this.vectorWeight=vectorWeight;
}
privatedouble[]vectorWeight;
}
}
3.TF.java代码
packageacm.model;
publicclassTF{
publicTF(){
tf=0.0;
termCount=0;
termInDocumentCount=0;
}
publicTF(inttermCount,intdocumentTermCount){
this.tf=0.0;
this.termCount=termCount;
this.termInDocumentCount=documentTermCount;
}
publicvoidcaculateTF(){
if(termInDocumentCount==0){
System.out.println("请先设置文档总数!
");
return;
}
this.tf=(double)termCount/(double)termInDocumentCount;
}
publicdoublegetTf(){
returntf;
}
publicintgetTermCount(){
returntermCount;
}
publicvoidsetTermCount(inttermCount){
this.termCount=termCount;
}
publicintgetTermInDocumentCount(){
returntermInDocumentCount;
}
publicvoidsetTermInDocumentCount(inttermInDocumentCount){
this.termInDocumentCount=termInDocumentCount;
}
privatedoubletf;
privateinttermCount;
privateinttermInDocumentCount;
}
4.IDF.java代码
packageacm.model;
publicclassIDF{
publicIDF(){
idf=0.0;
documentContainTermCount=0;
documentCount=0;
}
publicIDF(intdocumentCount,intdocumentContainTermCount){
idf=0.0;
this.documentCount=documentCount;
this.documentContainTermCount=documentContainTermCount;
}
publicintgetDocumentCount(){
returndocumentCount;
}
publicvoidsetDocumentCount(intdocumentCount){
this.documentCount=documentCount;
}
publicintgetDocumentContainTermCount(){
returndocumentContainTermCount;
}
publicvoidsetDocumentContainTermCount(intdocumentContainTermCount){
this.documentContainTermCount=documentContainTermCount;
}
publicdoublegetIdf(){
returnidf;
}
publicvoidcaculateIDF(){
if(documentContainTermCount==0){
System.out.println("请设置文档的长度(所有词的个数)!
");
return;
}
this.idf=Math.log10((double)this.documentCount/(double)this.documentContainTermCount);
}
privatedoubleidf;
privateintdocumentCount;
privateintdocumentContainTermCount;
}
5.CaculateSim.java代码
packageacm.model;
publicclassCaculateSim{
publicCaculateSim(TextVectorvector1,TextVectorvector2){
doublesimDividend=0.0,simDivider=0.0;
doubletempVector1=0.0,tempVector2=0.0;
for(inti=0;isimDividend+=vector1.getVectorWeight()[i]*vector2.getVectorWeight()[i];
}
for(inti=0;itempVector1+=Math.pow(vector1.getVectorWeight()[i],2.0);
tempVector2+=Math.pow(vector2.getVectorWeight()[i],2.0);
simDivider=Math.sqrt((tempVector1*tempVector2));
}
this.sim=simDividend/simDivider;
}
publicdoublegetSim(){
returnsim;
}
privatedoublesim;
}
6.MainApp.java代码
packageacm.model;
publicclassMainApp{
publicstaticvoidmain(String[]args){
intTermCount[][]={{1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,0},
{1,0,0,0,0,0,1,0,1,0,1,1,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0},
{1,0,0,0,0,1,1,1,0,0,1,1,0,0,1,1},
{0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0}};
intdocumentTermCount[]={7,7,5,6,11,3};
intdocumentContainTermCount[]={3,1,1,1,1,4,4,2,2,1,2,2,1,1,1,1};
DocumentStruct[]docList=newDocumentStruct[6];
StringdocumentContent[]={"北京安立文高新技术公司",
"新一代的网络访问技术",
"北京卫星网络有限公司",
"是最先进的总线技术。
。
。
",
"北京升平卫星技术有限公司的新技术有。
。
。
",
"技术的公司"};
TextVectorqueryVector=newTextVector(16,TermCount[5],documentTermCount[5],6,documentContainTermCount);
for(inti=0;i<5;i++){
TextVectortempVector=newTextVector(16,TermCount[i],documentTermCount[i],6,documentContainTermCount);
CaculateSimtempSim=newCaculateSim(tempVector,queryVector);
DocumentStructtempDoc=newDocumentStruct(i+1,tempSim.getSim(),"文档"+(i+1),documentContent[i]);
docList[i]=tempDoc;
}
docList=docList[1].sortDocBySim(docList);
System.out.println("以\"技术的公司\"为查询关键字得到的前3个结果为:
");
for(inti=0;i<3;i++){
System.out.println((i+1)+"."+docList[i].getDocumentName()+":
"+docList[i].getDocumentContent());
}
}
}
四、实验结果、分析和结论
本次实验我学会了针对文档进行信息检索系统,向量空间模型是信息检索的一个重要方面,向量空间模型的建立能让你对信息有更好的把握,所以向量空间模型对我们以后信息检索至关重要,在编程方面我来遇到了很多的问题,这些都是在老师的帮助下完成的,在这次实验中我学到了很多。