亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? cdevidesentence.cpp

?? 用c++寫的分詞算法
?? CPP
字號:
// CDevideSentence.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "string.h"
#include "CDevideSentence.h"
#include "usedll.h"

///////////////////CDevideSentence////////////////////////////////////////////////////////
CDevideSentence::CDevideSentence()
{
	szSource=NULL;
	szResult=NULL;
	this->bOccuredError=0;
	
}

CDevideSentence::~CDevideSentence()
{
	if(szSource) delete szSource;
	if(szResult) delete szResult;
}
unsigned char* CDevideSentence::getResult()
{
	return this->szResult;
}

void CDevideSentence::inputSentence(unsigned char *para_szSentence)
{
	if(szSource) delete szSource;
	if(szResult) delete szResult;
	int strLen=strlen((char*)para_szSentence);
	if(strLen>0)
	{
		szSource=new unsigned char[strLen+1];
		strcpy((char*)szSource,(char*)para_szSentence);
		szResult=new unsigned char[strLen*2];
	}
	if(szSource==NULL||szResult==NULL) this->bOccuredError=1;//分配內(nèi)存出錯

}

int CDevideSentence::isChineseChr(unsigned char *para_acChr)
{
	int rtCode=0;
	if((para_acChr[0]>=0xb0&&para_acChr[0]<0xf8&&para_acChr[1]>0xa0&&para_acChr[1]<0xff)/*GB2312漢字*/
	 ||(para_acChr[0]>=0x81&&para_acChr[0]<0xff&&para_acChr[1]>=0x40&&para_acChr[1]<=0xa0)/*擴(kuò)充漢字*/)
	{
		rtCode=1;
	}
	else
	{
		rtCode=0;
	}
	return rtCode;
}

