中文分词程序实验报告含源代码.pdf
《中文分词程序实验报告含源代码.pdf》由会员分享,可在线阅读,更多相关《中文分词程序实验报告含源代码.pdf(19页珍藏版)》请在咨信网上搜索。
1、北京邮电大学计算机学院北京邮电大学计算机学院自然语言处理导论自然语言处理导论中文分词实验报告中文分词实验报告姓 名:许伟林 学 号:08211306 指导教师:郑岩 日 期:2010/12/22 1内容目录内容目录一、实验目的.3二、实验环境.3三、实验材料.3四、实验设计.3一、分词策略.3词典逆向最大匹配法.4基于确定文法的分词法.4二、程序设计.4查找算法:哈希表查找.4汉字编码格式:UTF-8.5程序流程图.6程序源代码.8五、结果和性能分析.16分词结果示例.16性能分析.17六、有待解决的问题.18七、实验总结.192一、实验目的一、实验目的了解中文分词的意义掌握中文分词的基本方法
2、二、实验环境二、实验环境UBUNTU 10.05GCC v4.4.3三、实验材料三、实验材料中文常用词词典人民日报1998年合订本四、实验设计四、实验设计一、分词策略一、分词策略据我的了解,目前较为成熟的中文分词方法主要有:1、词典正向最大匹配法2、词典逆向最大匹配法3、基于确定文法的分词法4、基于统计的分词方法一般认为,词典的逆向匹配法要优于正向匹配法。基于确定文法和基于统计的方法作为自然语言处理的两个流派,各有千秋。3由于时间仓促,且水平有限,本程序只实现了第 2 种和第 3种分词法,即词典逆向最大匹配法和基于确定文法的分词法。词典逆向最大匹配法词典逆向最大匹配法词典逆向最大匹配法完成分词
3、的大部分工作,设计思路是这样的:1、将词典的每个词条读入内存,最长是4字词,最短是1字词;2、从语料中读入一段(一行)文字,保存为字符串;3、如果字符串长度大于 4个中文字符,则取字符串最右边的 4 个中文字符,作为候选词;否则取出整个字符串作为候选词;4、在词典中查找这个候选词,如果查找失败,则去掉这个候选词的最左字,重复这步进行查找,直到候选词为1个中文字符;5、将候选词从字符串中取出、删除,回到第3步直到字符串为空;6、回到第2步直到语料已读完。基于确定文法的分词法基于确定文法的分词法基于确定文法的分词法可以进行数字、西文、时间的分词,设计思路是这样的:1、增加一个词典,存储中文编码(全
4、角)的大小写拉丁字母、中文小写数字、阿拉伯数字、数字单位(百、千、万、亿、兆)、小数点、百分号、除号;词类型记为D1;2、增加一个词典,存储中文编码的时间单位,包括年、月、日、时、分、秒、点;词类型记为D2;3、文法的正则表达式为D1*D2?。二、程序设计二、程序设计查找算法:哈希表查找查找算法:哈希表查找除了分词结果的准确性,程序的性能也是至关重要的。由于本程序采用了词典法来分词,执行过程需要检索大量数据,因此查找效率成为程序性能的决定性因素。据我的了解,目前比较成熟的查找算法主要有顺序查找、二分查找、哈希表查找等。顺序查找的算法复杂度为O(n);二分查找的算法复杂度为O(logn),但需要
5、事先排序;哈希表查找的复杂度为O(1)。本程序采用效率最高的哈希表查找算法。4汉字编码格式:汉字编码格式:UTF-8UTF-8中文处理和英文处理的一个很大不同就在于编码格式的复杂性。常见的中文编码格式有GB2312,GB18030,GBK,Unicode等等。同样的中文字符,在不同的汉字编码格式中,可能有不同的二进制表示。因此编程做字符串匹配时,通常要求统一的编码格式。在linux下可以用file命令查看文本文件的编码格式。经过检查,发现老师提供的词典和语料属于不同的编码格式,直接做字符串匹配可能会有问题。考虑到UBUNTU以UTF-8作为默认编码格式,我索性使用 enconv 命令将词典和语
6、料都转换成 UTF-8格式。下面简要介绍一下UTF-8格式。前面 提到的 Unicode 的学名 是 Universal Multiple-Octet Coded Character Set,简称为UCS。UCS 可以看作是Unicode Character Set的缩写。UCS只是规定如何编码,并没有规定如何传输、保存这个编码。UTF-8是被广泛接受的方案。UTF-8 的一个特别的好处是它与 ISO-8859-1 完全兼容。UTF“是 UCS Transformation Format”的缩写。UTF-8就是以8位为单元对UCS 进行编码。从UCS-2到UTF-8的编码方式如下:UCS-2编
7、码(16进制)UTF-8字节流(二进制)0000 007F0 xxxxxxx0080 07FF110 xxxxx 10 xxxxxx0800 FFFF1110 xxxx 10 xxxxxx 10 xxxxxx“”例如 汉 字的Unicode 编码是6C49。6C49在0800-FFFF 之间,所以肯定要用3字节模板了:1110 xxxx 10 xxxxxx 10 xxxxxx。将 6C49 写成二进制是:0110 110001 001001,用这 个比 特流 依次 代替 模板 中的 x,得 到:11100110 10110001 10001001,即E6 B1 89。所以,就有了这个结论:汉字
8、的 UTF-8 编码是 3 字节的 。然而,语料库中出现的字符并非都是汉字。比如半角空格、外国人名字间隔符等。如果把所有字单元都视为3字节,就要出错了。这是编程时必须考虑的问题。5程序流程图程序流程图67程序源代码程序源代码/*segment.cpp-中文分词程序 *功能:)中文词典分词(逆向最大匹配)*)数字分词 *)西文分词 *)时间分词 *用法:*./segment ARTICAL *范例:*./segment 1998-01-qiefen-file.txt.utf8 *屏幕输出:*词典读入完毕,耗时 0.000776 s *分词完毕,耗时 3.18s*分词结果保存在result.txt
9、.utf8中。*注意:)本程序只能处理utf-8文本,其他格式的文本请用iconv或enconv转换成utf-8格式。*)程序运行需要dict/CoreDict.txt.utf8,dict/number.txt.utf8,dict/unit.txt.utf8三个文件。*参考了以下文章,特此感谢!*http:/ on:2010-11-30 *Author:xuweilin */#include#include#include#include#include#include#include#include#define MaxWordLength 12/最大词长字节(即 4 个汉字)8#defin
10、e 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;/词典 hash_map numberhash;/数字和字母 hash_map unithash;/时间单位/读入词典,以及数字、字母、时间单位
11、集 void get_dict(void)string strtmp;/读取词典的每一行 string word;/保存每个词 typedef pair sipair;ifstream infile(dict/CoreDict.txt.utf8);if(!infile.is_open()cerr Unable to open input file:wordlexicon -bailing out!word;/读入每行第一个词 wordhash.insert(sipair(word,1);/插入到哈希中 infile.close();9infile.open(dict/number.txt.ut
12、f8);if(!infile.is_open()cerr Unable to open input file:wordlexicon -bailing out!word;/读入每行第一个词 numberhash.insert(sipair(word,1);/插入到哈希中 infile.close();infile.open(dict/unit.txt.utf8);if(!infile.is_open()cerr Unable to open input file:wordlexicon -bailing out!word;/读入每行第一个词 unithash.insert(sipair(wor
13、d,1);/插入到哈希中 infile.close();/删除语料库中已有的分词空格,由本程序重新分词 string eat_space(string s1)int p1=0,p2=0;int count;string s2;while(p2 p1)/s2+=s1.substr(p1,p2-p1);/p2+=3;/p1=p2;/else/p2+=3;/删除半角空格 if(s1p2-0 x20=0)if(p2p1)s2+=s1.substr(p1,p2-p1);p2+;p1=p2;else p2+;s2+=s1.substr(p1,p2-p1);return s2;/用词典做逆向最大匹配法分词
14、string dict_segment(string s1)string s2=;/用s2存放分词结果 while(!s1.empty()int len=(int)s1.length();/取输入串长度 if(len MaxWordLength)/如果输入串长度大于最大词长 len=MaxWordLength;/只在最大词长范围内进行处理 /string w=s1.substr(0,len);/(正向用)将输入串左边等于最大词长长度串取出作为候选词 string w=s1.substr(s1.length()-len,len);/逆向用 int n=(wordhash.find(w)!=wor
15、dhash.end();/在词典中查找相应的词 while(len UTF8_CN_LEN&n=0)/如果不是词 len-=UTF8_CN_LEN;/从候选词左边减掉一个汉字,将剩下的部分作为候选词 11/w=w.substr(0,len);/正向用 w=s1.substr(s1.length()-len,len);/逆向用 n=(wordhash.find(w)!=wordhash.end();/s2+=w+Separator;/(正向用)将匹配得到的词连同词界标记加到输出串末尾 w=w+Separator;/(逆向用)s2=w+s2;/(逆向用)/s1=s1.substr(w.length
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中文 分词 程序 实验 报告 源代码
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【w****g】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【w****g】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。