版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
...wd......wd......wd...分词系统工程报告课程:自然语言理解姓名:王佳淼学号:2011914班级:信息安全11-1日期:2013-11-2实验一宋词字统计一.研究背景本实验所涉及的研究背景是利用计算机来“鉴赏〞宋词。主要针对宋词这种特殊的汉语诗歌体裁,开展了有关自动生成算法及其实现方法的探索性研究。通过对大量语料的学习,来自动生成宋词。由于宋词自身的特性,能够在经过大量预料学习后,利用在宋词当中出现频率较高的词语或者单字排列组合来生成宋词。二.实验所采用的开发平台及语言工具实验在WIN7的环境下利用VC++编程。三.系统设计算法基本思想从文本中字符,判断是否为中文字符〔全角字符〕,假设为全角字符那么根据需要继续读取,即读取两个或三个字。利用map容器来存储统计结果。流程图代码①字统计#include<map>#include<fstream>#include<iostream>#include<string>usingnamespacestd;//宋词的统计voiddisplay_map(map<string,int>&wmap);ofstreamofs("c:\\fenciout2.txt");intmain(){ cout<<"开场:"<<endl;constchar*szInputFileName="c:\\Text.txt";ifstreamifs(szInputFileName);stringszTemp; stringstr1,str2,str3,str; chara[10];//map<string,int>wmap;//统计双字的while(ifs) { while(ifs.peek()=='\n')ifs.get(); while(ifs.peek()=='')ifs.get(); while(!ifs.peek()&0x80)ifs.get(); ifs.get(a,3,''); if(a[0]&0x80) { str1=a; while(ifs.peek()=='\n')continue; while(ifs.peek()=='')continue; while(!ifs.peek()&0x80)ifs.get(); ifs.get(a,3,''); if(a[0]&0x80)str2=a; if(str1!=","&&str1!="。"&&str1!=""&&str1!="!"&&str1!=""&&str2!=","&&str2!="。"&&str2!=""&&str2!="!"&&str2!="") { szTemp=str1+str2; wmap[szTemp]++; } if(ifs.peek()!='\n'&&ifs.peek()!='')ifs.seekg(-2,ios::cur); } } ifs.close(); //三字 ifstreamifs1(szInputFileName);while(ifs1) {while(ifs1.peek()=='\n')ifs1.get(); while(ifs1.peek()=='')ifs1.get(); while(!ifs1.peek()&0x80)ifs1.get(); ifs1.get(a,3,''); if(a[0]&0x80) { str1=a; while(ifs1.peek()=='\n')continue; while(ifs1.peek()=='')continue; while(!ifs1.peek()&0x80)ifs1.get(); ifs1.get(a,3,''); if(a[0]&0x80)str2=a; elsecontinue; while(ifs1.peek()=='\n')continue; while(ifs1.peek()=='')continue; while(!ifs1.peek()&0x80)ifs1.get(); ifs1.get(a,3,''); if(a[0]&0x80)str3=a; elsecontinue; if(str1!=","&&str1!="。"&&str1!=""&&str1!="!"&&str1!=""&&str2!=","&&str2!="。"&&str2!=""&&str2!="!"&&str2!=""&&str3!=","&&str3!="。"&&str3!=""&&str3!="!"&&str3!="") { szTemp=str1+str2+str3; wmap[szTemp]++; } if(ifs1.peek()!='\n'&&ifs1.peek()!='')ifs1.seekg(-4,ios::cur); } } ifs1.close();//单字 ifstreamifs2(szInputFileName);while(ifs2) { while(ifs2.peek()=='\n')ifs2.get(); while(ifs2.peek()=='')ifs2.get(); while(!ifs2.peek()&0x80)ifs2.get(); ifs2.get(a,3,''); if(a[0]&0x80) { str=a; } if(str!=","&&str!="。"&&str!=""&&str!="!"&&str!="") { szTemp=str; wmap[szTemp]++; } } ifs2.close();display_map(wmap);returnfalse;}voiddisplay_map(map<string,int>&wmap){ intsum=0; map<string,int>::const_iteratormap_it;for(map_it=wmap.begin();map_it!=wmap.end();map_it++)//统计总数{ sum+=map_it->second;}for(map_it=wmap.begin();map_it!=wmap.end();map_it++)//计算词频{cout<<"(\""<<map_it->first<<"\","<<map_it->second<<")"; cout<<(double)map_it->second/(sum-1)<<endl;} for(map_it=wmap.begin();map_it!=wmap.end();map_it++)//计算词频{ofs<<"(\""<<map_it->first<<"\","<<map_it->second<<")"; ofs<<(double)map_it->second/sum<<endl;}}②宋词生成#include<map>#include<fstream>#include<iostream>#include<string>usingnamespacestd;voiddisplay_map(map<string,int>&wmap);voidci(inta);map<string,int>wmap; map<string,int>wmapp;intmain(){ cout<<"开场:"<<endl;constchar*szInputFileName="c:\\Text.txt";ifstreamifs(szInputFileName);stringszTemp,szTempp; stringstr1,str2,str; chara[10];////统计双字的while(ifs) { while(ifs.peek()=='\n')ifs.get(); while(ifs.peek()=='')ifs.get(); ifs.get(a,3,''); if(a[0]&0x80) { str1=a; while(ifs.peek()=='\n')continue; while(ifs.peek()=='')continue; ifs.get(a,3,''); if(a[0]&0x80)str2=a; if(str1!=","&&str1!="。"&&str1!=""&&str1!="!"&&str1!=""&&str2!=","&&str2!="。"&&str2!=""&&str2!="!"&&str2!="") { szTemp=str1+str2; wmap[szTemp]++; } if(ifs.peek()!='\n'&&ifs.peek()!='')ifs.seekg(-2,ios::cur); } } ifs.close();//display_map(wmap);//单字 ifstreamifs1(szInputFileName);while(ifs1) { while(ifs1.peek()=='\n')ifs1.get(); while(ifs1.peek()=='')ifs1.get(); ifs1.get(a,3,''); if(a[0]&0x80) { str=a; } if(str!=","&&str!="。"&&str!=""&&str!="!"&&str!="") { szTemp=str; wmapp[szTemp]++; } } ifs1.close();//display_map(wmapp); intas; while(1) { cout<<"请随意输入一个数来创造宋词:(输入0时退出)"<<endl; cin>>as; if(as==0)return0; ci(as); cout<<endl<<endl; cout<<"-----------------------------------------------------------------------------"<<endl; cout<<endl<<endl; }returnfalse;}voidci(inta){ cout<<"如梦令"<<endl; map<string,int>::iteratormap_it; for(inti=0;i<3;i++) { map_it=wmap.begin(); for(intj=0;j<(rand()+a*2)%(wmap.size());j++)map_it++; cout<<map_it->first; } cout<<"。"; for(i=0;i<3;i++) { map_it=wmap.begin(); for(intj=0;j<rand()%(a);j++)map_it++; cout<<map_it->first; } cout<<"。"; for(i=0;i<2;i++) { map_it=wmap.begin(); for(intj=0;j<rand()%(wmap.size());j++)map_it++; cout<<map_it->first; } map_it=wmapp.begin(); for(intj=0;j<(rand()+a*3)%(wmapp.size());j++)map_it++; cout<<map_it->first; cout<<","; for(i=0;i<3;i++) { map_it=wmap.begin(); for(intj=0;j<(rand()+a)%(wmap.size());j++)map_it++; cout<<map_it->first; } cout<<"。"; map_it=wmap.begin(); for(j=0;j<(2*rand()+a)%(wmap.size());j++)map_it++; stringtemp=map_it->first; cout<<temp<<"。"<<temp<<"。"; for(i=0;i<3;i++) { map_it=wmap.begin(); for(intj=0;j<(a*rand())%(wmap.size());j++)map_it++; cout<<map_it->first; } cout<<"。"<<endl; }voiddisplay_map(map<string,int>&wmap){map<string,int>::const_iteratormap_it;for(map_it=wmap.begin();map_it!=wmap.end();map_it++){cout<<"(\""<<map_it->first<<"\","<<map_it->second<<")"<<endl;}}四.系统演示与分析〔1〕截图①字统计:②宋词生成〔如梦令〕:〔2〕结果分析五.对次实验的感想、意见和建议通过此次实验,能熟练利用MAP容器,为接下来的两个实验打好根基。也能对汉字进展操作,清楚的了解到汉字在计算机中的存储方式有别于字符型。利用位运算&来与0x80进展比对以区分全角字符和半角字符。但因为将字作为了map的key值,所以输出的列并不是按照出现频率由大到小,这是可以进展改进的方面。在宋词生成的程序中,主要是利用随机输入的数字来产生伪随机数,以便利用产生的伪随机数选择不同出现频率的词组来生成宋词。我觉得可以改进的方面是,在统计时就能用程序自动获取不同词牌名的不同格式,在生成宋词时能选择不同的词牌名以生成不同宋词,使程序更加智能。实验二人民日报词频统计一.研究背景词是自然语言中能够独立运用的最小单位,是自然语言处理的基本单位。自动词法分析就是利用计算机对自然语言的形态(morphology)进展分析,判断词的构造和类别等。而词频统计是分词系统的根基和关键,只有在正确、准确、快速的词频统计的情况下才能很好的进展分词算法。二.实验所采用的开发平台及语言工具实验在WIN7的环境下利用VC++编程。三.系统设计〔1〕算法基本思想从文本中字符,判断是否为中文字符〔全角字符〕,假设为全角字符那么根据需要继续读取,即读取两个或三个字。利用map容器来存储统计结果。流程图〔3〕代码#include<map>#include<fstream>#include<iostream>#include<string>#include<vector>#include<algorithm>usingnamespacestd;//人民日报的词频统计typedefpair<string,int>PAIR;vector<PAIR>vecpair;voiddisplay_map(map<string,int>&wmap);ofstreamofs("c:\\fenciout.txt");intcmp(constPAIR&x,constPAIR&y)//vector的sort〔〕降序排列{returnx.second>y.second;}intmain(){ cout<<"开场:"<<endl;constchar*szInputFileName="c:\\cidian.txt";ifstreamifs(szInputFileName);stringszTemp; stringstr1,str2,str3,str; chara[100];//map<string,int>wmap; map<string,int>wmapok;//统计while(ifs) { szTemp=""; inti=0; ifs>>a[i];//逐个字符读入 if(ifs.eof()) break; if(!(a[i]&0x80))//非中文 continue; if(!(a[i]&0xB0))//除去空格 { ifs>>a[i]; continue; } while(a[i]!='/')//读取 { szTemp+=a[i]; i++; ifs>>a[i]; } wmap[szTemp]++;//对应字频加1 } ifs.close(); //map根据value排序 map<string,int>::const_iteratorcurr; for(curr=wmap.begin();curr!=wmap.end();++curr) { vecpair.push_back(make_pair(curr->first,curr->second)); }sort(vecpair.begin(),vecpair.end(),cmp);//调用排序函数,那么vecpair中的first是词,而且降序排列 for(inti=0;i<vecpair.size();i++){ofs<<"<"<<vecpair[i].first<<","<<vecpair[i].second<<">"<<endl;} display_map(wmap); return;}voiddisplay_map(map<string,int>&wmap){ intsum=0; map<string,int>::const_iteratormap_it;for(map_it=wmap.begin();map_it!=wmap.end();map_it++)//统计总数{ sum+=map_it->second;}for(map_it=wmap.begin();map_it!=wmap.end();map_it++)//计算词频,在界面上输出,此时是无序的{cout<<"(\""<<map_it->first<<"\","<<map_it->second<<")"; cout<<(double)map_it->second/sum<<endl;} }四.系统演示与分析〔1〕截图排序后:〔2〕结果分析五.对次实验的感想、意见和建议在这次实验后,能含有分词字符的文件进展读取,利用语料来训练程序,并将结果保存在文件当中,以便实验三可以使用。而且能够进展排序,按照value的值,即词语出现次数由高到低进展排序。美中缺乏的是,程序运行速度有待提高。由于map是按照键值排序的,所以引入了vector,并利用vector的sort函数进展排序,熟悉了这两种容器的使用,提高了对c++库函数的认识。实验三人民日报分词一.研究背景自动词法分析就是利用计算机对自然语言的形态(morphology)进展分析,判断词的构造和类别等。自动分词是汉语句子分析的根基,而且,词语的分析具有广泛的应用〔词频统计,词典编纂,文章风格研究等〕二.模型方法正向最大匹配算法(ForwardMM,FMM)。这种算法使得程序简单易行,开发周期短,而且仅需要很少的语言资源〔词表〕,不需要任何词法、句法、语义资源。三.系统设计〔1〕算法基本思想FMM算法描述:(1)令i=0,当前指针pi指向输入字串的初始位置,执行下面的操作:(2)计算当前指针pi到字串末端的字数〔即未被切分字串的长度〕n,如果n=1,转(4),完毕算法。否那么,令m=词典中最长单词的字数,如果n<m,令m=n;(3)从当前pi起取m个汉字作为词wi,判断:(a)如果wi确实是词典中的词,那么在wi后添加一个切分标志,转(c);(b)如果wi不是词典中的词且wi的长度大于1,将wi从右端去掉一个字,转(a)步;否那么〔wi的长度等于1〕,那么在wi后添加一个切分标志〔单字〕,执行(c)步;(c)根据wi的长度修改指针pi的位置,如果pi指向字串末端,转(4),否那么,i=i+1,返回(2);(4)输出切分结果,完毕分词程序。流程图图1.分词流程图图2.FMM算法流程图〔3〕代码#include<map>#include<fstream>#include<iostream>#include<string>#include<vector>#include<algorithm>usingnamespacestd;//人民日报的词频统计typedefpair<string,int>PAIR;vector<PAIR>vecpair;ofstreamofs("c:\\fenciout.txt");intcmp(constPAIR&x,constPAIR&y){returnx.second>y.second;}intmain(){ cout<<"开场:"<<endl;constchar*szInputFileName="c:\\cidian.txt";ifstreamifs(szInputFileName);stringszTemp; stringstr1,str2,str3,str; chara[100];//map<string,int>wmap; map<string,int>wmapok;//统计while(ifs) { szTemp=""; inti=0; ifs>>a[i];//逐个字符读入 if(ifs.eof()) break; if(!(a[i]&0x80))//非中文 continue; if(!(a[i]&0xB0))//除去空格 { ifs>>a[i]; continue; } while(a[i]!='/') { szTemp+=a[i]; i++; ifs>>a[i]; } wmap[szTemp]++;//对应字频加1 } ifs.close(); //map根据value排序 map<string,int>::const_iteratorcurr; for(curr=wmap.begin();curr!=wmap.end();++curr) { vecpair.push_back(make_pair(curr->first,curr->second)); }sort(vecpair.begin(),vecpair.end(),cmp);//调用排序函数,那么vecpair中的first是词,而且降序排列 for(inti=0;i<vecpair.size();i++){ofs<<vecpair[i].first<<endl;} ofs.close(); ifstreaminfile2; infile2.open("c:\\fenciout.txt",ios::in); if(!infile2) { cerr<<"文件翻开错误"<<endl; exit(1); } vector<string>arr1,arr2;//1是读取词典,2是存储分好的句子 stringword; stringtext="台湾是中国领土不可分割的一局部,这是大势所趋。"; cout<<"原句是:台湾是中国领土不可分割的一局部,这是大势所趋。"<<endl<<endl; while(getline(infile2,word)) { arr1.push_back(word); } stringtemp1=text; stringtemp2=temp1; intp1=0; while(strlen(temp2.c_str())!=0) { for(inti=strlen(temp2.c_str());i>=0;i-=2) { if(find(arr1.begin(),arr1.end(),temp1)!=arr1.end()) { temp1+="/"; arr2.push_back(temp1); p1=i; break; } else { temp1=temp2.substr(0,i-2); } } temp2=temp2.substr(p1);//还没有分的赋值给temp1 temp1=temp2; } cout<<"分词结果为:"<<endl; fo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 药师审核调剂工作制度
- 药物治疗学组工作制度
- 血透室病案室工作制度
- 街道民心网工作制度
- 街道社会救助工作制度
- 街道长效办工作制度
- 装修公司监理工作制度
- 视光中心岗位工作制度
- 规范医疗行为工作制度
- 规范计生药具工作制度
- 2025西部科学城重庆高新区招聘急需紧缺人才35人参考笔试题库及答案解析
- 2025辽宁葫芦岛市总工会招聘工会社会工作者5人笔试考试参考试题及答案解析
- 经济学的思维方式全套课件
- 郑钦文事迹介绍
- 中外舞蹈史课程大纲
- 载人飞艇系留场地净空要求细则
- 大棚螺旋桩施工方案
- 中数联物流科技(上海)有限公司招聘笔试题库2025
- DB4401∕T 147-2022 游泳场所开放条件与技术要求
- DB65∕T 4767-2024 普通国省干线公路服务设施建设技术规范
- 制氧站建设合同3篇
评论
0/150
提交评论