int CDevideSentence::devideSentence(unsigned char *para_szSentence,unsigned char para_cSeparator)
{
	CDevideWordSeg cDevideWordSeg;
	this->inputSentence(para_szSentence);
	this->chrDevideCharacter=para_cSeparator;
	if(this->bOccuredError==1)
	{
		return -1;
	}
	//對句子進(jìn)行分詞。
	//先將句子分隔成字段(全由中文組成的串),對各串分詞
	int  nSourcePos=0;//讀取原串的位置
	int  nResultPos=0;//寫入結(jié)果串的位置。
	int  nScanPos;//當(dāng)前掃描的位置
	nScanPos=nSourcePos;
	while(this->szSource[nScanPos]!=0)
	{//字串尚未掃描結(jié)束
		int rtval=isChineseChr((unsigned char*)szSource+nScanPos);
		if(rtval==0)
		{//遇到漢字外的字符
			unsigned char storecurrentchr=szSource[nScanPos];//保留當(dāng)前掃描到的字符
			int isWide=0;//是否全角,默認(rèn)不是
			if(storecurrentchr>=0x80)
			{//是全角
				isWide=1;
			}
			szSource[nScanPos]=0;
			if(0!=cDevideWordSeg.devideWordSeg(szSource+nSourcePos/*待切分中文字段*/,szResult+nResultPos/*輸出的帶分隔符的以0結(jié)尾的結(jié)果串*/,chrDevideCharacter/*分隔符*/))
			{
				return -1;
			}
			int endposofresult=nResultPos;
			while(szResult[endposofresult]!=0) endposofresult++;
			if(strlen((char*)szSource+nSourcePos)!=0)//如果長度為0則表示連續(xù)出現(xiàn)兩個非中文字符,開頭不能再加分隔符
			{
				szResult[endposofresult++]=chrDevideCharacter;
			}
			szResult[endposofresult++]=storecurrentchr;
			if(isWide==1)
			{
				szResult[endposofresult++]=szSource[++nScanPos];
			}
			szResult[endposofresult++]=chrDevideCharacter;
			nResultPos=endposofresult;
			nScanPos++;	
			nSourcePos=nScanPos;
					
		}
		else
		{//是漢字,繼續(xù)掃描下去
			nScanPos+=2;
		}
	}
	cDevideWordSeg.devideWordSeg(szSource+nSourcePos/*待切分中文字段*/,szResult+nResultPos/*輸出的帶分隔符的以0結(jié)尾的結(jié)果串*/,chrDevideCharacter/*分隔符*/);
	return 0;

}
//////////////////////////CDevideWordSeg/////////////////////////////////////////////////////////
void CDevideWordSeg::buildDifferentMeaningInfo()
{
//int getWord(char*/*要找的詞*/,unsigned short*/*返回的詞的詞性*/,int*/*返回的詞的頻率*/);//取得給定詞的信息,返回詞的位置(>0):成功,-1:失敗
	int length=strlen((char*)source)/2;//取得源串的長度,(中文的長度)
	int startpos=0;//開始掃描的位置
	for(startpos=0;startpos<length;startpos++)
	{
		int j=10;
		if((length-startpos)<j) j=length-startpos;
		for(;j>0;j--)
		{
			if(j!=1)
			{
				unsigned char storechar=*(source+startpos*2+j*2);//暫存
				*(source+startpos*2+j*2)=0;
				unsigned short attr;
				int frequancy;
				getWord((char*)source+startpos*2,&attr,&frequancy);
				
				if(frequancy>0)
				{//頻率大于0,肯定為詞
					pTable[0][startpos]=j-1+startpos;
					*(source+startpos*2+j*2)=storechar;//恢復(fù)
					break;
				}
				*(source+startpos*2+j*2)=storechar;//恢復(fù)
			}
			else
			{
				pTable[0][startpos]=startpos;
			}
		}

	}
	
/*	for(startpos=0;startpos<length;startpos++)
	{
		if(startpos==pTable[0][startpos])
		{
			pTable[0][startpos]=-1;
			startpos++;
		}
		int maxpos=pTable[0][startpos];
		for(int i=startpos;i<=maxpos;i++)
		{
			if(pTable[0][startpos]>maxpos)
			{
				maxpos=pTable[0][startpos];
			}
		}
		if(startpos==maxpos)
		{
			pTable[0][startpos]=-1;
		}
		startpos=maxpos;
				
	}
*/	
}
int  CDevideWordSeg::getSumFrequancy(unsigned char *para_acSource,int para_nLen)//取字段的總詞頻
{
	int rtCode=0;
	unsigned short attr;
	int frequancy;
	for(int i=0;i<para_nLen;i++)
	{
		for(int j=i;j<para_nLen;j++)
		{
			unsigned char storechar=*(para_acSource+(j+1)*2);
			*(para_acSource+(j+1)*2)=0;
			getWord((char*)para_acSource+i*2,&attr,&frequancy);
			rtCode+=frequancy;
			*(para_acSource+(j+1)*2)=storechar;
		}
	}
	return rtCode;
}
void CDevideWordSeg::devideDifferentMeaningWordSeg(int para_nStart,int para_nEnd,int para_nStartpos,int para_nEndpos)//切分奇異字段
{//切分結(jié)果暫存在pTable[10]中,然后計算切分概率后再插入1-9行
	unsigned short attr;
	int frequancy;
	int startpos=para_nStartpos;
	int endpos=para_nEndpos;

	if(startpos>endpos)
	{//結(jié)束一種切分,開始進(jìn)行計算概率并插入適當(dāng)位置。
//		para_nStart,para_nEnd;
		int tempfrequancy=0;//暫存詞的概率
		tempfrequancy=pTable[10][para_nStart];
		for(int i=para_nStart;i<=para_nEnd+1;i++)
		{
			if(i==para_nEnd+1)
			{
				int fenzi=pTable[10][i-1];
				if(pTable[10][i-1]==0)
				{
					fenzi=1;
				}
				if(this->afPropability[10]==0)
				{
					this->afPropability[10]=(double)fenzi/(double)pTable[11][i-1];
				}
				else
				{
					this->afPropability[10]*=(double)fenzi/(double)pTable[11][i-1];
				}
				
				break;
			}
			if(pTable[10][i]!=tempfrequancy)
			{//
				tempfrequancy=pTable[10][i];
				int fenzi=pTable[10][i-1];
				if(pTable[10][i-1]==0)
				{
					fenzi=1;
				}
				if(this->afPropability[10]==0)
				{
					this->afPropability[10]=(double)fenzi/(double)pTable[11][i-1];
				}
				else
				{
					this->afPropability[10]*=(double)fenzi/(double)pTable[11][i-1];
				}
			
			}
			
		}
		//插入1-9中適當(dāng)位置
		int pos=1;
		while(pos<9&&this->afPropability[10]<this->afPropability[pos]) pos++;
		//now this->afPropability[10]>=afPropability[pos];
		if(this->afPropability[1]>0)
		{
			for(int kk=8;kk>=pos;kk--)
			{
				memcpy(pTable[kk+1]+para_nStart,pTable[kk]+para_nStart,sizeof(int)*(para_nEnd-para_nStart+1));
				this->afPropability[kk+1]=this->afPropability[kk];
			}
		}
		memcpy(pTable[pos]+para_nStart,pTable[10]+para_nStart,sizeof(int)*(para_nEnd-para_nStart+1));
		this->afPropability[pos]=this->afPropability[10];
		this->afPropability[10]=0;
		

	}

	for(int i=startpos;i<=endpos;i++)
	{
		unsigned char storechar=*(source+(i+1)*2);
		*(source+(i+1)*2)=0;		
		getWord((char*)source+para_nStartpos*2,&attr,&frequancy);
		int rtval=frequancy;
		*(source+(i+1)*2)=storechar;

		if(startpos>0)
		{
			if(pTable[10][startpos-1]==rtval)
			{
				if(rtval>0)
				{
					rtval--;
				}
				else
				{
					rtval++;
				}
			}
		}
		for(int k=startpos;k<=i;k++)
		{
			if(rtval<2)
			{
				if(k>0)
				{
					rtval=pTable[10][k-1]+1;
					rtval%=2;
					pTable[10][k]=rtval;
				}
				else
				{
					pTable[10][k]=0;
				}
			}
			else
			{
				pTable[10][k]=rtval;
			}
		}
		devideDifferentMeaningWordSeg(para_nStart,para_nEnd,i+1,para_nEnd);
	}

	
}
int CDevideWordSeg::devideWordSeg(unsigned char *para_szSource,unsigned char *para_szResult,unsigned char para_cSeparator)
{

	int rtCode=0;
	source=para_szSource;//待切分串,以0結(jié)尾
	result=para_szResult;//用來存儲切分結(jié)果,結(jié)果串必須以0結(jié)尾
	
	unsigned char separator=para_cSeparator;//分隔符號
	int length=strlen((char*)source)/2;//取得源串的長度,(中文的長度)

	while(length>=this->nMaxLen)
	{
		this->addMem();
		if(this->bOccuredError==1)
		{//分配內(nèi)存出錯
			return -1;
		}
	}

	int startpos=0;//開始掃描的位置
	if(bOccuredError==0)
	{
		this->buildDifferentMeaningInfo();
		for(startpos=0;startpos<length;startpos++)
		{
			int maxpos=pTable[0][startpos];
			for(int i=startpos;i<=maxpos;i++)
			{
				if(pTable[0][i]>maxpos)
				{
					maxpos=pTable[0][i];
				}
			}
			//取奇異字段(source+startpos×2,source+maxpos×2)的總詞頻
			int sumfrequancy=this->getSumFrequancy(source+startpos*2,maxpos-startpos+1);
			for(int k=startpos;k<=maxpos;k++)
			{//將奇異字段信息填入pTable第11行
				pTable[11][k]=sumfrequancy;
			}
			this->devideDifferentMeaningWordSeg(startpos,maxpos,startpos,maxpos);
			for(k=0;k<12;k++) this->afPropability[k]=0;//初始化已計算的歧義段概率

			startpos=maxpos;
		}
		
	}
	else
	{
		rtCode=-1;
	}
//到此pTable[1]-pTable[9]存儲了分隔方式。
	int resultpos=0;//輸出串輸入地址
	int tempfrequancy=pTable[1][0];
	for(int i=0;i<length;i++)
	{
		if(pTable[1][i]!=tempfrequancy)
		{//
			tempfrequancy=pTable[1][i];
			result[resultpos++]=separator;
			result[resultpos++]=source[i*2];
			result[resultpos++]=source[i*2+1];
						
		}
		else
		{
			result[resultpos++]=source[i*2];
			result[resultpos++]=source[i*2+1];

		}
		
		
	}
	result[resultpos++]=0;
	return rtCode;
}

