版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、自然语言处理导论中文分词实验报告一、实验目的了解中文分词意义掌握中文分词的基本方法二、实验环境Win7 64 位DEV-C+编译器三、实验设计(一)分词策略目前较为成熟的中文分词方法主要有:1、词典正向最大匹配法2、词典逆向最大匹配法3、基于确定文法的分词法4、基于统计的分词方法一般认为,词典的逆向匹配法要优于正向匹配法。基于确定文法和基于统计的方 法作为自然语言处理的两个流派,各有千秋。我设计的是根据词典逆向最大匹配法,基本思路是:1、将词典的每个词条读入内存, 最长是4字词,最短是1字词;2、从语料中读入一段(一行)文字,保存为字符串;-可编辑修改-3、如果字符串长度大于 4个中文字符,则
2、取字符串最右边的4个中文字符,作为候选词;否则取出整个字符串作为候选词;4、在词典中查找这个候选词,如果查找失败,则去掉这个候选词的最左字,重复这步进行查找,直到候选词为1个中文字符;5、将候选词从字符串中取出、删除,回到第 3步直到字符串为空;6、回到第2步直到语料已读完。(二)程序设计查找算法:哈希表汉字编码格式:UTF-8-可编辑修改-程序流程图:开始读入字典从语料库读入一行删除空格非UTF-暗式字符分 词确定文法分词词典逆向最大匹配法输出分词结果NO最后一行? A;YES结束-可编辑修改-词典逆向最大匹配读入字符串NONO候选词多余1个?YES词典中查找.YES分词,删除候选词-可编辑
3、修改-源代码:#include #include #include #include #include #include #include #include #define MaxWordLength 12/ 最大词长字节(即 4个汉字)#define Separator / 词界标记#define UTF8_CN_LEN 3/ 汉字的 UTF-8 编码为 3 字节using namespace std;using namespace _gnu_cxx;namespace _gnu_cxxtemplate struct hashsize_t operator()( const std:stri
4、ng& x ) const-可编辑修改-return hash()( x.c_str(););)hash_map wordhash; / 词典/读入词典void get_dict(void)string strtmp; /读取词典的每一行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.in
5、sert(sipair(word, 1); /)infile.close();)删除语料库中已有的分词空格,由本程序重新分词string del_space(string s1)(int 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存放分词结果取输入
6、串长度while (!s1.empty() int len = (int) s1.length(); /if (len MaxWordLength) /如果输入串长度大于最大词长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; /从候选词左边减掉一
7、个汉字,将剩下的部分作为候选词w = s1.substr(s1.length() - len, len);n = (wordhash.find(w) != wordhash.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;pl = p2 = 0;while (p2 s1.length()while ( p2 = (s1.lengt
8、h()-UTF8_CN_LEN) &(s1.substr(p2,UTF8_CN_LEN).at(0)9 )/不是数字或字母p2 += UTF8_CN_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;-可编辑修改-pl = p2; /end whilereturn s2;/在执行中文分词前,过滤半角空格以及其他非UTF-8字符string
9、seg_analysis(string s1)string s2;string s3 =;int p1 = 0;int p2 = 0;int count;while ( p2 4)&14) A 14)/ 过滤非 utf-8 字符count = 0;dop2+;count+;while(s1p24)&14) a 14) & p2 s1.length();-可编辑修改-数字前的串s2 = s1.substr(p1,p2-count-p1);/ s3 += cn_segment(s2) + s1.substr(p2-count,count) +Separator;/ 数字if (p2 = s1.le
10、ngth()/ 这个等号,当数字是最后一个字符时!s1 = s1.substr(p2,s1.length()-p2);/ 剩余串p1 = p2 = 0;elsep2 += 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:
11、argv1 - bailingout! endl;system(pause);exit(-1);ofstream outfile1(result.txt.utf8); /确定输出文件if (!outfile1.is_open() cerr Unable to open fileSegmentResult.txt -bailingout! endl;system(pause);exit(-1);clock_t start, finish;double duration;start = clock();get_dict();finish = clock();-可编辑修改-duration = (d
12、ouble)(finish - start) / CLOCKS_PER_SEC;cout 词典读入完毕,耗时 duration s endl;string strtmp; /用于保存从语料库中读入的每一行string line; /用于输出每一行的结果start = clock();cout 正在分词并输出到文件,请稍候 .” endl;while (getline(infile, strtmp) /读入语料库中的每一行并用最大匹配法处理line = del_space(strtmp);line = seg_analysis(line); /调用分词函数进行分词处理outfile1 line
13、endl; /将分词结果写入目标文件finish = clock();duration = (double)(finish - start) / CLOCKS_PER_SEC;cout 分词完毕,耗时 duration s endl;cout 分词结果保存在 result.txt.utf8 中。 endl;system(pause);return 0;-可编辑修改-结果和性能分析运行时间: D:K课件LP中文三fi葩fend .e1如可以看出,读入词典用时:0.421s ;分词用时:6.002s 。可能影响速度的包括查表方式的不同,以及存储字的格式不同等等原因。分词结果:(result.txt utS -记事本立中F)做旧格式(0查着M 帮弥H)1中111华同喜的新世纪九九八年新年讲话1附图片家声/江步民%京菽&区记、国家粒f迈向充满希里品世纪们 ,遇蠹第建繇/-可编辑修改-在结果中,基本上大部分的分词都算是成功
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 呼伦贝尔学院《羽毛球专项与实践Ⅲ》2021-2022学年第一学期期末试卷
- 呼伦贝尔学院《体育Ⅲ》2021-2022学年第一学期期末试卷
- 《传染病预防知识》课件
- 红河学院《中国民族音乐》2022-2023学年第一学期期末试卷
- 红河学院《小组社会工作》2021-2022学年第一学期期末试卷
- 员工年终总结与明年计划
- 《天线原理与安装》课件
- 同理心与心理健康教育
- 秋季养生保健小常识
- 第07讲 平面向量奔驰定理与三角形四心问题(高阶拓展、竞赛适用)(学生版)-2025版高中数学一轮复习考点帮
- 高质量的幼儿园教育
- 小学体育-轻度损伤的自我处理教学课件设计
- 第一章-公路概论课件
- 基于PLC的水箱温度控制系统
- 十三项核心制度-上海第十人民医院
- 危险化学品企业设备完整性管理专项行动方案
- 七步洗手法 课件
- YYT-0664-2020医疗器械软件软件生存周期过程核查表
- 学科前沿讲座-公共关系(2022下)学习通课后章节答案期末考试题库2023年
- 注射低分子肝素患者知情同意书
- 化妆品生产质量管理规范(2022年)PPT
评论
0/150
提交评论