欢迎来到天天文库
浏览记录
ID:26345826
大小:666.50 KB
页数:10页
时间:2018-11-25
《自然语言导论分词程序报告》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、自然语言导论分词程序报告目录目录21.实验题目32.实验环境33.程序流程图34.实验原理45.数据结构56.使用截图77.性能测试88.存在的问题及改进方案99.实验总结91.实验题目:设计一个分词程序,并能够利用所提供的字典对一篇文章进行分词。2.实验环境:WINDOWSVISTA,DEV-C++3.程序流程图:提示输入字典名读入字典对读入的词语分类存储到相应数组采用冒泡排序方法对各数组进行排序提示输入源文件名称处理源文件内容:每次读入5字节字符,通过查询字典进行分词最后写入到result.txt中完成分词1.实验原理:最大匹配算法:首先准备一个分词词表,顺序扫描待分词的句
2、子,将句中候选词按照词长从大到小的顺序依次跟词表中的词进行匹配,匹配成功即作为一个词输出。这样就使得每次输出的词是长度最大的(相比已知的确定的词表而言)。如果一个句中的多字候选词跟词表中所有的词都匹配不上,就只能把单字词当作分词结果输出了。采用双向最大匹配算法将会提高分词的正确性。1.数据结构:(1)用于存储字典的几个数组,分别存储4字节、3字节、2字节、1字节的字词和英文标点、数字和字母,这样限制了最大字词数量,超出会产生错误,但是获得了更快速的查找和排序。charwords4[1000000][9];charwords3[1000000][7];charwords2[100
3、0000][5];charwords1[1000000][3];charwords[1000000][2];(2)根据字典中不同长度的单词分别存储到相应的数组中:switch(len){case8:strcpy(words4[x4],word);x4++;break;case6:strcpy(words3[x3],word);x3++;break;case4:strcpy(words2[x2],word);x2++;break;case2:strcpy(words1[x1],word);x1++;break;case1:strcpy(words[x],word);x++;bre
4、ak;}(3)对每个字典的数组进行冒泡排序为二分查找作准备,二分查找可以减少查询时间,提高分词效率,如果词典已经排序完毕,将会大大减少总用时:for(i=0;i0){strcpy(viaword4,words4[j]);strcpy(words4[j],words4[j+1]);strcpy(words4[j+1],viaword4);}}(4)对源文件进行分词处理的格式如下,每次读入5字节数据并进行词语的查询,找到对应单词便可以输出并增加空
5、格,之后更改文件指针重新读数据到缓冲区,如此循环直到源文件处理结束。while(!feof(sourcefile)){fgets(buffer,10,sourcefile);//每次读入5字节数据if(feof(sourcefile))break;//根据缓冲区的值进行分词操作}1.使用截图:程序界面:未分词文档:分词后如下:1.性能测试:本程序在导入本字典dic.txt(大小817K)并将字典排序本机用时约1分钟,如不需要对字典进行排序操作则仅需1秒钟,对文档abc.txt(大小3.54M)进行分词用时约30秒,分词准确率接近于80%,仍可以提高。1.存在的问题及改进方案:(
6、1)导入字典采用的是冒泡排序,速度慢,可以考虑更改为快速排序等其他更快的排序方法来对字典内的词语进行排序,以便用来二分查找词语。对于已经排好的字典,不进行排序将会大大减少用时。二分查找方法可以有效的减少查找单词的时间。(2)仅仅采用了正向最大匹配算法,没有采用双向匹配导致正确率不高,可以继续深入更改为双向匹配算法以提高正确率。(3)使用的字典为817K,这个字典包含的单词并不全,所以可能导致分词正确率不高,但是,使用更大的字典将耗费更大的存储空间,处理速度也会变慢,如何在这两者之间寻找一个平衡点很重要。(4)存储字典应用的是几个数组,这样会限制最大词数,太大字典会导致错误,但是
7、数组在排序和查找方面有优势,可以提高整体速度。2.实验总结:本次编程运用到大量的文件读写和排序查找方面的算法问题,难度较大,在文件读写和排序方面也遇到一些问题,比如如何判断文件中的换行和结束,二分查找过程中的比较和替换等等,最终完成的程序并不十分完美,和其他同学的程序有所差距,不过能够完成这个分词程序提高了我的编程水平,通过一学期自然语言的学习和亲自完成分词程序也让我对自然语言科学产生了兴趣,这也是我选择这门课的最大收获。
此文档下载收益归作者所有