⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 operator.cpp

📁 分词程序
💻 CPP
字号:
/*
 *FileName:	Operator.cpp
 *Author:		vk
 *Create Date:	2005-11-16
 *Modify by:  	vk
 *Last Modify:	2005-11-17s
 */
#include "stdafx.h"
#include "Win32Cut.h"
char wtable[maxn][maxl];		//词表,储存中文词汇
char buff[BUFSIZE];				//输入缓冲区
char result[RESSIZE];			//分词结果
int btp;						//缓冲区中当前已识别指针
int bp;							//缓冲区中当前开始识别指针
int bl;							//缓冲区有效长度
int wtsize;						//词汇表大小
int isinit = 0;					//词典是否初始化
FILE *fin,*fout;				//文件分词时的输入输出文件

/*===========================================
函数:compare
功能:返回2个单元的比较结果,供qsort调用
=============================================*/
int compare(const void* a,const void* b){
	return strcmp((char*)a,(char*)b);
}

/*============================================
函数:init_table
参数:lexfilename  词典文件路径
功能:读取字典并排序,初始化词表
返回:成功ture,失败false
=============================================*/
bool init_table(char* lexfilename){
	FILE* fwt;
	char line[100];
	int i;
	if(!(fwt = fopen(lexfilename,"r")))
		return false;
	for(i=0;;i++){
		if(fscanf(fwt,"%s",line) ==EOF)
			break;
		strcpy(wtable[i],line);
	}
	wtsize = i-1;
	//对词表按字符串比较结果排序
	qsort(wtable,wtsize,maxl*sizeof(char),compare);
	fclose(fwt);
	isinit = 1;
	return true;
}

/*==============================================
函数:judge
参数:str 字符串
功能:对于给定字符串str,用二分法查找词表,判断该字符串是否是一个词
返回:找到返回在词表中的数组下标,否则返回-1
================================================*/
int judge(char *str){
	int low,mid,high;
	low = 0;
	high = wtsize;
	while(low <= high){
		mid = (low+high)/2;
		if(strcmp(str,wtable[mid]) ==0)
			return mid;
		else if(strcmp(str,wtable[mid]) >0)
			low = mid+1;
		else
			high = mid-1;
	}
	return -1;
}

/*================================================
函数:cut
功能:从缓冲区buff中取定长(maxl)串,用正向最大匹配算法找出这段字符串中
	  从串首开始的最长词,并从存到结果中
返回:匹配成功1,否则0
==================================================*/
int cut(){
	char in[maxl];
	char temp[maxl];
	int i,k;
	k = bp;
	//从缓冲区里面读取定长字串
	for(i=0;i<(maxl-1)&&buff[k]!=0;i++,k++){
		in[i] = buff[k];
	}
	//逐渐缩短字长进行匹配
	for(;i>0;i--){
		in[i] = 0;
		if(judge(in) != -1){//如果匹配成功
			//不过当前缓冲区指针与已匹配指针不一致,说明跳过了一段不能识别的字串,把这段字串加到结果中去
			if(btp != bp){
				for(k=btp;k<bp;k++){
					sprintf(temp,"%c",buff[k]);
					strcat(result,temp);
				}
				strcat(result,"/");
			}
			//把匹配成功的字串加到结果中去
			strcat(result,in);
			strcat(result,"/");
			//设置当前缓冲区指针和已匹配指针
			bp += i;
			btp = bp;
			return 1;
		}
	}
	return 0;
}
/*=================================================
函数:analyse
功能:屏幕分词函数,循环调用cut函数,对缓冲区(即屏幕上的字串)进行切词,
      如果切词失败,则试图跳过一个或两个字节再次匹配,直到匹配成功或者
	  到达缓冲区末尾。如果匹配成功则继续调用cut;如果到达缓冲区末尾则输
	  出到结果result数组,并返回
===================================================*/
void analyse(){
	btp = bp = 0;
	bl = strlen(buff);
	result[0] = 0;
	while(1){
		if(!cut()){//如果切词失败,则有可能是缓冲区末尾或者不能识别单词
			while(bp<bl){
				if(buff[bp]<0)//是汉字
					bp ++;
				bp++;
				//跳过一个(汉)字进行再进行匹配,成功则跳出
				if(cut()==1)
					break;
			}
			if(bp >= bl){//如果缓冲区末尾,退出函数
				//加上不能识别的字串
				if(btp!=bl)
					strcat(result,&buff[btp]);
				return;
			}
		}
	}
	return;
}


//!!!!!!!以下函数为文件分词使用

/*====================================================
函数:fillbuff
功能:当缓冲区不足时,将缓冲区剩余字串挪到头部,并从输入
      文件中填充缓冲区致缓冲区满或文件末尾
返回:如果达到文件末尾1,否则0
======================================================*/
int fillbuff(){
	char ch;
	int i;
	for(i=0;bp<bl;i++,bp++)
		buff[i] = buff[bp];
	bp = 0;
	bl = i;
	while(bl<BUFSIZE){
		if(fscanf(fin,"%c",&ch)==EOF){
			buff[bl] = 0;
			return 1;
		}
		buff[bl++] = ch;
	}
	buff[bl] = 0;
	return 0;
}

/*=======================================================
函数:analysefile()
功能:对文件中的数据进行分词并保存的结果文件中去。
=========================================================*/
void analysefile(){
	int iseof = 0;						//判断是否文件末尾
	iseof = fillbuff();					//填充缓冲区
	btp = bp = 0;
	bl = strlen(buff);
	result[0] = 0;
	while(1){
		if(!cut()){//如果切词失败,则有可能是缓冲区末尾或者不能识别单词
			while(bp<bl){
				if(buff[bp]<0)//是汉字
					bp ++;
				bp++;
				//跳过一个(汉)字进行再进行匹配,成功则跳出
				if(cut()==1)
					break;
			}
			if(bp >= bl){//如果到达缓冲区末尾
				//输出结果
				fprintf(fout,"%s",result);
				if(iseof){//如果已经到达文件末尾
					//输出剩余的未能识别的字串
					fprintf(fout,"%s",&buff[btp]);
					return;
				}
				result[0] = 0;
				bp = btp;				//重新设置回bp
				iseof = fillbuff();		//填充缓冲区
			}
		}
	}
	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -