中文信息处理

上传人:工**** 文档编号:488234535 上传时间:2023-11-18 格式:DOCX 页数:16 大小:14.37KB
返回 下载 相关 举报
中文信息处理_第1页
第1页 / 共16页
中文信息处理_第2页
第2页 / 共16页
中文信息处理_第3页
第3页 / 共16页
中文信息处理_第4页
第4页 / 共16页
中文信息处理_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《中文信息处理》由会员分享,可在线阅读,更多相关《中文信息处理(16页珍藏版)》请在金锄头文库上搜索。

1、甘肃政法学院本科生实验报告(一)姓名:学院:信息工程学院专业:信息管理与信息系统班级:2013级信息管理与信息系统实验课程名称:中文信息处理原理实验日期:2015年4月9日开课时间:2014-2015学年 二学期甘肃政法学院实验管理中心印制实验题目自动分词小组合作否姓名班级2013级信息管理与信息系统学 号一、实验目的1 , 了解中文分词意义2 .掌握中文分词的基本方法3,掌握四种分词方法”词典正向最大匹配法、词典逆向最大匹配、 基于确定文法的分词法、基于统计的分词方法”。二.实验环境Win7 64 位DEV-C+编译器三、实验内容与步骤1、词典正、逆向最大匹配法2、词典正、逆向最小匹配法3、

2、邻近匹配4、最短路径匹配词典逆向最大匹配法,基本思路是:1、将词典的每个词条读入内存,最长是 4字词,最短是1字词;2、从语料中读入一段(一行)文字,保存为字符串;3、如果字符串长度大于4个中文字符,则取字符串最右边的 4个 中文字符,作为候选词;否则取出整个字符串作为候选词;4、在词典中查找这个候选词,如果查找失败,则去掉这个候选词的最左字,重复这步进行查找,直到候选词为1个中文字符;5、将候选词从字符串中取出、删除,回到第 3步直到字符串为空;6、回到第2步直到语料已读完。词典正向最大匹配法,基本思路是:1、将词典的每个词条读入内存,最长是 4字词,最短是1字词;2、从语料中读入一段(一行

3、)文字,保存为字符串;3、如果字符串长度大于4个中文字符,则取字符串最左边的 4个 中文字符,作为候选词;否则取出整个字符串作为候选词;4、在词典中查找这个候选词,如果查找失败,则去掉这个候选词的最右字,重复这步进行查找,直到候选词为1个中文字符;5、将候选词从字符串中取出、删除,回到第 3步直到字符串为空;6、回到第2步直到语料已读完。邻近匹配,基本思路是:1、 对于待切分的一段字符串 C0 C1 C2Cn-1,根据C0 C1得到所有以C0 C1为首的词条集 W,如果词条集为空,则将C0切分 出来。2、 否则取满足 maxk|C0C1Ck6 W的字符串C0C13Ck切分出 来。3、 然后将后

4、面的剩余字符串Ck+19门作为新的待切分字符串进行同样的处理,直到待切分串为空为止。四、实验过程与分析逆向最大匹配法源代码:#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

5、(templatestruct hash(size_t operator()( conststd:string& x ) const(return hash()( x.c_str();hash_mapwordhash; / 词典/读入词典void get_dict(void)(string strtmp; /读取词典的每一行string word; /保存每个词typedef pairsipair;ifstreaminfile(CoreDict.txt.utf8);if (!infile.is_open()(cerr Unable to open input file: wordlexicon

6、 -bailing out! word; / 读入每行第一个词wordhash.insert(sipair(word, 1); /插入至 U 哈希中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_segm

7、ent(string s1)(string s2 = ; /用s2存放分词结果while (!s1.empty() intlen = (int) s1.length(); / 取输入串长度if (lenMaxWordLength) / 如果输入串长度大于最大词长len = MaxWordLength; /只在最大词长范围内进行处理string w = s1.substr(s1.length() - len, len);int n = (wordhash.find(w) != wordhash.end();/ 在词典中查找相应的 词while (len UTF8_CN_LEN & n = 0)

8、/ 如果不是 词len -= UTF8_CN_LEN; /从候选词左边减掉一个汉字,将剩下的部 分作为候选词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 (p

9、2 s1.length()while ( p2 = (s1.length()-UTF8_CN_LEN) & (s1.substr(p2,UTF8_CN_LEN).at(0)9 )/不是数字或字母p2 += UTF8_CN_LEN;)s2 += dict_segment(s1.substr(p1,p2-p1);位前的句子 用词典分词/将数字和字母分出来pl = p2;p2 += 3;while ( p2 =0&s1.substr(p2,UTF8_CN_LEN).at(0)=9 )/是数字或字母p2 += UTF8_CN_LEN;p1 = p2; /end whilereturn s2;/在执行中

10、文分词前,过滤半角空格以及其他非UTF-8字符string seg_analysis(string s1)string s2;string s3 =;int p1 = 0;int p2 = 0;int count;while ( p2 4)&14)八 14) 过滤非 utf-8 字符count = 0;dop2+;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;/数

11、字if (p2 = s1.length()这个等号,当数字是最后一个字符时!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(intargc, char* argv)(ifstreaminfile(1998-01-qiefen-file.txt.utf8); / 打开输入文件if (!infile.is_open() 打开输入文件失败则退出程序(cerr Unable to open input

12、 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, finish;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 = del_space(strtmp);line = seg_analysis(line)/调用分词函数

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 演讲稿/致辞

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号