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

📄 stdafx.cpp

📁 中文信息逆向分词程序 是用api实现的
💻 CPP
字号:

/*-----------------------------中文分词程序------------------------------
------------------------计算机系06级 062547 陈瑶----------------------*/

// stdafx.cpp : source file that includes just the standard includes
//	wordppl.pch will be the pre-compiled header
//	stdafx.obj will contain the pre-compiled type information

#include "stdafx.h"
#include <stdio.h>

// TODO: reference any additional headers you need in STDAFX.H
// and not in this file

extern char tt[][40];

char	* source,* result;		//文件暂存数组
int		sum;			//字典长度
FILE	*fp1,*fp2;		//定义两个文件指针
long	filelen;		//输入文件的长度
char	scrbuf[MD];		//屏幕文件缓冲区
char	scrres[SD];		//屏幕文件结果区

/*------------------------------------分词实现部分-----------------------------------------*/
//比较函数
int compare(const void* a,const void* b){
	return strcmp((char*)a,(char*)b);
}

//折半查找算法
int binsearch(int Len,char *aidkey)
{	int low,high,mid;
	low=0;high=Len-1;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(strcmp(aidkey,tt[mid])==0)
			return mid;			//查找成功
		else if(strcmp(tt[mid],aidkey)>0)
			high=mid-1;					//修改查找区间上界
		else
			low=mid+1;					//修改查找区间下界
	}
	return -1;					//查找失败
}

//初始化函数
int initialize()
{	
	
	sum=53335;
	qsort(tt,sum,40*sizeof(char),compare);	//对字典进行排序
	return 1;
}


//采用逆向最大匹配算法
void scrnegcutword()
{
	int i,j,k;	//普通变量
//	int end;		//为1标示已经扫描完待分析文件,反之为0
	int mask=0;		//遇到不能识别字符则标记为1,否则为0
	int bp,sb,rp;		//bp为字符串已识别指针,sb为临时用指针,sp为结果数组指针
	char buffer[37];

	filelen=strlen(scrbuf);
	for(i=0;i<2*filelen;i++)
	{	scrres[i]=1; }
	//分词主程序部分,采用正向最大匹配算法

	bp=filelen-1;rp=2*filelen-1; scrres[rp+1]=0;
	while(1)
	{
		if(bp<=35)
		{	for(j=0;j<=bp;j++)
				buffer[j]=scrbuf[j];
			buffer[bp+1]=0;
		}
		else
		{	sb=bp;
			for(j=0;j<36;j++)
			{	buffer[j]=scrbuf[sb-35+j]; }
			buffer[j]=0;
		}
		if(bp==-1)break;
		
		k=strlen(buffer);
		for(i=k-1;i>=0;i--)
		{
			k=strlen(buffer);
			j=-1;
			if(	strcmp(buffer,"0")==0||strcmp(buffer,"1")==0||strcmp(buffer,"2")==0||strcmp(buffer,"3")==0||strcmp(buffer,"4")==0||
				strcmp(buffer,"5")==0||strcmp(buffer,"6")==0||strcmp(buffer,"8")==0||strcmp(buffer,"7")==0||strcmp(buffer,"9")==0)
				goto A;
			j=binsearch(sum,buffer);
			if(j!=-1)			//如果查找到,则输出查找到的内容,并将bp指针往后移相应位置
			{	if(mask==1) { mask=0; scrres[rp]='|'; rp--; }
				//strcat(scrres,buffer); rp-=k;
				//k=strlen(buffer);
				for(j=k-1;j>=0;j--) 
				{	scrres[rp]=buffer[j]; 
					rp--;
				}
				scrres[rp]='|'; rp--;
				bp=bp-k;
				break;
			}
			else		//如果查不到
			{	
A:				if(i==1)						//若还剩2个字节,则判断第一个字节,若大于0,说明不是汉字,输出一个字节
				{	buffer[2]=0;					//若小于0,说明该汉字不在此库中,输出该字。并将bp指针往后移相应位置
					if(buffer[1]<0)
					{	scrres[rp]=buffer[1];rp--;scrres[rp]=buffer[0]; rp--; bp=bp-2; mask=1; break; }
					else
					{	scrres[rp]=buffer[1]; rp-=1; bp=bp-1; mask=1; break; 
					} 
				}
				if(i==0)		//若还剩1个字节,说明是不能识别字符,则直接输出这个字节,并将bp指针往后移1个字节
				{	buffer[1]=0; 
					scrres[rp]=buffer[0]; rp-=1; bp=bp-1; mask=1; break; 
				}
				k=strlen(buffer);
				for(j=0;j<k;j++) { buffer[j]=buffer[j+1]; }	//将buffer第一位去掉,再进行匹配
			}
		}//for(i=i-1;i>=0;i--)	

	}//while(1)

	for(i=0;i<2*filelen;i++)
		if(scrres[i]!=1) 
			break;

	for(j=0;j<2*filelen-i;j++)
	{	scrres[j]=scrres[i+j]; }

	scrres[j]=0;
}

⌨️ 快捷键说明

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