信息检索与搜索引擎技术实验向量空间模型-标准化文件发布号:(9456-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII昆明理工大学信息工程与自动化学院学生实验报告( 2014—2015学年第 1学期)课程名称:信息检索与搜索引擎技术开课实验室:信自楼445 2014 年12月 23日一、上机目的及内容:给定文档语料:d1: 北京安立文高新技术公司d2: 新一代的网络访问技术d3: 北京卫星网络有限公司d4: 是最先进的总线技术。
d5: 北京升平卫星技术有限公司的新技术有。
设计一个针对这些文档的信息检索系统。
具体要求是:1)给出系统的有效词汇集合(说明取舍原因)。
2)写出d1和d2在VSM中的表示(使用tf*idf,写出各项的数字表达式,具体数值不必实际计算出来)。
3)画出系统的倒排文件示意图。
4)按照向量夹角的余弦计算公式,给出针对查询“技术的公司”的前3个反馈结果。
2二、实验原理1)给出系统的有效词汇集合(说明取舍原因)。
北京、安、立、文、高新、技术、公司、新、网络、访问、卫星、有限、先进、总线、升、平的、是、最、有,这些词作为停用词不能加入系统的有效集合一、代,去除后并不影响原来句子语义的表达也不能算作系统的有效集合。
2)写出d1和d2在VSM中的表示(使用tf*idf,写出各项的数字表达式,具体数值不必实际计算出来)。
得到的矩阵:34说明:TF :表示词项在该文档或者查询词中出现的频度。
即该词项出现次数除以该文档的长度(所有词的个数):表示词项k 在D i 中的出现次数。
:表示该文档的长度(所有词的个数)IDF :表示词项在文档集合中的重要程度。
一个词项出现的文档数越多,说明该词项的区分度越差,其在文档集合中的重要性就越低。
N :表示集合中的文档数; :表示出现词项k 的文档数。
d1中各词项的数字表达式 “北京”的“安”的 “立”的北京 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 平 00 0 0 1 1“文”的“高新”的“技术”的“公司”的d2中各词项的数字表达式:“新”的“网络”的“访问”的“技术”的3)画出系统的倒排文件示意图。
54)按照向量夹角的余弦计算公式,给出针对查询“技术的公司”的前3个反馈结果。
该部分由代码实现。
三、实验方法、步骤1.建立Java项目,2.建立DocumentStruct.java类文件并编辑3.建立TextVector.java类文件并编辑,如图4-1,图4-2所示图4-1图4-24.建立TF.java类文件并编辑,如图图4-7所示6图4-45.建立IDF.java类文件并编辑,如图图4-5所示图4-56.建立CaculateSim.java类文件并编辑,如图4-6所示7图4-67.建立MainApp.java类文件并编辑,图4-7所示图4-78.完成后的项目文件夹如图4-8所示89图4-89.运行结果如图4-9所示1. DocumentStruct.java 代码:packageacm.model;public class DocumentStruct {publicDocumentStruct(){ this.documentID = 0; this.documentSimValue = 0; this.documentContent = "None"; this.documentName = "None";}publicDocumentStruct(int ID, double sim, String name, String content){this.documentID = ID; this.documentSimValue = sim;this.documentName = name; this.documentContent = content;}public String getDocumentContent() { returndocumentContent; }public void setDocumentContent(String documentContent) { this.documentContent = documentContent;}public String getDocumentName() { returndocumentName;}public void setDocumentName(String documentName) {this.documentName = documentName;}public double getDocumentSimValue() {returndocumentSimValue;}public void setDocumentSimValue(double documentSimValue) {this.documentSimValue = documentSimValue;}publicintgetDocumentID() {returndocumentID;}public void setDocumentID(intdocumentID) {this.documentID = documentID;}publicDocumentStruct[]sortDocBySim(DocumentStruct[] docList){DocumentStruct temp;for(inti=0; i<docList.length-1; i++){for(int j=i; j<docList.length-1; j++){if(docList[i].getDocumentSimValue()<docList[j].getDocumentSimValue() ){temp = docList[i];docList[i] = docList[j];docList[j] = temp;}}}returndocList;}private String documentName;private String documentContent;private double documentSimValue;privateintdocumentID;}2.TextVector.java代码:packageacm.model;public class TextVector {publicTextVector(int dimension, int[]termCount, intdocumentTermCount,intdocumentCount, int[]documentContainTermCount){vectorWeight = newdouble[dimension];for(inti=0; i<dimension; i++){vectorWeight[i] =caculateWeight(termCount[i],documentTermCount, documentCount,documentContainTermCount[i]);}}public double caculateWeight(inttermCount, intdocumentTermCount, intdocumentCount,intdocumentContainTermCount){TF termTF = new TF(termCount, documentTermCount);IDF termIDF = newIDF(documentCount,documentContainTermCount);termTF.caculateTF();termIDF.caculateIDF();return(termTF.getTf()*termIDF.getIdf());}public double[] getVectorWeight() {10returnvectorWeight;}public void setVectorWeight(double[] vectorWeight) {this.vectorWeight = vectorWeight;}private double[] vectorWeight;}}3.TF.java代码packageacm.model;public class TF {public TF(){tf = 0.0;termCount = 0;termInDocumentCount = 0;}public TF(inttermCount,intdocumentTermCount){this.tf = 0.0;this.termCount = termCount;this.termInDocumentCount = documentTermCount;}public void caculateTF(){if(termInDocumentCount == 0){System.out.println("请先设置文档总数!");return;}this.tf = (double)termCount / (double)termInDocumentCount;}public double getTf() {returntf;}publicintgetTermCount() {returntermCount;}public void setTermCount(inttermCount) {this.termCount = termCount;}publicintgetTermInDocumentCount() {returntermInDocumentCount;}public voidsetTermInDocumentCount(inttermInDocumentCount) {this.termInDocumentCount = termInDocumentCount;}private double tf;privateinttermCount;privateinttermInDocumentCount;}4.IDF.java代码packageacm.model;public class IDF {public IDF() {idf = 0.0;documentContainTermCount = 0;documentCount = 0;}public IDF(intdocumentCount,intdocumentContainTermCount){idf = 0.0;this.documentCount =documentCount;this.documentContainTermCount = documentContainTermCount;}publicintgetDocumentCount() {returndocumentCount;}public voidsetDocumentCount(intdocumentCount) {this.documentCount =documentCount;}publicintgetDocumentContainTermCount() {returndocumentContainTermCount;}public voidsetDocumentContainTermCount(intdocumentContainTermCount) {this.documentContainTermCount = documentContainTermCount;}public double getIdf() {returnidf;}public void caculateIDF(){if(documentContainTermCount ==0){System.out.println("请设置文档的长度(所有词的个数)!");return;}this.idf =Math.log10((double)this.documentCount /(double)this.documentContainTermCount);}private double idf;privateintdocumentCount;privateintdocumentContainTermCount;}5.CaculateSim.java代码packageacm.model;public class CaculateSim {publicCaculateSim(TextVector vector1, TextVector vector2){doublesimDividend=0.0,simDivider=0.0;double tempVector1=0.0,tempVector2=0.0;for(inti=0;i<vector1.getVectorWeight().length; i++){simDividend +=vector1.getVectorWeight()[i] *vector2.getVectorWeight()[i];}for(inti=0;i<vector1.getVectorWeight().length; i++){tempVector1 +=Math.pow(vector1.getVectorWeight()[i], 2.0);tempVector2 +=Math.pow(vector2.getVectorWeight()[i], 2.0);simDivider =Math.sqrt((tempVector1*tempVector2));}this.sim = simDividend / simDivider;}public double getSim() {returnsim;}private double sim;}6.MainApp.java代码packageacm.model;public class MainApp {public static void main(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 = new DocumentStruct[6];String documentContent[] = {"北京安立文高新技术公司","新一代的网络访问技术","北京卫星网络有限公司","是最先进的总线技术。