信息检索与搜索引擎技术实验向量空间模型
向量空间模型的信息检索技术

向量空间模型的信息检索技术摘要:向量空间模型是一种以查询q和文档集合{d1,d2,…,dn}为处理对象的算法,通过这种算法计算出这个查询的相似度sc (q,di)以及每篇文档di(1≤i≤n)。
为了能够实现对信息检索中的文本分类策略,采用了空间模型算法,做了实验文档测试,获得了各自的权重文档搜索结果,得到在检索过程中,向量空间模型根据文档之间的相似度,计算哪个文档最符合用户输入的关键字的结论,具有信息检索中文本相似度根据权值大小分类显示的特点。
abstract: vector space model is a q query and document collection of {d1,d2,…,dn}., as the processing object algorithm, this algorithm to calculate the similarity of the query sc(q,di) and each document d(1≤i≤n).in order to realize the text classification in information retrieval,the space model algorithm is adopted in this paper. the weight document search results were obtained by means of the documentation testing in the lab,in a retrieval process,the vector space model is used according to the similarity between documents to calculate which one conforms to user s input key words.it has the characteristics of text similarity display according to the weight classification in the information retrieva1.关键词:空间向量模型;查询;信息检索;文档相关性key words: space vector model;query;information retrieval;document dependence中图分类号:tp3 文献标识码:a 文章编号:1006-4311(2013)13-0208-020 引言向量空间模型是一种以查询q和文档集合{d,d,…,d}为处理对象的算法,通过这种算法计算出这个查询的相似度sc(q,d)以及每篇文档d(1≤i≤n)。
信息检索中的检索模型比较分析

信息检索中的检索模型比较分析信息检索是指用户在面对大量信息时,通过使用一定的检索模型和技术方法,从中找到对自己有用的信息。
在信息爆炸的时代,信息检索变得非常重要和必要。
在进行信息检索时,使用不同的检索模型可以对用户的需求有不同的体现和处理方式。
因此,本文将比较分析信息检索中常见的检索模型,包括布尔模型、向量空间模型和概率模型。
首先,布尔模型是信息检索中最简单和最早的一种模型。
它使用布尔运算符(AND、OR、NOT)来表达检索的需求。
布尔模型的优点是逻辑简单,可以精确地描述用户的需求,使得检索结果更加准确。
然而,布尔模型的缺点也很明显,即无法对文本进行有关键词排名和排序,只能返回文档是否与查询匹配的结果。
由于信息检索系统中文档数量庞大,使用布尔模型检索的结果可能会非常庞杂,给用户带来困扰。
其次,向量空间模型是一种基于向量空间的检索模型。
该模型将文档和查询都表示为向量,并计算它们之间的相似度来判断文档与查询的相关性。
向量空间模型的优点在于可以对检索结果进行排序和排名,使得结果更加合理和有序。
此外,向量空间模型还可以使用权重来表示文档中关键词的重要程度,从而进一步提高检索的准确性。
然而,向量空间模型也存在一些问题,例如需要对文档和查询进行向量表示,需要对文档中的关键词进行权重计算,这些都需要消耗大量的计算资源和时间。
最后,概率模型是一种基于统计学概率的检索模型。
它通过计算文档与查询之间的相关性概率来进行检索。
概率模型的优点在于可以通过统计学方法来估计查询与文档之间的相关性概率,从而更好地处理查询的需求。
此外,概率模型还可以使用反馈机制来进一步提高检索的准确性。
然而,概率模型也存在一些问题,例如需要对文档集合进行训练,需要估计相关性概率,这些都需要大量的计算资源和大规模的文档集合。
综上所述,信息检索中的检索模型比较分析主要包括布尔模型、向量空间模型和概率模型。
布尔模型逻辑简单,可以精确地描述用户的需求,但无法对检索结果进行排序和排名;向量空间模型可以对检索结果进行排序和排名,但需要对文档和查询进行向量表示和权重计算;概率模型可以通过统计学方法估计查询与文档的相关性概率,但需要大量的计算资源和训练集合。
向量检索常见的索引类型

