中文分词程序实验报告_第1页
中文分词程序实验报告_第2页
中文分词程序实验报告_第3页
中文分词程序实验报告_第4页
中文分词程序实验报告_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上汉语分词程序实验报告1、 程序功能描述: 本程序每次处理时都用缓冲区的数据从头开始去存储语料库的链表中匹配一个最长的词语来输出,如若没有匹配到的词语则单独输出该首字。 为了简化程序所以语料库和预备分词文章都统一采用ASCII码的编码方式,并且不允许文中出现英语单字节编码。别且本程序没有对未登录词和未声明数据结构格式进行处理,都按照普通汉字进行了分词,因此在最后的性能比较中这部分的准确率很差,但是在语料库有存储的部分中都是用最长匹配原则进行了分词,准确率还是达到了很高的水平。 分词符采用/+空格的方式来标记分词。 语料库的名字默认为:语料库.txt,打开方式为只读 读取

2、的文件名字默认为:resource.txt,打开方式为只读 输出的文件名字默认为:result.txt,打开方式默认为追加的方式2、 算法思路: (1)、从文件中读取语料库存储在内存中,组织成单链表的存储方式 (2)、组织以首字的ASCII码为下标的哈希表指向语料库链表 (3)、从文件中读满输入缓冲区,以缓冲区的首字的ASCII码做为下标从哈希表中查找首字相同的内存地址。 (4)、从该地址开始逐条匹配,记录其中匹配最长的词语的长度和地址。写入文件中并写入分词符。 (5)、读满缓冲区,若文件已经读取完毕则查看缓冲区是否用尽,若已经用完则执行第(6)步,否则重复(4)过程。 (6)、释放申请的内存

3、空间,程序结束。3、 数据结构:typedef struct coredict/使用链表来存储语料库 char data9; struct coredict*nextPtr;CoreDict,*CoreDictPtr;CoreDictPtr tablePtr=NULL,tailPtr=NULL,newPtr;/指向语料库链表的头和尾CoreDictPtr Hash65536=NULL;/一个以匹配词语的第一个字的ASCII码为下标的指向链表的哈希表int MatchLength=0;/在一个单词匹配过程中用来记录能够匹配到的最长的词语的长度CoreDictPtr MatchPtr=NULL;/

4、在一个单词匹配过程中用来记录能够匹配到的最长的词语在链表中的地址4、 函数功能:int IsEqual(char,char);/判断两个汉字是否相等 int LongMatch(char,char);/void read(char,FILE*);/将读入缓冲区读满void setoff(char,int);/将已经匹配好的词语从缓冲区中删除5、 性能对比分析:程序性能描述: 在语义的判别和歧义消除方法只是用最长匹配法来降低误差,因此这部分的性能提升不是很明显。本程序没有对未登录词和未声明数据结构格式进行处理,都按照普通汉字进行了分词,因此在最后的性能比较中这部分的准确率比较差,但是在语料库有存