CDevideWordSeg::CDevideWordSeg()
{
//int getWord(char*/*要找的詞*/,unsigned short*/*返回的詞的詞性*/,int*/*返回的詞的頻率*/);//取得給定詞的信息,返回詞的位置(>0):成功,-1:失敗
	bOccuredError=0;
	nMaxLen=200;
	for(int i=0;i<12;i++)
	{
		pTable[i]=new int[nMaxLen];
		if(pTable[i]==NULL)
		{
			bOccuredError=1;
		}
		this->afPropability[i]=0;
	}
	
	hInstance=LoadLibrary("wordlibaccess.dll");//加載訪問詞庫的動態(tài)庫
	if(hInstance)
	{//加載成功
		loadLib=(loadLib_dll)GetProcAddress(hInstance,"loadLib_dll");//取裝入詞庫的函數(shù)
		if(loadLib)
		{//取函數(shù)成功
			if(loadLib("wordlib.bin")==-1)
			{//加載詞庫失敗
				this->bOccuredError=1;
			}
			else
			{//詞庫加載成功
				getWord=(getWord_dll)GetProcAddress(hInstance,"getWord_dll");//取取詞頻的函數(shù)
				if(getWord==NULL)
				{//取函數(shù)失敗
					this->bOccuredError=1;
				}
			}
		}
	}
	else
	{
		this->bOccuredError=1;
	}
}

