




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
甘肃政法学院本科生实验报告( 一 )姓名: 学院:信息工程学院专业: 信息管理与信息系统班级: 2013级信息管理与信息系统实验课程名称: 中文信息处理原理实验日期:2015年4月9日开课时间:2014-2015学年 二学期甘肃政法学院实验管理中心印制实验题目自动分词小组合作否姓名班级2013级信息管理与信息系统学 号一、实验目的1. 了解中文分词意义2. 掌握中文分词的基本方法3. 掌握四种分词方法“词典正向最大匹配法、词典逆向最大匹配、基于确定文法的分词法、基于统计的分词方法”。二实验环境Win7 64位DEV-C+编译器三、 实验内容与步骤1、 词典正、逆向最大匹配法2、 词典正、逆向最小匹配法3、 邻近匹配4、 最短路径匹配词典逆向最大匹配法,基本思路是:1、 将词典的每个词条读入内存,最长是4字词,最短是1字词;2、 从语料中读入一段(一行)文字,保存为字符串;3、 如果字符串长度大于4个中文字符,则取字符串最右边的 4个中文字符,作为候选词;否则取出整个字符串作为候选词;4、 在词典中查找这个候选词,如果查找失败,则去掉这个候选词的最左字,重复这步进行查找,直到候选词为1个中文字符;5、 将候选词从字符串中取出、删除,回到第3步直到字符串为空;6、 回到第2步直到语料已读完。词典正向最大匹配法,基本思路是:1、 将词典的每个词条读入内存,最长是4字词,最短是1字词;2、 从语料中读入一段(一行)文字,保存为字符串;3、 如果字符串长度大于4个中文字符,则取字符串最左边的 4个中文字符,作为候选词;否则取出整个字符串作为候选词;4、 在词典中查找这个候选词,如果查找失败,则去掉这个候选词的最右字,重复这步进行查找,直到候选词为1个中文字符;5、 将候选词从字符串中取出、删除,回到第3步直到字符串为空;6、 回到第2步直到语料已读完。邻近匹配,基本思路是:1、 对于待切分的一段字符串C0 C1 C2Cn-1,根据C0 C1得到所有以C0 C1为首的词条集W,如果词条集为空,则将C0切分出来。2、 否则取满足maxk|C0C1CkW的字符串C0C1Ck切分出来。3、 然后将后面的剩余字符串Ck+1 Cn-1作为新的待切分字符串进行同样的处理,直到待切分串为空为止。四、实验过程与分析逆向最大匹配法源代码:#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 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 - bailing out! word; /读入每行第一个词 wordhash.insert(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存放分词结果 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) / 如果不是词 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; 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_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; 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 = 0; else p2 += 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 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); / 调用分词函数进行分词处理 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; 邻近匹配CStringCSeg:NM(CString s)CStrs words;/以w为首的词条集CString ret = ;while(!s.IsEmpty()words.clear();CString w;intlen = s.GetLength();if(len 4)w = s;elsew = s.Left(4);/取头两个字words = myDic.GetWords(w);/取得以w为首的词条集int max = 1,k;for(inti = 0 ; i max)/长度最长且完全匹配w = s.Left(k);m
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年氢能产业链投融资策略与市场前景报告
- 新能源行业2025年工业互联网在新能源行业智能运维服务中的应用研究报告
- 2025年新能源汽车自动驾驶法规下的新能源汽车充电设施运营模式报告
- 2025年储能电池梯次利用在电网储能调频中的应用实践报告
- 2025年新能源设备绿色金融创新模式研究报告
- 2025年文化礼品定制服务消费市场洞察:定制化需求与市场潜力
- 2025年新能源汽车出口市场分析与增长策略报告
- 3.3 二次根式的加法和减法教学设计初中数学湘教版2024八年级上册-湘教版2024
- 2025年中国高档鞋行业市场分析及投资价值评估前景预测报告
- 2025年中国高纯氯冉酸行业市场分析及投资价值评估前景预测报告
- 2025云南红河红家众服经营管理有限公司社会招聘工作人员8人笔试参考题库附带答案详解
- 牛羊布氏杆菌课件
- 共享实验室合作协议书
- DBJ04-T 290-2012 袖阀管注浆加固地基技术规程
- 客服人员安全操作培训课件
- 城管协管员面试题目及答案
- DL-T 794-2024 火力发电厂锅炉化学清洗导则
- 地质项目合同管理办法
- 天津市受问责干部管理办法
- 内科进修汇报护理
- 口腔咨询师沟通技巧培训
评论
0/150
提交评论