5、储的部分中都是用最长匹配原则进行了分词,准确率还是达到了很高的水平。另外由于语料库规模的限制以及为了程序简化着想在普通词汇的搭配,例如形容词的组合方面还有一些低频词的分词方面也有些不是很高效。现有成熟分词程序的情况和大致性能: 经过十几年的研究,汉语自动分词技术取得了令人瞩目的成果,出现了一些实用的自动分词系统,如:北京航空航天大学的cDws分词系统、清华大学的SEG分词系统和sE(玎AG分词系统等,这些系统在分词的精确度(精度达到99以上)和分词速度(速度达到千字,s)方面都具有相当的水平。六、程序性能提高方向:(1).要能识别一些常见的数据格式,例如年月日、电话号码等。(2).可以跳过一些

6、乱码,例如一串乱字符串,还有数字串等。(3).增加判别字符类型的函数,用来判别英文字符、汉语字符、还有另外的字符(4).建立词语之间关联性的数据库,可以从语义方面,甚至语用方面来从逻辑上增加分词的准确性,以达到消除歧义的目的。 要是程序能增加上述的功能准确度应该可以达到90%以上。七、源代码:#include<stdio.h>typedef struct coredict char data9; struct coredict*nextPtr;CoreDict,*CoreDictPtr;CoreDictPtr tablePtr=NULL,tailPtr=NULL,newPtr;Co

7、reDictPtr Hash65536=NULL;int MatchLength=0;CoreDictPtr MatchPtr=NULL;int IsEqual(char,char);/判断两个汉字是否相等 int LongMatch(char,char);void read(char,FILE*);void setoff(char,int);main() int i; char temp9,ch3,pre3="" unsigned short*p; FILE *fPtr,*rePtr; printf("读取语料库中.n"); if( (fPtr=fop

8、en("语料库.txt","r")=NULL )/语料库 printf("temp.txt文件打开失败n"); goto END; if(newPtr=(CoreDictPtr)malloc(sizeof(CoreDict) != NULL ) newPtr->nextPtr=NULL; fscanf(fPtr,"%s",newPtr->data); /printf("%sn",newPtr->data); tablePtr=newPtr; tailPtr=newPtr; pr

9、e0=newPtr->data0;pre1=newPtr->data1; p=(unsigned short*)pre; Hash*p=tailPtr; else printf("动态内存申请失败n"); tailPtr->nextPtr=NULL; while( !feof(fPtr) ) if(newPtr=(CoreDictPtr)malloc(sizeof(CoreDict) != NULL ) newPtr->nextPtr=NULL; fscanf(fPtr,"%s",newPtr->data); /printf

10、("%sn",newPtr->data); tailPtr->nextPtr=newPtr; tailPtr=newPtr; ch0=newPtr->data0;ch1=newPtr->data1; if( !IsEqual(ch,pre) )/当该项的首字与前一个词的首字不相同时建立一个新的映射 p=(unsigned short*)ch; Hash*p=tailPtr; pre0=ch0;pre1=ch1; else printf("动态内存申请失败n"); printf("文件散列读取完毕n"); pri

11、ntf("正在进行词汇匹配和分词.(若该result.txt存在则会追加在该文本之后)n"); fclose(fPtr); if( (fPtr=fopen("resource.txt","r")=NULL )/source.txt printf("source.txt文件打开失败n"); goto END; if( (rePtr=fopen("result.txt","a+")=NULL )/result.txt printf("result.txt文件打开失败n&

12、quot;); goto END; /printf("n输入#表示结束查找n"); /scanf("%s",temp); temp0='0' read(temp,fPtr); /printf("temp= %sn",temp); while( temp0!=EOF && temp0!='0') p=(unsigned short*)temp; newPtr=Hash*p; MatchLength=0; MatchPtr=NULL; if(newPtr!=NULL) /printf(&qu

13、ot;与查找项首字相同的有:n"); /printf("%sn",newPtr->data); /printf("temp= %sn",temp); i=LongMatch(temp,newPtr->data); if(i > MatchLength) MatchLength=i; MatchPtr=newPtr; newPtr=newPtr->nextPtr; while( newPtr!=NULL && IsEqual(newPtr->data,temp) ) /printf("%sn

14、",newPtr->data); i=LongMatch(temp,newPtr->data); if(i > MatchLength) MatchLength=i; MatchPtr=newPtr; newPtr=newPtr->nextPtr; /else /printf("没有与查找项首字相同的n"); if(MatchPtr=NULL) /printf("没有匹配项n"); fprintf(rePtr,"%c%c/ ",temp0,temp1); setoff(temp,2); else /p

15、rintf("最长匹配项为:%s 匹配长度为:%d",MatchPtr->data,MatchLength); fprintf(rePtr,"%s/ ",MatchPtr->data); setoff(temp,MatchLength); /对输入缓冲区进行处理 /printf("n输入#表示结束查找n"); /scanf("%s",temp); read(temp,fPtr); fclose(fPtr); fclose(rePtr); printf("释放语料库内存.n"); wh

16、ile(tablePtr!=NULL) newPtr=tablePtr; tablePtr=tablePtr->nextPtr; free(newPtr); printf("释放语料库内存成功n"); END: system("pause"); return 0;int IsEqual(char a,char b) int i,k=0; if(a0=b0 && a1=b1 && a0!='0' && a1!='0') return 1; else return 0;in

17、t LongMatch(char temp,char coredic) int i=0,length=0; for(i=0;coredici!='0'i+=2) if( IsEqual(&(tempi),&(coredici) ) length+=2; else break; if( coredici!='0' ) length=0; return length;void read(char temp,FILE* fPtr) char a,b; int i; for(i=0;i<8;i+=2) if( tempi='0' ) fscanf(fPtr,"%c",

温馨提示

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

评论

0/150

提交评论