CDevideWordSeg::~CDevideWordSeg()
{
	for(int i=0;i<12;i++)
	{
		if(pTable[i])
		{
			delete pTable[i];
		}
	}
	if(hInstance)
	{
		FreeLibrary(hInstance);
		hInstance=NULL;
	}
}

void CDevideWordSeg::addMem()
{
	for(int i=0;i<11;i++)
	{
		if(pTable[i])
		{
			delete pTable[i];
		}
		pTable[i]=new int[nMaxLen*2];
		if(pTable[i]==NULL)
		{
			bOccuredError=1;
		}
	}
	nMaxLen*=2;
}
////////////////////////////////////////////////////////////////////////////////////////////

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美日韩中文字幕一区二区三区| 精品国产在天天线2019| 91高清视频免费看| 久久夜色精品国产欧美乱极品| 中文字幕日韩一区二区| 激情综合亚洲精品| 欧美影院一区二区| 国产精品传媒视频| 粉嫩嫩av羞羞动漫久久久| 欧美电影免费观看高清完整版在线 | 欧美a级一区二区| 99re在线精品| 国产欧美精品国产国产专区 | 欧美成人福利视频| 偷窥少妇高潮呻吟av久久免费| 99久久夜色精品国产网站| 久久男人中文字幕资源站| 免费看欧美女人艹b| 欧美三级在线播放| 亚洲视频免费看| 成人黄色网址在线观看| 26uuu欧美日本| 伦理电影国产精品| 日韩一区二区三| 日韩精品电影一区亚洲| 欧美视频在线一区二区三区 | 青椒成人免费视频| 欧美日韩一区二区欧美激情| 中文字幕一区在线| 99久久精品久久久久久清纯| 国产精品福利电影一区二区三区四区| 国产一区 二区| 久久精品视频一区| 国产精品996| 中文乱码免费一区二区| 丁香啪啪综合成人亚洲小说| 国产清纯白嫩初高生在线观看91 | 日韩美女视频19| caoporm超碰国产精品| 国产日韩欧美高清| 99国产精品一区| 亚洲国产精品人人做人人爽| 欧美亚洲精品一区| 三级久久三级久久| 精品国产乱码久久久久久久| 国产一区二区在线看| 中文天堂在线一区| 欧美亚洲动漫另类| 免费成人你懂的| 久久先锋影音av| www.66久久| 午夜久久久久久久久| 精品嫩草影院久久| 不卡的电视剧免费网站有什么| 亚洲欧美国产三级| 日韩一区二区在线免费观看| 国产精品69毛片高清亚洲| 中文字幕在线免费不卡| 欧美日韩一区二区在线视频| 久久99精品久久久久婷婷| 国产精品久久久久影院亚瑟| 欧美日韩综合不卡| 国产一区二区三区黄视频| 亚洲欧美日韩国产综合| 日韩三级电影网址| 99久久精品免费看国产| 美脚の诱脚舐め脚责91| 亚洲视频在线观看三级| 欧美一区二区三区视频| www.av精品| 免费高清在线视频一区·| 亚洲婷婷国产精品电影人久久| 91精品久久久久久久91蜜桃| 粉嫩高潮美女一区二区三区| 日韩电影在线免费看| 国产精品久久久久久久久快鸭 | 亚洲视频一区二区在线| 精品美女一区二区| 精品视频免费看| 成人国产亚洲欧美成人综合网| 午夜激情久久久| 亚洲欧洲精品天堂一级| 精品久久久久久最新网址| 欧美性极品少妇| 成人av影院在线| 国产一区在线精品| 日日夜夜免费精品| 一区二区三区免费| 国产精品国产精品国产专区不蜜 | 日韩国产一二三区| 日韩毛片视频在线看| 国产亲近乱来精品视频| 日韩欧美资源站| 9191久久久久久久久久久| 91在线视频免费观看| 国产成人av一区| 国内欧美视频一区二区| 日韩成人一级大片| 五月天激情综合| 午夜精品视频一区| 亚洲高清在线视频| 亚洲资源在线观看| 亚洲一区在线观看免费| 一区二区三区中文免费| 成人免费一区二区三区视频| 欧美韩国日本一区| 久久久久久久久免费| 精品国产一区二区三区久久影院| 91精品久久久久久久99蜜桃| 欧美日韩亚洲国产综合| 欧美三电影在线| 717成人午夜免费福利电影| 欧美日韩高清一区| 91麻豆精品国产91久久久久久久久| 91精品91久久久中77777| 在线免费av一区| 欧美三级日韩三级| 日韩一区二区精品| 久久久久久一二三区| 国产网站一区二区三区| 国产精品网站在线| 亚洲天堂a在线| 亚洲成人免费在线观看| 日韩电影免费一区| 国产一区二区免费看| 国产成人av一区二区三区在线| 成人av动漫在线| 一本大道久久a久久精二百| 欧美视频第二页| 日韩欧美综合在线| 国产日产精品一区| 日韩视频免费直播| 99re66热这里只有精品3直播| 国产在线播放一区三区四| 亚洲欧美日韩国产综合在线| 亚洲国产中文字幕| 美女网站一区二区| 懂色av一区二区三区免费看| 97精品久久久午夜一区二区三区| 在线区一区二视频| 日韩欧美电影一二三| 国产日本一区二区| 性做久久久久久免费观看欧美| 欧美aⅴ一区二区三区视频| 国产精品亚洲午夜一区二区三区 | 精品奇米国产一区二区三区| 日本一区二区免费在线观看视频| 中文字幕字幕中文在线中不卡视频| 亚洲电影你懂得| 国产成人av电影| 精品视频在线免费| 久久综合狠狠综合久久激情| 亚洲精品中文在线观看| 久久99国产精品久久99| aaa国产一区| 日韩欧美www| 一区二区三区不卡在线观看| 精品一区二区三区蜜桃| 一本到不卡精品视频在线观看| 欧美电影免费观看高清完整版 | 福利电影一区二区三区| 欧美视频在线观看一区| 欧美韩日一区二区三区| 日韩电影免费在线看| 91国产丝袜在线播放| 国产三级久久久| 久久国产尿小便嘘嘘| 欧美日韩一区三区四区| 成人欧美一区二区三区视频网页| 美女脱光内衣内裤视频久久网站| 91福利视频久久久久| 中文字幕av一区二区三区| 蜜桃91丨九色丨蝌蚪91桃色| 欧美私人免费视频| 亚洲精品va在线观看| 国产成人午夜电影网| 日韩午夜电影av| 日一区二区三区| 精品视频1区2区3区| 一区二区三区91| 99久久久国产精品免费蜜臀| 国产亚洲一二三区| 狠狠色综合日日| 日韩一区二区三区精品视频| 亚洲成人激情综合网| 色婷婷久久久久swag精品| 国产精品久久久久久久裸模| 国产激情一区二区三区| 久久这里只有精品视频网| 久久成人免费网站| 日韩视频在线永久播放| 美女一区二区久久| 欧美变态凌虐bdsm| 国模冰冰炮一区二区| 欧美mv日韩mv国产网站| 黄色资源网久久资源365| 精品国产乱码91久久久久久网站| 国产做a爰片久久毛片| 久久亚洲捆绑美女| 国产精品一区二区久激情瑜伽|