向量检索常见的索引类型
向量检索是一种常见的索引技术,它可以通过计算文本之间的相似度来实现检索功能。
以下是几种常见的索引类型:
1. 倒排索引:倒排索引是一种常见的向量检索索引类型。
它将文档中的每个词作为关键字,然后建立一个词汇表,记录出现了该词的文档列表。
这样,当用户输入一个查询词时,系统可以快速找到包含该词的文档。
2. 向量空间模型:向量空间模型是一种常见的基于向量的索引类型。
它将每个文档表示为一个向量,向量的每个维度代表一个特征(如词频或TF-IDF值)。
通过计算查询向量与文档向量之间的相似度,系统可以找到与查询最相似的文档。
3. 树状结构索引:树状结构索引是一种常见的多层索引类型。
它将文档集合划分为多个子集,并在每个子集上构建索引。
通过逐层搜索,系统可以快速定位到包含查询的子集,从而提高检索效率。
4. 基于语义的索引:基于语义的索引是一种常见的使用语义信息进行索引的技术。
它通过将词语映射到语义空间中的向量表示,并计算查询向量与文档向量之间的语义相似度来实现检索功能。
向量检索常见的索引类型包括倒排索引、向量空间模型、树状结构索引和基于语义的索引。
这些索引类型可以提高检索效率,并帮助用户快速找到所需的文档。
通过合理应用这些索引类型,我们可以
构建出高效、准确的向量检索系统。
信息检索与搜索引擎技术实验向量空间模型

