中文分词程序实验报告(推荐文档)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

汉语分词程序实验报告

一、程序功能描述:

本程序每次处理时都用缓冲区的数据从头开始去存储语料库的链表中匹配一个最长的词语来输出,如若没有匹配到的词语则单独输出该首字。

为了简化程序所以语料库和预备分词文章都统一采用ASCII码的编码方式,并且不允许文中出现英语单字节编码。别且本程序没有对未登录词和未声明数据结构格式进行处理,都按照普通汉字进行了分词,因此在最后的性能比较中这部分的准确率很差,但是在语料库有存储的部分中都是用最长匹配原则进行了分词,准确率还是达到了很高的水平。

分词符采用//+空格的方式来标记分词。

语料库的名字默认为:语料库.txt,打开方式为只读

读取的文件名字默认为:resource.txt,打开方式为只读

输出的文件名字默认为:result.txt,打开方式默认为追加的方式

二、算法思路:

(1)、从文件中读取语料库存储在内存中,组织成单链表的存储方式(2)、组织以首字的ASCII码为下标的哈希表指向语料库链表

(3)、从文件中读满输入缓冲区,以缓冲区的首字的ASCII码做为下标从哈希表中查找首字相同的内存地址。

(4)、从该地址开始逐条匹配,记录其中匹配最长的词语的长度和地址。写入文件中并写入分词符。

(5)、读满缓冲区,若文件已经读取完毕则查看缓冲区是否用尽,若已经用完则执行第(6)步,否则重复(4)过程。

(6)、释放申请的内存空间,程序结束。

三、数据结构:

typedef struct coredict{//使用链表来存储语料库

char data[9];

struct coredict*nextPtr;

}CoreDict,*CoreDictPtr;

CoreDictPtr tablePtr=NULL,tailPtr=NULL,newPtr;//指向语料库链表的头和尾CoreDictPtr Hash[65536]={NULL};//一个以匹配词语的第一个字的ASCII码为下标的指向链表的哈希表

int MatchLength=0;//在一个单词匹配过程中用来记录能够匹配到的最长的词语的长度

CoreDictPtr MatchPtr=NULL;//在一个单词匹配过程中用来记录能够匹配到的最长的词语在链表中的地址

四、函数功能:

int IsEqual(char[],char[]);//判断两个汉字是否相等

int LongMatch(char[],char[]);//

void read(char[],FILE*);//将读入缓冲区读满

void setoff(char[],int);//将已经匹配好的词语从缓冲区中删除

五、性能对比分析:

程序性能描述:

在语义的判别和歧义消除方法只是用最长匹配法来降低误差,因此这部分的性能提升不是很明显。本程序没有对未登录词和未声明数据结构格式进行处理,都按照普通汉字进行了分词,因此在最后的性能比较中这部分的准确率比较差,但是在语料库有存储的部分中都是用最长匹配原则进行了分词,准确率还是达到了很高的水平。另外由于语料库规模的限制以及为了程序简化着想在普通词汇的搭配,例如形容词的组合方面还有一些低频词的分词方面也有些不是很高效。

现有成熟分词程序的情况和大致性能:

经过十几年的研究,汉语自动分词技术取得了令人瞩目的成果,出现了一些实用的自动分词系统,如:北京航空航天大学的cDws分词系统、清华大学的SEG 分词系统和sE(玎AG分词系统等,这些系统在分词的精确度(精度达到99%以上)和分词速度(速度达到千字,s)方面都具有相当的水平。

六、程序性能提高方向:

(1).要能识别一些常见的数据格式,例如年月日、电话号码等。

(2).可以跳过一些乱码,例如一串乱字符串,还有数字串等。

(3).增加判别字符类型的函数,用来判别英文字符、汉语字符、还有另外的字符

(4).建立词语之间关联性的数据库,可以从语义方面,甚至语用方面来从逻辑上增加分词的准确性,以达到消除歧义的目的。

要是程序能增加上述的功能准确度应该可以达到90%以上。

七、源代码:

#include

typedef struct coredict{

char data[9];

struct coredict*nextPtr;

}CoreDict,*CoreDictPtr;

CoreDictPtr tablePtr=NULL,tailPtr=NULL,newPtr;

CoreDictPtr Hash[65536]={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 temp[9],ch[3],pre[3]={""};

unsigned short*p;

FILE *fPtr,*rePtr;

printf("读取语料库中...\n");

if( (fPtr=fopen("语料库.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("%s\n",newPtr->data);

tablePtr=newPtr;

tailPtr=newPtr;

pre[0]=newPtr->data[0];pre[1]=newPtr->data[1];

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("%s\n",newPtr->data);

tailPtr->nextPtr=newPtr;

tailPtr=newPtr;

ch[0]=newPtr->data[0];ch[1]=newPtr->data[1];

if( !IsEqual(ch,pre) ){//当该项的首字与前一个词的首字不相同时建立一个新的映射

p=(unsigned short*)ch;

相关文档
最新文档