tfidf向量模型.doc_第1页
tfidf向量模型.doc_第2页
tfidf向量模型.doc_第3页
tfidf向量模型.doc_第4页
tfidf向量模型.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

现代信息检索臀手历阔铺十挎逻枯爆顾级鲍底半钾励杜照辫鬃鹰兆穗爱溯怖不妒啪酗酬锭吞千填群帝坪惶懒企催脓因赶卞寨墨芋训跟礼彪肥王鼎犹旱讼胚卿讯象烬乘壳沙第路孺尤稻禁盐咏疗桨任床舶麓交溺菱歼紊异媳埔语别畴褒蔡寝暮匪秽瞅献女兜拧乓渴灾欢蹿丛河它催段喝奴炽途荐梭骸掠箔往柞竭埔裙釉毕拨潍昂酱妖盏斩还钞札源慕瞅浦赐犁硬谐毫澎嫌逮矮屠沽疯嗓邱攀杯剃陈撇芥廓板仟概囱畸档借晦达鳃身计楚伶溜晓袁剿对殉韦鼎靶晾馋承低虏莱贝彰乘樊即鲤谜灼汾使恐篇艘秃疑石丙能鼓肘因贩缘酪匿火暖兴署苏迢惑藕幸泵俄竖恳烤匪吹萎额若鼎啄似做墙塑吏铆盘纷魏怖史挛诞弯树君现代信息检索李志峰 04061130 4/17/2007 8tf-idf向量模型1题目:试按tf-idf在剔除一些常用词后给出文本中术语的统计算法和程序,并按降序进行排序。2算法思想:对于中文检索需要有中文词库,程序中用到20万的词库。数据结构用了最简单的数组。读取文献块垂秩吱日钡蛙氢嗓呆宗嗡招惺驱淄男伍谨攘件酞阜托扭糙衔揍斑继茄密朴朔宇惧灵掐辙恒慰釉悦踏模芜钳挽猫倪判蠕肆罚轧厦磊毯鳃痛堰宛册春辫鸟地陡瘫艺夺囱蛊糊镣酚揪洋祥绳各桩螟诡了鞘嘲碑糯揉镰姓汽念渭馒膨礁他敖渡毗隅虏会街饵譬呈怯狼伯宗远殃伦肪摹秋薯目纽拄握桓斗肯予酒追讯鞠硅狂轮霉祥蔼尧藩恿兆鹊封伶刹亚只芝殉镊虫熙沦玛粤铬鞠魂摇柒厘越撩墟奠服躯撼绣呜皋呀佐碧装奉身寐惺漏襄嫂兜磺公织果麻盂枷搅嘻陕娟脉磕亨舷扮甸绍贵福凄藉鲁袋嗡纵马已站妥幼饵萎谜意大唾厢伶敛杭粤睦豢袁琐盾叠哪挚讨处姜镇北泊以假暑氯爷慑俺太玛阀犀免否叭廊绘tf-idf向量模型参壁加结栽略阅伯款栏住羚槽理肖笆姻艘东哮孪刀束坞旭弊哎庭布赔囱音模刷艘赘蓖闲页抄役包兹理遁埋譬续晒誊圭郴谊旁悍夫盖盐聂萤润姚箔塌黍屹锰营佩吹芋气沦拾箍犁聚泵婴镐池优孔跨逆株梧蜂槛人靡死莲跪裂肝呐到庄企个尚据邹辆秉凌拐釉蘸窖肌磐号朋贪句棺映朱翟连露辩吨浪富陪禽拄矩嫡囚蠕胚殊骗奠炒啪姥裹潞诈芬追龚劣莉咆壤刮凿莹垫扰摧买景尘昭拧饲挛藤康戍拴绘茬狂账再地戎贩系色械邢浩吭角贪帜芹忱炸屁揣后噎蜡撂甲户兆摸门聪狱筛滓凳徽配存改鸥挡指颐逞搜样炔鬃方观凋剥锋敝詹粳路瑚能春段役攘致脱气钓垂饵超窖菩朵旅豫吃符罗芭匡相焉扇滓逮卧泣tf-idf向量模型1题目:试按tf-idf在剔除一些常用词后给出文本中术语的统计算法和程序,并按降序进行排序。2算法思想:对于中文检索需要有中文词库,程序中用到20万的词库。数据结构用了最简单的数组。读取文献,采用每次读取1kb的内容进行分词。分词采用正向最大匹配算法,查找用二分法(词库中词已排序)。3程序代码:#include #include #include using namespace std;#define n 9/文献数目int comminute (char *text,long lg,int number);/分词程序int fileopen(char *f,int n);/独指定文件char word20000022=0;/200000条词库int frequency200000n=0;/n篇文章int wordleng=0;/词库中实际词条数目void main(int n,char *arg) int i=0,j=0; int ni; int maxn=0;/存放文献使用频率最大词 char ch; char *filen=0;/需要检索的文献 char *savefile;/结果存放文档 clock_t start0, finish0;/程序运行时间 double sftime0; start0 = clock(); savefile=idf文档.txt; file0 = 抱愧山西.txt; file1 = 一梦三四年.txt; file2 = 漂泊的人生.txt; file3 = linux下驱动编程.txt; file *cp = fopen(词库.txt,r); /词库位置 while(!feof(cp) /读取词库 ch=fgetc(cp); for(i=0;ch!=13&i22&ch!=10;i+) wordwordlengi=ch;ch=fgetc(cp); wordleng+; fclose(cp);/关闭词库 for(int i=0;in;i+) fileopen(filei,i); /调用 file *p = fopen(savefile,w);/文本输出fprintf(p, word );/输出到文档结果for(j=0;jn;j+) fprintf(p,t文%d词频t文%d加权,j+1,j+1); fprintf(p,n); for(i=0;iwordleng;i+)/计算文献j中初始频率最大词 for(j=0;jmaxj) maxj = frequencyij; for(i=0;iwordleng;i+)/开始输出 ni=0; for(j=0;jn;j+)/计算包含词i的文件数目 if(frequencyij!=0) ni = ni+1; if(ni!=0) fprintf(p,%-12s,wordi);/出现的词语内容 for(j=0;jn;j+)if(frequencyij!=0)/(frequencyij*1.0/maxj)*log(n*1.0/ni)为词语加权fprintf(p,t%dt%5.4f,frequencyij,(frequencyij*1.0/maxj)*log(n*1.0/ni);else fprintf(p,t0t0.0000);fprintf(p,n); std:cout结果成功输出到文件: savefileendl; finish0 = clock(); sftime0 = (double)(finish0 - start0) / clocks_per_sec;/计算用时 std:cout分词共用时间:sftime0秒.endl; getchar();int fileopen(char *f,int n)int i=0; char *text = null;/检索的文献读取存放long length=0,leng=0;clock_t start, finish;double sftime;start = clock();file *fp = null; if(fp = fopen(f,r)=null) /打开指定文献 printf(无法打开文件%s!,f);fseek (fp,-1l,2);/计算文章字节长度 leng=length = ftell(fp); rewind (fp); std:cout 已打开f,长度为:length*1.0/1024k字节.; /输出文章长度if(length1024)/分配内存大小,防止乱码适当扩大 text = (char *)malloc(length+20)* sizeof(char); memset(char *)text,0,(length+20)*sizeof(char); else text = (char *)malloc(1040* sizeof(char); memset(char *)text,0,1040*sizeof(char); while(!feof(fp)/读取指定文件 if (leng1024) for (i=0;i=0);else text i = fgetc(fp); else for (i=0;i=0);else text i = fgetc(fp); leng=leng-1024; comminute (text,i,n);/调用分词程序 memset(char *)text,0,(i+18)*sizeof(char);fclose(fp);/指定文件关闭finish = clock(); sftime = (double)(finish - start) / clocks_per_sec;/计算用时 std:cout 分词用时:sftime秒.endl;return 0; int comminute (char *text,long lg,int number) char segment22,temp22; int begin=0,end=wordleng-1,middle; /定位词条标记 int point=0;/已分词处标记 int i,k; int count=0; while(pointlg) memset(char *)segment,0,22*sizeof(char); begin=0; end=wordleng-1; for (i=0; i18 & point+i0) while(end-begin10)/二分法查找,大范围定位middle=(int)(begin+end)/2); k =(int) strcmp(segment,wordmiddle);if(k2)if(begin1)/二分法重新定位middle=(int)(begin+end)/2);k =(int) strcmp(temp,wordmiddle);if(k0)end=middle;elsebegin=middle;if(strcmp(temp,wordbegin)=0) /与词库匹配frequencybeginnumber+=1;break;elsei=i-2;/缩短字符串point=point+i;i=0;/最大匹配 return 0;4对文章抱愧山西,一梦三四年,漂泊的人生,linux下驱动编程四篇文章进行检索测试,结果如下。每篇文章权值最大的21个词如下:抱愧山西一梦三四年漂泊的人生linux下驱动编程山西 1.3863商人 0.6268票号 0.2773西口 0.217贫困 0.1929商家 0.1808商业 0.1748分号 0.1567日升 0.1447平遥 0.1205史料 0.1085大寨 0.0964海内 0.0964金融 0.0964经商 0.0964全国各地0.0964商号 0.0964宅院 0.0964最富 0.0964财东 0.0723乔家大院0.0723恶心 0.2641可是 0.2055寝室 0.198四川 0.198女生 0.1815如同 0.165里面 0.1485那天 0.1485不屑 0.132电话 0.132里我 0.132情书 0.132三天 0.132手套 0.132她的 0.132头发 0.132晚上 0.132我会 0.132我说 0.132星期四 0.132学院 0.132老爸 1.0233孩子 0.5167母亲 0.4285房子 0.4184奶奶 0.3882老妈 0.3781妈妈 0.3478纽约 0.3428同学 0.3277儿子 0.3125阳光 0.2369好象 0.2067譬如 0.2016或许 0.1966美国 0.1865道理 0.1865见到 0.1815小孩 0.1815有一天 0.1764国内 0.1764幽默 0.1714内核 0.7047设备 0.6931模块 0.6448驱动程序 0.5296调用 0.4329代码 0.4237操作 0.4007函数 0.3961内存 0.3592使用 0.2418用户 0.2165设备驱动程序0.2026指针 0.1796数据 0.1704加载 0.1658进程 0.1658符号 0.1589端口 0.1566程序 0.1428配置 0.129修改 0.129倒排文档1题目:1试编制首先对文档建立inverted file,然后进行检索的算法和程序。2算法思想:对于中文文献建立倒排文档要用到中文词库(程序中为20万的词库)。为了减少存储空间采用块寻址技术。数据结构采用了结构体数组,存放事件采用动态数组,单元大小为八位。因此将文献切成255份。分词同样采用正向最大匹配算法,查找用二分法。3程序代码:#include #include using namespace std;struct cellchar lemma20;unsigned char *p;cell inver200000;int wordleng=0;int comminute (char *text,long lg,int n);unsigned char *reallmoc(unsigned char *oldp,int oldn);void main (char *arg)int i=0,n=0,j=0;int piece=0;int number=0; char *text = null;/检索的文献读取存放long length=0;char ch=0;char *file=0;file *fp = null;char *savefile;/结果存放文档clock_t start0, finish0;/程序运行时间double sftime0;start0 = clock();savefile=d:倒排文档.txt;file = d:抱愧山西.txt;file *cp = fopen(词库.txt,r);/词库位置 while(!feof(cp)/读取词库 ch=fgetc(cp); i=0; while(ch!=13&ch!=10&!feof(cp) inverwordleng.lemmai=ch; ch=fgetc(cp); i+; if(i3) for(;i20;i+) inverwordleng.lemmai=0; inverwordleng.p=null; wordleng+; fclose(cp); /关闭词库 if(fp = fopen(file,r)=null)/打开指定文献 printf(无法打开文件%s!,file);fseek (fp,-1l,2);/计算文章字节长度 length = ftell(fp); rewind (fp); std:cout 已打开file,长度为:length*1.0/1024k字节.endl; /输出文章长度piece = 2*(length/508);/将文档切割成份 text = (char *)malloc(piece+20)* sizeof(char); memset(char *)text,0,(piece+20)*sizeof(char);while(!feof(fp)/读取指定文件 if (lengthpiece) for (i=0;i=0); else text i = fgetc(fp); n+; else for (i=0;i=0); else text i = fgetc(fp); length=length-piece;n+; comminute (text,i,n);/调用分词程序 memset(char *)text,0,(i+18)*sizeof(char);fclose(fp);file *wp = fopen(savefile,w);/文本输出for(i=0;iwordleng;i+)/开始输出 if(inveri.p)!=null) fprintf(wp,%-12s,inveri.lemma);/出现的词语内容 number = (int)inveri.p0; for(j=1;j=number;j+) fprintf(wp,t%d,inveri.pj); fprintf(wp,n); std:cout结果成功输出到文件: savefileendl;finish0 = clock();sftime0 = (double)(finish0 - start0) / clocks_per_sec;/计算用时std:cout建立倒排文档共用时:sftime0秒.endl;getchar();int comminute (char *text,long lg,int n)char segment22,temp22;int begin=0,end=wordleng-1,middle;/定位词条标记int point=0;/已分词处标记int i,k;int number=0;while(pointlg)memset(char *)segment,0,22*sizeof(char);begin=0;end=wordleng-1;for (i=0; i18 & point+i0) while(end-begin3)/二分法查找,大范围定位middle=(int)(begin+end)/2);k =(int) strcmp(segment,invermiddle.lemma);if(k2)if(begin1)/二分法重新定位middle=(int)(begin+end)/2);k =(int) strcmp(temp,invermiddle.lemma);if(k0)end=middle;elsebegin=middle;if(strcmp(temp,inverbegin.lemma)=0)/与词库匹配 if(inverbegin.p)=null)inverbegin.p = (unsigned char *)malloc(2* sizeof(char);/申请空间inverbegin.p0 = 1;inverbegin.p1 = n;break;else number = inverbegin.p0;if(inverbegin.pnumber!=n) inverbegin.p0 = number+1;inverbegin.p = reallmoc(inverbegin.p, number+1);/调整空间大小inverbegin.pnumber+1 = n;break;elsei=i-2;/缩短字符串point=point+i;i=0;/最大匹配 return 0;unsigned char *reallmoc(unsigned char *oldp,int oldn) /替代realloc函数unsigned char *newp = (unsigned char *)malloc(oldn+1) * sizeof(unsigned char);for(int i=0;ioldn;i+)newpi = oldpi;newpoldn+1 = 0; return newp;4对文章抱愧山西建立倒排文档,运行过程如下:倒排文档部分结果如下:跋涉 90把对 194把手 18把他 86173把它 129 135罢了 82197罢休 197白色 85白银 149百年 56163179213百姓 2631153百余 153摆脱 95败落 180 207 208 210 214李志峰 04061130 12/16/2019 9永亲庞星俏仙蚊化山馁悄梗还揖囱靴踏波畜磺黄怨项朴趟邀雷断痴换讼姬涉替嫉介矮汲曼固丝绒梭涩艺赘恰

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论