ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:184.46KB ,
资源ID:12570529      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12570529.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(《自然语言处理导论》中文分词程序实验报告.docx)为本站会员(b****0)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

《自然语言处理导论》中文分词程序实验报告.docx

1、自然语言处理导论中文分词程序实验报告自然语言处理导论中文分词实验报告 一、实验目的了解中文分词意义掌握中文分词的基本方法二、实验环境Win7 64位DEV-C+编译器三、实验设计(一)分词策略目前较为成熟的中文分词方法主要有:1、 词典正向最大匹配法2、 词典逆向最大匹配法3、 基于确定文法的分词法4、 基于统计的分词方法一般认为,词典的逆向匹配法要优于正向匹配法。基于确定文法和基于统计的方法作为自然语言处理的两个流派,各有千秋。我设计的是根据词典逆向最大匹配法,基本思路是:1、 将词典的每个词条读入内存,最长是4字词,最短是1字词;2、 从语料中读入一段(一行)文字,保存为字符串;3、 如果

2、字符串长度大于4个中文字符,则取字符串最右边的 4个中文字符,作为候选词;否则取出整个字符串作为候选词;4、 在词典中查找这个候选词,如果查找失败,则去掉这个候选词的最左字,重复这步进行查找,直到候选词为1个中文字符;5、 将候选词从字符串中取出、删除,回到第3步直到字符串为空;6、 回到第2步直到语料已读完。(二)程序设计 查找算法: 哈希表 汉字编码格式:UTF-8程序流程图:YES 源代码:#include #include #include #include #include #include #include #include #define MaxWordLength 12 / 最

3、大词长字节(即4个汉字) #define Separator / 词界标记 #define UTF8_CN_LEN 3 / 汉字的UTF-8编码为3字节 using namespace std; using namespace _gnu_cxx; namespace _gnu_cxx template struct hash size_t operator()( const std:string& x ) const return hash()( x.c_str() ); ; hash_map wordhash; / 词典 /读入词典void get_dict(void) string str

4、tmp; /读取词典的每一行 string word; /保存每个词 typedef pair sipair; ifstream infile(CoreDict.txt.utf8); if (!infile.is_open() cerr Unable to open input file: wordlexicon - bailing out! word; /读入每行第一个词 wordhash.insert(sipair(word, 1); /插入到哈希中 infile.close(); /删除语料库中已有的分词空格,由本程序重新分词 string del_space(string s1) in

5、t p1=0,p2=0; int count; string s2; while (p2 p1) s2 += s1.substr(p1,p2-p1); p2+; p1=p2; else p2+; s2 += s1.substr(p1,p2-p1); return s2; /用词典做逆向最大匹配法分词 string dict_segment(string s1) string s2 = ; /用s2存放分词结果 while (!s1.empty() int len = (int) s1.length(); / 取输入串长度 if (len MaxWordLength) / 如果输入串长度大于最大

6、词长 len = MaxWordLength; / 只在最大词长范围内进行处理 string w = s1.substr(s1.length() - len, len); int n = (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) != wordh

7、ash.end(); w = w + Separator; s2 = w + s2; s1 = s1.substr(0, s1.length() - len); return s2; /中文分词,先分出数字 string cn_segment(string s1) /先分出数字和字母 string s2; int p1,p2; p1 = p2 = 0; while (p2 s1.length() while ( p2 = (s1.length()-UTF8_CN_LEN) & ( s1.substr(p2,UTF8_CN_LEN).at(0)9 )/不是数字或字母 p2 += UTF8_CN_

8、LEN; s2 += dict_segment(s1.substr(p1,p2-p1);/之前的句子用词典分词 /将数字和字母分出来 p1 = p2; p2 += 3; while ( p2 =0&s1.substr(p2,UTF8_CN_LEN).at(0)=9 )/是数字或字母 p2 += UTF8_CN_LEN; p1 = p2; /end while return s2; /在执行中文分词前,过滤半角空格以及其他非UTF-8字符 string seg_analysis(string s1) string s2; string s3 = ; int p1 = 0; int p2 = 0;

9、 int count; while ( p2 4)&14) 14)/过滤非utf-8字符 count = 0; do p2+; count+; while(s1p24)&14) 14) & p2 s1.length(); s2 = s1.substr(p1,p2-count-p1);/数字前的串 s3 += cn_segment(s2) + s1.substr(p2-count,count) + Separator;/数字 if (p2 = s1.length()/这个等号,当数字是最后一个字符时! s1 = s1.substr(p2,s1.length()-p2);/剩余串 p1 = p2

10、= 0; else p2 += UTF8_CN_LEN; if (p2 != 0) s3 += cn_segment(s1); return s3; ; int main(int argc, char* argv) ifstream infile(1998-01-qiefen-file.txt.utf8); / 打开输入文件 if (!infile.is_open() / 打开输入文件失败则退出程序 cerr Unable to open input file: argv1 - bailing out! endl; system(pause); exit(-1); ofstream outfi

11、le1(result.txt.utf8); /确定输出文件 if (!outfile1.is_open() cerr Unable to open file:SegmentResult.txt -bailing out! endl; system(pause); exit(-1); clock_t start, finish; double duration; start = clock(); get_dict(); finish = clock(); duration = (double)(finish - start) / CLOCKS_PER_SEC; cout 词典读入完毕,耗时 du

12、ration s endl; string strtmp; /用于保存从语料库中读入的每一行 string line; /用于输出每一行的结果 start = clock(); cout 正在分词并输出到文件,请稍候. endl; while (getline(infile, strtmp) /读入语料库中的每一行并用最大匹配法处理 line = del_space(strtmp); line = seg_analysis(line); / 调用分词函数进行分词处理 outfile1 line endl; / 将分词结果写入目标文件 finish = clock(); duration = (

13、double)(finish - start) / CLOCKS_PER_SEC; cout 分词完毕,耗时 duration s endl; cout 分词结果保存在result.txt.utf8中。 endl; system(pause); return 0; 结果和性能分析运行时间:可以看出,读入词典用时:0.421s;分词用时:6.002s。可能影响速度的包括查表方式的不同,以及存储字的格式不同等等原因。分词结果:在结果中,基本上大部分的分词都算是成功的,但是仍有部分短语分析错误。例如:“女士们”的分词被分为“女士 们”,但是本意应该为连在一起的,但是词典中并无此例,因此分析错误。四、总结总的来说,实验比较顺利。但是仍有无法解决的问题,例如因词典不完善导致的部分词语分词错误或者因为格式不同导致的无法判断等问题有待解决。分词是中文自然语言处理的基础,在现实中已经得到广泛应用。因此这个实验让我亲身体验了分词的实现过程,熟悉了分词程序的基本结果,很有收获。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1