《自然语言处理导论》中文分词程序实验报告_第1页
《自然语言处理导论》中文分词程序实验报告_第2页
《自然语言处理导论》中文分词程序实验报告_第3页
《自然语言处理导论》中文分词程序实验报告_第4页
《自然语言处理导论》中文分词程序实验报告_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、 从语料中读入一段(一行)文字,保存为字符串; 3 、 如果字符串长度大于 4 个中文字符,则取字符串最右边的 4 个中文字 符,作 4 、 在词典中查找这个候选词,如果查找失败,则去掉这个候选词的最左字,重 复这步进行查找,直到候选词为 1 个中文字符; 5 、 将候选词从字符串中取出、删除,回到第 3 步直到字符串为空; 6 、 回到第 2 步直到语料已读完。 二)程序设计 查找算法: 哈希表 汉字编码格式: UTF-8 程序流程图: 开始 读入字典 从语料库读入一行 删除空格 非UTF-8格式字符分词 确定文法分词 词典逆向最大匹配法 输岀分词结果 NO 最后一 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_cxx template struct hash size_t operator()(

4、const std:string ; 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.insert(sipair(word,

5、 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+; else p1=p2; p2+; s2 += s1.substr(p1,p2-p1); return s2; /用词典做逆向最大匹配法分词 stri ng dict_segme nt(stri ng s1) string s2 = ; II用s2存放分词结果 while (!s1.

6、empty() 找相应的词 int len = (int) s1en gth(); II if (len MaxWordLength) II len = MaxWordLe ngth; II 取输入串长度 如果输入串长度大于最大词长 只在最大词长范围内进行处理 stri ng w = s1.substr(s1en gth() - len, le n); int n = (wordhash.find(w) != wordhash.end(); II 在词典中查 如果不是词 while (len UTF8_CN_LEN / 从候选词左边减掉一个汉字 p1 = p2 = 0; 下的部分作为候选词 w

7、 = 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; while (p2 s1.length() while ( p2 = (s1.length()-UTF8_CN_LEN) 之前的句

8、子用词典 分词 s2 += dict_segment(s1.substr(p1,p2-p1);/ / 将数字和字母分出来 p1 = p2; p2 += 3; while ( p2 =0 p1 = p2; /end while return s2; string seg_analysis(string s1) string s2; string s3 = ; int p1 = 0; int p2 = 0; int count; while ( p2 4) do p2+; count+; while(s1p24) s2 = s1.substr(p1,p2-count-p1);/ 数字前的串 s3

9、+= cn_segment(s2) + s1.substr(p2-count,count) + Separator;/ 数字 if (p2 = s1.length()/ 这个等号 ,当数字是最后一个字符时! s1 = s1.substr(p2,s1.length()-p2);/剩余串 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);

10、/ if (!infile.is_open() / 打开输入文件失败则退出程序 cerr Unable to open input file: argv1 - bailing out! endl; system(pause); exit(-1); ofstream outfile1(result.txt.utf8); /确定输出文件 if (!outfile1.is_open() cerr Unable to open file : SegmentResult.txt -bailing out! endl; system(pause); exit(-1); clock_t start, fin

11、ish; double duration; start = clock(); get_dict(); finish = clock(); duration = (double)(finish - start) / CLOCKS_PER_SEC; cout 词典读入完毕,耗时 duration s endl; string strtmp; / 用于保存从语料库中读入的每一行 string line; /用于输出每一行的结果 start = clock(); cout 正在分词并输出到文件,请稍候 . endl; while (getline(infile, strtmp) / line = de

12、l_space(strtmp); line = seg_analysis(line); / outfile1 line endl; / 读入语料库中的每一行并用最大匹配法 调用分词函数进行分词处理 将分词结果写入目标文件 处理 finish = clock(); duration = (double)(finish - start) / CLOCKS_PER_SEC; cout 分词完毕,耗时 duration s endl; cout 分词结果保存在 result.txt.utf8 中。 endl; system(pause); return 0; 结果和性能分析 运行时间: 完幵.ft 毕塁出 421 s 请稍候 f . ut I H 可以看出,读入词典用时:0.421s ;分词用时:6.002s。 可能影响速度的包括查表方式的不同,以及存储字的格式不同等等原因 分词结果: result.txt utAS-记辜本 丈中 F爾(E) tsmoj 査看 w KK1CH1 的新世圮 九九八年新年讲话附图片二 家宇皂江萨民 垠矗施希轟 t和瞥聶坯磬雛番歸菸 土向月 00 i! 29 斗 社+(11 斗 胞华 岳 1冃-央 九 电同台 A- 在结果中, 基本上大部分的分词都算是成功的,但是仍有部分短语分析错 误

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论