![文本关键词提取(TFIDF和TetRank)_第1页](http://file4.renrendoc.com/view/a606ec26f27dff1bb87cf4a2fad70a3a/a606ec26f27dff1bb87cf4a2fad70a3a1.gif)
![文本关键词提取(TFIDF和TetRank)_第2页](http://file4.renrendoc.com/view/a606ec26f27dff1bb87cf4a2fad70a3a/a606ec26f27dff1bb87cf4a2fad70a3a2.gif)
![文本关键词提取(TFIDF和TetRank)_第3页](http://file4.renrendoc.com/view/a606ec26f27dff1bb87cf4a2fad70a3a/a606ec26f27dff1bb87cf4a2fad70a3a3.gif)
![文本关键词提取(TFIDF和TetRank)_第4页](http://file4.renrendoc.com/view/a606ec26f27dff1bb87cf4a2fad70a3a/a606ec26f27dff1bb87cf4a2fad70a3a4.gif)
![文本关键词提取(TFIDF和TetRank)_第5页](http://file4.renrendoc.com/view/a606ec26f27dff1bb87cf4a2fad70a3a/a606ec26f27dff1bb87cf4a2fad70a3a5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于关键词提取的TFIDF和TextRank方法的对比研究题目:开发一个程序,在该程序中,允许输入一段文本(以界面或者文件输入方式均可),该程序自动抽取出包含的关键词,并按照关键词的权重由高到低排序后输出。完成日期:2016.06.05一、需求分析以文本的形式读入数据,将每个单词抽象成一棵树,将单词与单词之间的关系抽象为图。TFIDF算法部分以EXCEL形式将所有数据输出,TextRank算法部分直接以窗口形式输出排名前十位的数据。本程序的目的是在提取文本关键词的同时,比较TFDIF和TextRank算法的准确性和性能方面的差异。测试数据(附后)。概要设计抽象数据类型映射树定义如下:ADTMap{数据对象ID:ID是类型为char的元素集合,即为一个单词中的单个字符,称为字符集。数据对象val:val是类型为double或int的元素集合,为每个单词对应的TF值或IDF值,称为频率集。数据对象is_end:is_end是类型为bool的元素集合,判断当前子结点是否为单词末尾数据关系R:R={IDVal}IDVal={word-〉num|wordEID,numGval,表示从word至Unum之间的一一映射}运算符重载:下标运算符□:运算对象为string值,返回对应string值的子树所代表的val值。算术运算符二:运算对象为double或int值,等式左值的val值替换为等式右值,并返回当前子树。算术运算符+-*/:运算对象为double或int值,对其val值进行运算,并返回当前子树。相等运算符==和!=:运算对象为val值,判断其val值是否相等,返回对应的bool值。基本操作:InitMap(&T);操作结果:构造空树。DestroyMap(&T);初始条件:树T存在。操作结果:构造空树。CreateMap(&T,word);初始条件:树T存在且word为string值。操作结果:按照word的字符顺序自上而下遍历,如果有字符结点未创造,则构造新子结点,直到字符结束。MapEmpty(T);初始条件:树T存在。操作结果:若T为空树,则返回True,否则False。MapDepth(&T);初始条件:树T存在。操作结果:返回树的深度。Root(&T);初始条件:树T存在。操作结果:返回T的根。Value(&T,value);初始条件:树T存在,value为T中某个结点的值。操作结果:返回value的值。Assign(&T,word,value);初始条件:树T存在,且word结点也存在。操作结果:结点word的value值替换为当前value。Parent(&T,word);初始条件:树T存在,且word结点也存在。操作结果:返回word结点的双亲。InsertWord(&T,word);初始条件:树T存在。操作结果:往树加入word值,并将其value值默认初始化。DeleteChild(&T,word);初始条件:树T存在,且word结点也存在。操作结果:将word对应子节点的is_end值改为false。TraverseMap(&T,visit());初始条件:树T存在,visit是对结点操作的应用函数。操作结果:按某种次序对T的每个结点调用visit—次且至多一次。一旦visit失败,则操作失败。}ADTMap抽象数据类型图定义如下ADTGraph{数据对象n:n是具有相同特征的数据元素集合,称为顶点集。数据关系:DR={<v,w>|v,wGn且〈v,w>表示从v指向w的弧}基本操作:CreateGraph(&G,V,VR);初始条件:V是图的顶点集,VR是图中弧的集合操作结果:按V和VR的定义构造图GDestroyGraph(&G);初始条件:图G存在操作结果:销毁图GLocateVex(G, u);初始条件:图G已存在,u和G中顶点有相同特征操作结果:若G中存在顶点u,则返回该顶点在图中位置,否则返回其它信息GetVex(G, v);初始条件:图G存在,v是G中某个顶点操作结果:返回v的值PutVex(&G,v,value);初始条件:图G存在,v是G中某个顶点操作结果:对v赋值valueFirstAdjVex(G,v);初始条件:图G存在,v是G中某个顶点操作结果:返回v的第一个邻接顶点。若顶点在G中没有邻接顶点,则返回“空”NextAdjVex(G,v,w);初始条件:图G存在,v是G中某个顶点,w是v的邻接顶点操作结果:返回v的(相对于W的)下一个邻接顶点。若W是v的最后一个邻接点,则返回〃空”InsertVex(&G,v);初始条件:图G存在,v和G中顶点有相同特征操作结果:在图中增添新顶点vDeleteVex(&G,v);初始条件:图G存在,v是G中某个顶点操作结果:删除G中顶点v及其相关的弧InsertArc(&G,v,w)初始条件:图G存在,v和w是G中两个顶点操作结果:在图G中增添弧〈v,w〉,若G是无向的,则还应增添对称弧〈w,v〉DeleteArc(&G,v,w)初始条件:图G存在,v和w是G中两个顶点操作结果:删除G中的弧〈v,w〉,若G是无向的,则还应删除对称弧DFSTraverse(G,v,visit())初始条件:图G存在,v是G中某个顶点,visit是对顶点的应用函数操作结果:从顶点v起深度优先遍历图G,并对每个顶点调用函数visit()—次且至多一次。一旦visit()失败,则操作失败BFSTraverse(G,v,visit())初始条件:图G存在,v是G中某个顶点,visit是对顶点的应用函数操作结果:从顶点v起广度优先遍历图G,并对每个顶点调用函数visit()—次且至多一次。一旦visit()失败,则操作失败}ADTGraph
本程序包含两大模块,TF-IDF算法部分和TextRank算法部分1)主函数部分voidmain(){TF-IDF算法;TextRank算法;}TF-IDF算法构建语料库(语料库的原料来源于超过八亿词的文本)导入语料库读入文本分析所读入的单词合并语料库输出到EXCELTextRank算法读入数据分析所读入的单词构造矩阵套用公式结果排序输出前十名各模块之间的调用关系如下:导入语料库L J
导入语料库L J输出到EXCEL结果排序输出到EXCEL结果排序输出前十名三、 详细设计设计思路本程序以实现关键词抽取为目的,选取了TF-IDF和TextRank关键词提取算法,进行两者的效率和准确性的比较研究。TFIDF算法TF-IDF算法简介TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一个词组或短语的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。在一组文档中,刻画某一文档特征的特征项可以根据其在这组文档中出现的频率赋予相应的权重,只有在少数文档中出现的较特殊的词,权重要比在多篇文档中出现的词的权重要高。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。TF-IDF算法原理TF-IDF实际上是TF和IDF的组合。TF即词频(TermFrequency),IDF即逆向文档频率(InverseDocumentFrequency)。TF(词频)就是某个词在文章中出现的次数,此文章为需要分析的文本。为了统一标准,有如下两种计算方法【2】:TF(词频)=某个词在文章中岀现的次数该篇文章的总次数TF词频=某个词在文章中岀现的次数该篇文章岀现最多的单词的次数IDF(逆向文档频率)为该词的常见程度,需要构建一个语料库来模拟语言的使用环境。IDF逆向文档频率IDF逆向文档频率=log语料库的文档总数包含该词的文档总数+1如果一个词越常见,那么其分母就越大,IDF如果一个词越常见,那么其分母就越大,IDF值就越小。TFTF—IDF=TF词频XIDF(逆文档频率)之后,将每个单词的TF-IDF值按从大到小降序排列,排在最前面的几个词即为关键!词。TF-IDF算法实现构建一一映射Map类C++STL函数库中已经包含了map的库函数,但为了使用起来更加方便、更便于个性化定制操作,于是使用自己定制的Map类模板。这个类函数主要是构建单词的string值与其TF、IDF值的一一对应关系,方便直接用string值下标访问其int值或double值,简化写代码的工作量。同时模板类中主要采取树形结构,建立一棵查找树,利用vector的空间动态分配的灵活性,从string的第一个字母开始一个一个往下找。每个Map类代表一个字母,从根部开始向下遍历,利用bool值判断该处是否为一个单词结尾。代码如下:* 映射函数Map类Type为存储的TF、IDF、TFTDF值,如int、double等旨在通过string类型下标访问其Type值*template〈classType>classMap{public:Typeval=NULL; //Type值,类型为int、double*下标运算符口重载□中值为string类型如果该string值已存在,则返回对应val如果不存在则新建一个,返回初始值*Type&operator[](stringitem)//引用类函数//引用类函数find()查找到的值Map&temp=find(item);if(temp!=NULLif(temp!=NULL){returntemp.val;}else{//找到,则返回对应val//未找到,则用create()函数创建一个并返回新的值create(item);returnfind(item).val;*算术运算符=重载左值为找到的Map.val引用右值为对应的val值返回当前Map的引用*Map&operator=(Typeitem){val=item;returnthis;}*类函数列表find为查找函数,找到则返回其值,没找到则新建一个返回初值create为创建新值得函数*Mapfind(stringword);voidcreate(stringword);private:boolis_end=false; //是否为单词结尾charID; //代表当前类的字母vector〈Map*〉childs; //子节点集合};*find查找函数如果该string值已存在,则返回对应值如果不存在则新建一个,返回初始值*template〈classType>MapMap〈Type〉::find(stringword){for(auto&r:childs)//遍历类函数的所有子节点直到找到对应项{if(r-〉ID==word[0]&&r-〉is_end)//如果相等且为单词末尾{if(word.size()==1)//大小为一说明已找到{returnthis;//返回当前类}returnr-〉find(word.substr(1,word.size()-1)); //递归调用find函数,一次减少一个字符}}returnNULL;//返回空类}*create创建函数递归创建字母树*template〈classType〉voidMap〈Type〉::create(stringword){if(word.size()==0)//如果大小为0,说明所有字母都已创建完毕{is_end=true;//标记单词结尾为truereturn;}for(auto&r:childs)//遍历所有子节点{if(r-〉ID==word[0])//如果找到,则减少第一个字符,继续递归向下遍历{r-〉creat(word.substr(1,word.size()-1));return;}}Map*temp=newMap;//没找到,则新建一个Maptemp-〉ID=word[0];//将其所代表的字符ID设为当前word的第一个字符childs.push_back(temp);//子节点中增加这一Maptemp-〉creat(word.substr(1,word.size()-1)); //继续递归创建后续字符return;}构建语料库为了使语料库更符合本程序的应用场景,语料库采用自己构建的语料库。语料库素材来源于小说新闻等,总词数超过8亿词。因为每篇文档有几十万字,为了使词语的ITF更具普遍性,假设每1000词为一篇文章。然后每次将文章先存入一个临时语料库中,进行
分析处理后,将处理后的词加入临时语料库。之后再将临时语料库合并入总的语料库,流程图如下:定义语料库
定义临时语料库
循环读入文件( A对读入的每一个单词进行处理使其前后都没有不必要的字符并将其转化为小写正序遍历去除前缀( A对读入的每一个单词进行处理使其前后都没有不必要的字符并将其转化为小写正序遍历去除前缀逆序遍历去除后缀保留中间必要的符号每读入1000个字符将临时语料库与总语料库合并
并清空临时语料库全部读完后输出到文件保存//建立语料库map〈string,double〉corpus; //语料库,由字母string到出现频率double的映射longlonginttimes=0; //文章总数,作为计算频率的基数ofstreamoutput("corpus.csv"); //输出到excel表格中存储*导入制作好的语料库存在一一映射corpus中*voidbuildCorpus(){ifstreaminput("corpus.csv"); //打开文件stringitem;//定义临时存储变量string和doubledoubleval;while(!input.eof()) //读入文件,存储到语料库映射中{input〉〉item>>val;corpus[item]=val;}}*分析处理读入的string短语先删去字符前的不必要符号如数字、标点〃([{〈等等将剩下的大写字符转化为小写保留字符中的标点,^口Mr.Bill等再删除字符后的不必要标点,如•,〃’:等等返回修改后的字符*stringanalysis(stringitem){stringtemp=""; //定义空字符boolflag=false; //flag标记,当碰到第一个字母时,flag变为true,否则为false,滤过不必要的前缀for(auto&r:item)//遍历string中每一个字符{if(r==','||r==';') //滤过,;等符号{continue;
if(r<='z'&&r>='a'){flag=true;}if(r<='Z'&&r>='A'){flag=true;r+=32;}if(flag)缓存string中加入该字符{temp+=r;}}if(temp.size()==0)return{returntemp;}for(autoi=temp.rbegin();i<=temp.rend();i++)删去string中不必要的后缀{if(*i〈二'z'&&*i〉='a')环{break;}temp.pop_back();}—returntemp;string}//碰到字母标记true////碰到字母标记true//转化大小写//如果已碰到字母,则在//如果是空字符,直接//从尾开始遍历string,//若碰到字母,则跳出循//删去后缀//返回处理过的字符*遍历临吋语料库的数值将其合并到总的语料库*voidprint(map〈string,double>&frequency){for(auto&r:frequency){if(corpus.find(r.first)==corpus.end())料库中新建一个,并将其初始化{corpus[r.first]=0.0;}//遍历临时语料库//第一次出现则将在总语//合并语料库中对应数值corpus[r.first//遍历临时语料库//第一次出现则将在总语//合并语料库中对应数值*创建语料库通过文件读入文章由于部分文章为小说,有几十万字,于是统一按每1000字为一篇文章语料库素材中所有文章的总次数大概有8亿词将该文章中出现的单词存入临时语料库中每一千字更新总语料库corpus,清空临时语料库frequency最后计算每个单词的IDF值*voidreadDictEn(){//记录当前已读入的word/临时语料库,存放//记录当前已读入的word/临时语料库,存放//临时变量,记录临时语//遍历语料库素材TXT文map〈string,double〉frequency;string单词到double频率的一一映射longlongintent=0;料库被清零多少次for(inti=1;i〈二633;i++)档,共有633个TXT文档,每篇文档平均12万词{*每篇文档的命名方式为"EN(i)",i为文档编号先利用stringstream流创建文件名的字符串再用ifstream流打开对应文件*//输出当前读入文件状态//stringstream流,存储//打开文件//临时存储变量//读入文件//将读入字符串处理成所//输出当前读入文件状态//stringstream流,存储//打开文件//临时存储变量//读入文件//将读入字符串处理成所//空字符串则略过文件名字符串out〈〈"EN("<<i<<").txt";ifstreamfile(out.str());stringitem;while(!file.eof()){file>>item;item=analysis(item);需要求if(item.empty()){continue;}if(frequency.find(item)==frequency.end())//如果是新的字符串,则在语料库里新建一个并初始化{frequency[item]=0.0;
frequency[item]++;words++;frequency[item]++;words++;if(words==1000)一篇文章时,合并语料库并清空临时语料库{print(frequency);frequency.clear();ent++;words=0;}}}//增加出现次数//读入一千词时,即读入for(auto&r:corpus)//打印每个单词的IDF值r.second/=(cnt+1);r.second=abs(log(r.second));output〈〈r.first〈〈""〈〈r.second<<endl;计算TF-IDF值计算TF值时,只需要将所抽取的文章对象全部遍历一遍,对每个词计算其词频,再将词频乘以对应的IDF值,按照从大到小排序即可输出结果。*提取关键词对读入文章的每一个单词计算TF值再分别计算TF-IDF值将每个单词的结果输出到excel表格中*voidextract(stringname){//打开文件//单词总数,包括相同的//这篇文章的语料库//循环读入文章中所有单//打开文件//单词总数,包括相同的//这篇文章的语料库//循环读入文章中所有单//以下过程与构建语料库stringitem;longlongintwords=0;单词map<string,double>frequency;while(!file.eof())词{过程类似file>>item;
item=analysis(item);if(item.empty()){continue;}if(idle.find(item)!=idle.end()){continue;}if(frequency.find(item)==frequency.end()){frequency[item]=0.0;}frequency[item]++;words++;}//输出数据到Exceloutput.open("data.csv");for(auto&r//输出数据到Excel{r.second/=words;r.second*=corpus[r.first];output〈〈r.first〈〈","〈〈r.second<<endl;}}TextRank算法3.1.算法简介TextRank也是一种用于文本排序的算法,它主要运用了矩阵迭代的代数知识来对每个文本词语进行分析,最后得出数值越高则越重要。其思想来源于网页排序算法PageRank。PageRank的基本思想主要是:一个网页的重要程度取决于链接到它的网页的数量以及这些网页的重要程度。比如有n个网页,对于其中一个网页Webt,所有链接到Webt的页面集合记为In(Wed),所有Web.链接到的页面集合记为0uMWebj),则其重要程度为:Importance(Weq)= Importance(Weq)= 》WebjE\n(Webj)1Importance(“eb.)|Out("ebj)| 1此处的求和号可以通过矩阵计算来模拟实现,并通过不断地迭代,重要性的值会不断收敛为一常值,最后可以求出最后的网页重要性。TextRank就是仿造这算法设计。【3】算法思路TextRank总体思路与PageRank类似。因为文本中不存在窗口与链接,所以要模拟造出窗口。在这里不妨设k个词为一个窗口,其中每个单词为一个链接,当一个窗口中的单词与另一个窗口中的单词一样时,即视为两个窗口有链接。当然也可以脱离PageRank的思想来解释这一算法。对于一个句子,其中的一个单词与这个句子的剩余单词都有关联性。同时,这个句子中的每一个单词又与另外其他句子中相同的单词也有关联性。也就是说,一个单词的重要性不仅仅取决于单词的重要性,还与该句子中其他单词的重要性相关。但为了使构造出来的矩阵运算更为简便,在此将单词句子假定为长度为k,每个单词为k的第一个单词。这样,每k个单词就构成一个句子,句子与句子中任意两个单词之间就构成一条边,最后形成的图是一个无向图。为了加快运算速度,图采用邻接矩阵的方式存储。而且,经过实际检验可以发现,该矩阵并不稀疏,所以直接转化为二维数组。每次计算时就不断按照公式迭代。如此循环遍历下去,这样不仅得到的矩阵运算方便计算,而且对结果的准确性也没有影响。迭代公式如下:Importance(“ord/=(1—d)+d*WordjE\n(=(1—d)+d*WordjE\n(Word)Out(Wordj)1 1其中d是阻尼系数,一般设置为0.85。初始时,可以先设重要性为1。容易看出,经过多次迭代后,该重要性的值会逐渐收敛为一常数。TextRank算法实现TextRank所主要用到的主要是图的邻接矩阵存储,矩阵相乘合并等数据结构算法。流程图如下:定义邻接矩阵阻尼向量读入文件f >对读入的每一个单词进行处理
使其前后都没有不必要的字符
并将其转化为小写正序遍历去除前缀逆序遍历去除后缀保留中间必要的符号f >对读入的每一个单词进行处理
使其前后都没有不必要的字符
并将其转化为小写正序遍历去除前缀逆序遍历去除后缀保留中间必要的符号将处理好的词存入string将处理好的词存入string流中
将单词存入语料库中
构造单词图的邻接矩阵r \设置迭代次数进行矩阵迭代运算构造结构体将矩阵结果信息转存到结构体中对其进行排序\ 丿算法代码如下:ifstreamEnFile;ofstreamoutput;stringstreamtempFile;set〈string〉idle;map<string,int〉EnMatr;intEnRank=0;constintk=8;intkey[10000][10000];doubled15[10000];doubleans[10000];*读入文件并去除停用词仿造TF-IDF的方法,对读入的词进行分析处理将文章中处理过的词按照原来的顺序存入stringstream流tempFile中将每个词按照构造语料库的方法,存入语料库中构建单词图的邻接矩阵*voidscan(stringname){ifstreamstop("Stop.txt");while(!stop.eof()){stringtemp;stop>>temp;idle.insert(temp);}EnFile.open(name);stringtemp;while(!EnFile.eof()){EnFile>>temp;temp=analysis(temp);if(idle.find(temp)!=idle.end()){continue;if(temp==""){continue;}if(EnMatr.find(temp)==EnMatr.end()){EnMatr[temp]=EnRank++;}tempFile<<temp<<"";}}*读入文件并去除停用词仿造TF-IDF的方法,对读入的词进行分析处理将文章中处理过的词按照原来的顺序存入stringstream流tempFile中将每个词按照构造语料库的方法,存入语料库中构建单词图的邻接矩阵*voidbuild(){stringbuffer[k];for(inti=0;i<k;i++){tempFile>>buffer[i];}for(inti=0;!tempFile.eof();i=(i+1)%k) //将string流中的数据读入循环数组中{//为节省空间,数组只开k项,利用循环数组存储更新stringtemp=buffer[i];for(auto&r:buffer) //构造邻接矩阵{if(r==temp){continue;}key[EnMatr[temp]][EnMatr[r]]++;}tempFile>>buffer[i];*矩阵相乘运算套用求TextRank公式*voidmultiple(){doubletemp[10000];constsize_tsize=EnMatr.size();for(inti=0;i<size;i++) //矩阵相乘{doublesum=0;for(intj=0;j<size;j++){sum+=key[i][j]*ans[j];}temp[i]=sum*0.85;}for(inti=0;i<size;i++) //向量相加{ans[i]=temp[i]+0.15;}}*设置迭代次数对每个单词进行迭代操作*voidsolve(inttimes) //迭代times次{constintsize=EnMatr.size();for(inti=0;i〈二size;i++){ans[i]=1.0;}for(inti=0;i<times;i++){multiple();}}*结果输出排序吋需要用到的结构体变量*structsortAns{public:doubleans; //TextRank值stringitem; //对应单词值}out[10000];*排序吋用到的比较函数*boolcompare(constsortAnsa,constsortAnsb){returna.ans>b.ans;}*将map中的值转移到结构体进行排序输出排在前十位的词作为关键词*voidprintAns(){constintsize=EnMatr.size();inti=0;for(auto&r:EnMatr){out[i].item=r.first;out[i++].ans=ans[r.second];}sort(out,out+size,compare);for(inti=0;i<10;i++){cout〈〈out[i].item<<endl;}}四、 调试分析考虑到程序的健壮性与运行效率,本次程序的一一映射关系采用了C++STL的map和set库。为了使数据更直观地呈现出来,本程序将TFIDF算法的输出数据直接输入到EXCEL中,更加方便后期的数据分析。从程序运行结果可以看出,TF-IDF算法和TextRank算法的准确性相差不算太大,但其时间与空间复杂度却存在差异。从时间复杂度上来看,TF-IDF因为要构建语料库,其中需要不断用到字符串查找匹配等操作,耗费大量时间,光构建语料库的过程就要花费大约两个多小时的时间。而且之后的试验中还要再读取现有的庞大语料库,要花很多时间,时间主要花在文件读取转存的过程中,不过计算速度较快,但总体来看时间复杂度较高。TextRank因为只需要对单词进行迭代计算,对于大部分文本来说,速度较快。但对于长文本来说,两者的时间复杂度可能就比较接近。总之,一般情况下,处理短文章时TF-IDF要的时间复杂度远高于TextRank算法的时间复杂度,但处理较长的文章时,TF-IDF算法和TextRank算法的时间复杂度差不多,甚至TF-IDF算法会快于TextRank算法。从空间复杂度上来看,TF-IDF显然要花不少存储空间,在读入文章的过程中,其占用内存空间接近0.5G°TextRank因为要存图链接矩阵,其空间复杂度也不低,但其空间复杂度与文中特异的单词数有关,大部分情况下其内存较TF-IDF低,但如果文章很长且其中生僻字词较多,内存也会以平方的速度增长,甚至会出现不够用的情况。所以,两者在内存方面要求都较高,,空间复杂度都极其高。6•总的来说,TFIDF算法和TextRank算法的差距并不大,其空间与时间复杂度也较为接近,在实际应用中,可以将这两种做法结合在一起,相辅相成。从中也明显感受到,算法对解决问题的重要性,能将一个很实际的问题转化成抽象代数,从而通过计算而获得结论。五、 用户手册本程序由VisualStudio2015professional编译,IDE要求g++l1以上。进入程序后输入想要读入的文档名字,带上后缀名即可读入文件,若不在同一目录下要加上地址。TFIDF算法的结果将全部输出到EXCEL中,TextRank算法的结果将选取前十名输出到控制台窗口中六、测试结果第一组测试数据:WhenIwasakid,IthoughtIwouldgrowuptobeanactress.IthoughtIwouldliveinNewYorkCity,inahigh-riseapartmentbuilding,withmyhusbandandfamilyof,oh,fiveorsixkids.IthoughtI'dliveanurban,impossiblysophisticated1life.Moneywouldbenoobject.Perhapstherewouldbeaprivateplane.(Ishouldmentionherethatthesefantasieswerefirmlyrootedinthe1980's.)Well,Igrewupandleftthecityforthecountry.Imarriedandhadonechild--anonlychild,justlikeIhadbeen.MyhusbandandIworkhardtomakeendsmeet.Butmylife—myrich,imperfect,complicated,contented2life--istheoneI'vebuiltformyself.It'sanhonestlife.It'salifeofintegrity3.It'salifeIlove.Buttohaveit,IhadtolosemyfantasystraightoutofthepagesofamagazineofwhatitwasthatIthoughtIwanted—ofwhoIthoughtIwas.Iwasundersellingmyself,itturnedout.Tolove,toreallyliveistobecomewillingtolosepeople,places,things,dreams,eventoloseversionsofourselvesthatnolongerserveus.Andinplaceofwhatislost,somethingnewemerges4.Itmaynotbewhatweimagined.Butitisbeautifulanditisours.直观上来看,这篇短文的关键词应该是live、grow。TF-IDF运行结果:2unders-allirO.04S5473lose0.034574emerges0.0300765high-riseO.OZ92326imperfect0.02S11171ife0.0Z8105呂live0.0252183versions0.02550410urban0.02523811actress.0.024223可以看出,life、live排在比较靠前的位置但不是在最前面,排名第一的居然是undershelling,可能与这个词在普通的文本中出现得比较少有关,但它并不是关键词。lose还能勉强说得过去,但emerge、high-rise、imperfect这些就有点牵强。结果有一定的可靠性但不能算准确。TextRank运行结果:lifechildcityhusbardlive匚ontertedimperfectcountrymarriedgrew这个结果的前几名就靠谱一些,关键的life、child、city、country、grew、married、huaband都有指出来,imperfect、contented虽然有点牵强,但还是少数,并且也是在排名靠后的位置。第二组测试数据:VOAAssociatesIncorporatedisdelightedtoannouncethatwehavejoinedStantec.Wearenowpartofateamthatunitesapproximately22,000employeesworkinginover400locationsacrosssixcontinents.Thisisanexceptionalgrowthopportunityforus.Moreimportantly,itoffersourclientswiththebenefitsandopportunitiesofworkingwithatoptenglobaldesignfirm.VOAwasbuiltwithanemphasisongreatdesign,greatpeople,andgreatclientexperiences.Ourbusinessstrategyhasbeencenteredonbuildingadiversepracticeandofferingdeepexpertiseinmultiplemarketsectorstobestserveourclients.Wehavegrownthe
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生产设备技术转让协议书(2篇)
- 环保保洁服务协议书(2篇)
- 2025年超低频传感器标定系统合作协议书
- 吉林省七年级数学下册第8章一元一次不等式复习2听评课记录新版华东师大版
- 小学 一年级数学一年级口算强化训练题库
- 2022年新课标九年级上册道德与法治第一单元富强与创新1、2课4课时听课评课记录
- 苏教版四年级数学下册期末复习口算练习题
- 小区精装修三居室租赁合同范本
- 棋牌室租赁协议书范本
- 演员肖像权协议书范本
- 山东省济南市槐荫区2024-2025学年八年级上学期期末语文试题(含答案)
- 北京市海淀区2024-2025学年八年级上学期期末考试数学试卷(含答案)
- 2025年广西柳州市中级人民法院招录聘用工作人员17人高频重点提升(共500题)附带答案详解
- 2024年全国职业院校技能大赛高职组(研学旅行赛项)考试题库(含答案)
- 十八项核心制度
- 2024年08月浙江2024渤海银行杭州分行秋季校园招考笔试历年参考题库附带答案详解
- 2025年临床医师定期考核必考复习题库及答案(620题)
- 2025年物业公司安全生产工作计划(5篇)
- 2025社保政策培训
- 电器仪表人员培训课件
- 2025年中小学春节安全教育主题班会课件
评论
0/150
提交评论