信息检索与搜索引擎技术实验向量空间模型-2--3--4-说明:TF:表:表示该文-6-档的长度(所有词的个数)IDF :表示词项在文档集合中的重要程度。
一个词项出现的文档数越多,说明该词项的区分度越差,其在文档集合中的重要性就越低。
N :表示集合中的文档数; :表示出现词项k 的文档数。
d1中各词项的数字表达式 “北京”的 “安”的 “立”的 “文”的 “高新”的 “技术”的 “公司”的d2中各词项的数字表达式: “新”的 “网络”的 “访问”的 “技术”的1)画出系统的倒排文件示意图。
-7-2) 按照向量夹角的余弦计算公式,给出针对查询“技术的公司”的前3个反馈结果。
该部分由代码实现。
一、 实验方法、步骤 1. 建立Java 项目,2.建立DocumentStruct.java 类文件并编辑3. 建立TextVector.java 类文件并编辑,如图4-1,图4-2所示图4-1-8-图4-24. 建立TF.java 类文件并编辑,如图图4-7所示图4-45. 建立IDF.java 类文件并编辑,如图图4-5所示-9-图4-56. 建立CaculateSim.java 类文件并编辑,如图4-6所示图4-67. 建立MainApp.java 类文件并编辑,图4-7所示-10-图4-78. 完成后的项目文件夹如图4-8所示图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 voidsetDocumentSimValue(double documentSimValue) {this.documentSimValue = documentSimValue;}publicintgetDocumentID() {returndocumentID;}public voidsetDocumentID(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 doublecaculateWeight(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() {returnvectorWeight;}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[] = {"北京安立文高新技术公司","新一代的网络访问技术","北京卫星网络有限公司","是最先进的总线技术。
向量检索技术

向量检索技术向量检索技术是一种基于向量空间模型的文本检索方法,它通过将文本表示为向量,利用向量之间的相似度计算来衡量文本之间的相关性,从而实现高效的信息检索。
本文将从向量空间模型的基本原理、向量表示方法、相似度计算及应用领域等方面进行详细介绍。
一、向量空间模型的基本原理向量空间模型是一种用于表示文本的数学模型,它将每篇文本表示为一个向量,其中每个维度对应一个特征或词项,向量的取值表示该特征在文本中的重要程度。
基于向量空间模型,可以通过计算向量之间的相似度来度量文本之间的相关性。
二、向量表示方法在向量空间模型中,有多种方式来表示文本向量,常见的有词频表示法和TF-IDF表示法。
1. 词频表示法:将每个文本表示为一个向量,向量的每个维度对应一个词项,取值为该词项在文本中的出现频率。
2. TF-IDF表示法:TF-IDF是Term Frequency-Inverse Document Frequency的缩写,它综合考虑了词频和文档频率,能够更好地衡量词项的重要性。
TF-IDF表示法的向量取值为词项的TF-IDF值。
三、相似度计算相似度计算是向量检索技术的核心,常用的相似度计算方法有余弦相似度和欧氏距离。
1. 余弦相似度:余弦相似度是通过计算两个向量的夹角余弦值来衡量它们的相似程度,取值范围为[-1, 1],值越接近1表示两个向量越相似。
2. 欧氏距离:欧氏距离是通过计算两个向量之间的欧氏距离来衡量它们的相似程度,值越小表示两个向量越相似。
四、应用领域向量检索技术在信息检索领域有广泛应用,可以用于文本分类、文本聚类、推荐系统等任务。
1. 文本分类:通过将文本表示为向量,可以利用向量检索技术实现文本的自动分类。
例如,在垃圾邮件过滤中,可以将每封邮件表示为向量,然后计算与已知垃圾邮件向量的相似度,从而判断邮件是否为垃圾邮件。
2. 文本聚类:通过将文本表示为向量,并利用向量之间的相似度计算,可以将相似的文本聚集在一起。
新手学信息检索4:向量空间模型与相似度计算

新手学信息检索4:向量空间模型与相似度计算阿里巴巴首席工程师经验分享,物超所值。
相似度从字面上理解就是两个事物的相似程度。
在信息检索中,相似度表示的是两个文档之间的相似程度或者查询与文档的相似程度。
首先回想一下检索过程:1:首先用户输入查询词。
2:搜索引擎根据查询词查找相应的文档。
3:搜索引擎把查询结果以一定的方式显示给用户。
那么一篇文档是否满足用户的查询需求可以用文本与查询的相似程度来衡量。
而相似度到最后总能够计算成一个实数,所以可以根据文档与查询的相似度进行排序。
与查询相似度较高的文档排在前面,较低的排在后面。
相似度的计算方式五花八门。
比如上一篇文章中,可以简单的利用tf*idf的累加和代表文档与查询的相似程度。
当然这种方法看上去没什么理论深度,所以就不讨论了。
对于一件事,研究者常常尽量使用数学理论去解释它,使它模型化,使它变得有理有据。
数学包含的内容博大精深,所以解释的方法也不同。
有的研究者试图用这种数学理论去解释,有的研究者试图用那种数学理论解释。
有些人解释的很成功,当然有一些则失败了。
当一个一流研究者找到一个新的解释方法并建立一个模型后,其他的三流研究者就开始对这个模型修修补补。
现在就来说说一流研究者提出的一个检索模型:向量空间模型。
该模型被用于文档的分类,该模型最初被用于文档的分类,通过文档与类别的特征之间计算来实现文档正确分类,但是该模型也可以用在信息检索中。
向量空间模型就是把查询和文档想象成N维空间向量,N是词典大小。
每一维表示一个查询词。
向量在每一个维度上的坐标可以通过计算得到。
设查询向量表示成:Q=[q1,q2,……,qN];文档向量表示成:D=[d1,d2,……,dN];这样查询Q与文档D都能表示成两个向量。
那么我们如何计算其相似度呢?这里常用的就是余弦相似度:对于这种模型下的余弦相似度的计算有一个非常形象的解释:把每一篇文档想象成N维空间下的点。
一个查询可以想象成从原点打出的一束光刺穿了这个N维空间,离光束近的点与查询相似度高,离光束远的点与查询相似度低。
信息检索与搜索引擎技术

信息检索与搜索引擎技术信息检索与搜索引擎技术在当今信息爆炸的时代中起着重要的作用。
随着互联网的普及和快速发展,人们要从浩瀚的信息海洋中找到所需信息已成为一项艰巨的任务。
因此,信息检索与搜索引擎技术的发展成为解决信息过载问题的关键。
一、信息检索技术概述信息检索是指从大规模的信息资源中获取用户需求信息的一种技术手段。
其目标是通过对信息的组织、索引和检索等处理,将用户提供的查询与信息资源进行匹配,并将相关的信息进行有效的排序和展现。
信息检索技术可分为两个主要方面:信息检索建模和信息检索算法。
信息检索建模是指对信息进行表示和刻画,以便于有效地检索。
常用的建模方法有向量空间模型、概率模型和语言模型等。
向量空间模型将文档和查询表示为向量,通过计算它们之间的相似度来进行匹配。
概率模型基于统计方法,估计查询和文档之间的概率关系。
语言模型以语言为基础,通过对查询和文档进行语言建模,来判断它们的相关性。
信息检索算法是指根据信息的表示和查询的需求,设计和实现高效的检索方法。
常见的算法包括倒排索引、布尔模型、TF-IDF等。
倒排索引是一种将词项映射到文档列表的数据结构,能够快速查找包含查询词的文档。
布尔模型通过逻辑运算符AND、OR和NOT对查询进行处理,确定满足条件的文档。
TF-IDF是一种根据词频和逆文档频率来评估词项重要性的算法。
二、搜索引擎技术概述搜索引擎是指通过检索技术,从互联网上采集和组织信息,并提供相应服务的系统。
搜索引擎技术的目标是提供高质量、准确的搜索结果,满足用户的信息需求。
搜索引擎技术主要包括信息采集、预处理、索引构建和查询处理等步骤。
信息采集是指通过网络爬虫等技术,从互联网上获取信息资源。
网络爬虫是一种自动化程序,按照一定的规则和策略,自动访问网页并提取页面内容。
信息采集过程中,需要进行数据过滤、去重和规范化等处理,以确保爬取到的信息的质量和准确性。
预处理是指对采集到的信息进行处理和转换,以适应后续的索引构建和查询处理。
信息检索技术——向量空间模型

信息检索技术——向量空间模型上次介绍了,布尔模型已经可以解决⼀个很重要的问题,就是找到和⽤户需求相关的⽂档(其中还需要很多处理,⽐如分词,归⼀化,去掉停⽤词等等,我们只是介绍主要的框架流程)。
但是这样找到的⽂档会有很多,也许上千个,也许上万个,这远远不是⽤户所要的。
⽤户也不会去从⼏万个⽂档中挑选⾃⼰要找的。
因此我们需要对结果进⾏排序,把最能满⾜⽤户需求的⽂档放在最上⾯显⽰给⽤户,就像google和baidu做的⼀样。
细⼼的朋友就能发现,其实信息检索是⼀个循序渐进的剪枝和筛选过程,最后留下的就是⽤户想要的。
因此,我们需要⼀种评分机制来进⾏排序,通过得分的⾼低排除top N的⽂档返回给⽤户。
这个评分通过什么来确定呢?当然是⽤户查询的query和返回⽂档的相似度了。
计算相似度有很多种⽅法:⽅法1 Jaccard coefficient此⽅法看上去很好理解,就是⽤query和⽂档共同出现的词的个数,除以⼀共的词数。
当然也有很多问题1 没有考虑⽂档中词出现的次数(没有考虑tf因素)2 没有考虑⽂档的频率(没考虑idf因素)3 没有考虑⽂档的长度,长⽂档和短⽂档计算相似度的差别会很⼤下⾯我们⼀起看看⼀个⾮常著名的模型——空间向量模型⽅法2 向量空间模型(VSM)⾸先介绍2个概念,tf和idftf即term frequency, 表⽰⼀个term t出现在document d中的次数,这是⽂档中⼀个很重要的概念。
出现次数更多意味着重要程度越⾼,但是需要注意的是,相关度的提⾼并不是和次数的提⾼成同⽐的。
因此通常tf需要做如下的处理w1= log10(tf+1)这样做就是要弱化次数对于相关度的影响df即document frequency,表⽰⼀个term在整个⽂档集中出现的频率。
与tf相反,⼀个term的重要程度是随着它在语料库中出现的频率成反⽐的。
⽐如and,or等词在⼏乎所有⽂档中都出现,那么这些词的意义就很弱,⽽⼀些专业词汇只在⼏篇⽂档中出现过,显然意义更加重要。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
信息检索与搜索引擎技术实验向量空间模型-标准化文件发布号:(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[] = {"北京安立文高新技术公司","新一代的网络访问技术","北京卫星网络有限公司","是最先进的总线技术。