欢迎来到天天文库
浏览记录
ID:33674459
大小:134.00 KB
页数:9页
时间:2019-02-28
《《自然语言处理导论》中文分词程序实验报告new》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、《自然语言处理导论》中文分词实验报告一、实验目的了解中文分词意义掌握中文分词的基本方法二、实验环境Win764位DEV-C++编译器三、实验设计(一)分词策略目前较为成熟的中文分词方法主要有:1、词典正向最大匹配法2、词典逆向最大匹配法3、基于确定文法的分词法4、基于统计的分词方法一般认为,词典的逆向匹配法要优于正向匹配法。基于确定文法和基于统计的方法作为自然语言处理的两个流派,各有千秋。我设计的是根据词典逆向最大匹配法,基本思路是:1、将词典的每个词条读入内存,最长是4字词,最短是1字词;2、从语料中读入一段(一行)文字,保存为字符串;3、如果字符串长度大于4个中文字符,则取字符串最
2、右边的4个中文字符,作为候选词;否则取出整个字符串作为候选词;4、在词典中查找这个候选词,如果查找失败,则去掉这个候选词的最左字,重复这步进行查找,直到候选词为1个中文字符;5、将候选词从字符串中取出、删除,回到第3步直到字符串为空;6、回到第2步直到语料已读完。(二)程序设计查找算法:哈希表汉字编码格式:UTF-8程序流程图:NOYESNONONONOYESYESYESYES匹配结束匹配结束匹配结束源代码:#include#include#include#include#include
3、#include#include#include#defineMaxWordLength12//最大词长字节(即4个汉字)#defineSeparator""//词界标记#defineUTF8_CN_LEN3//汉字的UTF-8编码为3字节usingnamespacestd;usingnamespace__gnu_cxx;namespace__gnu_cxx{template<>structhash{size_toperator()(conststd::string&x)const{returnhash4、nstchar*>()(x.c_str());}};}hash_mapwordhash;//词典//读入词典voidget_dict(void){stringstrtmp;//读取词典的每一行stringword;//保存每个词typedefpairsipair;ifstreaminfile("CoreDict.txt.utf8");if(!infile.is_open()){cerr<<"Unabletoopeninputfile:"<<"wordlexicon"<<"--bailingout!"<5、");exit(-1);}while(getline(infile,strtmp))//读入词典的每一行并将其添加入哈希中{istringstreamistr(strtmp);istr>>word;//读入每行第一个词wordhash.insert(sipair(word,1));//插入到哈希中}infile.close();}//删除语料库中已有的分词空格,由本程序重新分词stringdel_space(strings1){intp1=0,p2=0;intcount;strings2;while(p26、2>p1)s2+=s1.substr(p1,p2-p1);p2++;p1=p2;}else{p2++;}}s2+=s1.substr(p1,p2-p1);returns2;}//用词典做逆向最大匹配法分词stringdict_segment(strings1){strings2="";//用s2存放分词结果while(!s1.empty()){intlen=(int)s1.length();//取输入串长度if(len>MaxWordLength)//如果输入串长度大于最大词长{len=MaxWordLength;//只在最大词长范围内进行处理}stringw=s1.substr(s17、.length()-len,len);intn=(wordhash.find(w)!=wordhash.end());//在词典中查找相应的词while(len>UTF8_CN_LEN&&n==0)//如果不是词{len-=UTF8_CN_LEN;//从候选词左边减掉一个汉字,将剩下的部分作为候选词w=s1.substr(s1.length()-len,len);n=(wordhash.find(w)!=wordhash.end());}w=w
4、nstchar*>()(x.c_str());}};}hash_mapwordhash;//词典//读入词典voidget_dict(void){stringstrtmp;//读取词典的每一行stringword;//保存每个词typedefpairsipair;ifstreaminfile("CoreDict.txt.utf8");if(!infile.is_open()){cerr<<"Unabletoopeninputfile:"<<"wordlexicon"<<"--bailingout!"<5、");exit(-1);}while(getline(infile,strtmp))//读入词典的每一行并将其添加入哈希中{istringstreamistr(strtmp);istr>>word;//读入每行第一个词wordhash.insert(sipair(word,1));//插入到哈希中}infile.close();}//删除语料库中已有的分词空格,由本程序重新分词stringdel_space(strings1){intp1=0,p2=0;intcount;strings2;while(p26、2>p1)s2+=s1.substr(p1,p2-p1);p2++;p1=p2;}else{p2++;}}s2+=s1.substr(p1,p2-p1);returns2;}//用词典做逆向最大匹配法分词stringdict_segment(strings1){strings2="";//用s2存放分词结果while(!s1.empty()){intlen=(int)s1.length();//取输入串长度if(len>MaxWordLength)//如果输入串长度大于最大词长{len=MaxWordLength;//只在最大词长范围内进行处理}stringw=s1.substr(s17、.length()-len,len);intn=(wordhash.find(w)!=wordhash.end());//在词典中查找相应的词while(len>UTF8_CN_LEN&&n==0)//如果不是词{len-=UTF8_CN_LEN;//从候选词左边减掉一个汉字,将剩下的部分作为候选词w=s1.substr(s1.length()-len,len);n=(wordhash.find(w)!=wordhash.end());}w=w
5、");exit(-1);}while(getline(infile,strtmp))//读入词典的每一行并将其添加入哈希中{istringstreamistr(strtmp);istr>>word;//读入每行第一个词wordhash.insert(sipair(word,1));//插入到哈希中}infile.close();}//删除语料库中已有的分词空格,由本程序重新分词stringdel_space(strings1){intp1=0,p2=0;intcount;strings2;while(p26、2>p1)s2+=s1.substr(p1,p2-p1);p2++;p1=p2;}else{p2++;}}s2+=s1.substr(p1,p2-p1);returns2;}//用词典做逆向最大匹配法分词stringdict_segment(strings1){strings2="";//用s2存放分词结果while(!s1.empty()){intlen=(int)s1.length();//取输入串长度if(len>MaxWordLength)//如果输入串长度大于最大词长{len=MaxWordLength;//只在最大词长范围内进行处理}stringw=s1.substr(s17、.length()-len,len);intn=(wordhash.find(w)!=wordhash.end());//在词典中查找相应的词while(len>UTF8_CN_LEN&&n==0)//如果不是词{len-=UTF8_CN_LEN;//从候选词左边减掉一个汉字,将剩下的部分作为候选词w=s1.substr(s1.length()-len,len);n=(wordhash.find(w)!=wordhash.end());}w=w
6、2>p1)s2+=s1.substr(p1,p2-p1);p2++;p1=p2;}else{p2++;}}s2+=s1.substr(p1,p2-p1);returns2;}//用词典做逆向最大匹配法分词stringdict_segment(strings1){strings2="";//用s2存放分词结果while(!s1.empty()){intlen=(int)s1.length();//取输入串长度if(len>MaxWordLength)//如果输入串长度大于最大词长{len=MaxWordLength;//只在最大词长范围内进行处理}stringw=s1.substr(s1
7、.length()-len,len);intn=(wordhash.find(w)!=wordhash.end());//在词典中查找相应的词while(len>UTF8_CN_LEN&&n==0)//如果不是词{len-=UTF8_CN_LEN;//从候选词左边减掉一个汉字,将剩下的部分作为候选词w=s1.substr(s1.length()-len,len);n=(wordhash.find(w)!=wordhash.end());}w=w
此文档下载收益归作者所有