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

📄 ccm.cpp

📁 用来文本分类的
💻 CPP
字号:
#include "CCM.h"



void ccm(int ** pkinddoct,int nNumOfKind, WORDVECTOR **pwordlist)
{
	long double Central[diclong];
	int Ndoctotal=nNumOfKind;		//Ndoctotal是文章类的数量(最大值)
	long int sumwordfreq=0;
//	long int wordfreq[nNumOfKind];
	long int *wordfreq=new long int[nNumOfKind];
	long int *pwordfreq;
	int j=0;
	double *Pd=new double[nNumOfKind];
	double *ppd;
	double (*Pdw)[diclong]=new double[nNumOfKind][diclong];
//	double **ppdw;
	int sumword[diclong];	//一个词出现的总数
	int (*num)[diclong]=new int [nNumOfKind][diclong];	//一个词在一个文档里出现的数目
	int *pnum;
	int m=0,i=0;
	
//	memset(Central,0,diclong);
	for(i=0;i<nNumOfKind;i++)
	{
		pwordfreq=wordfreq+i;
		*pwordfreq=0;
		ppd=Pd+i;
		*ppd=0;
	}
//	memset(wordfreq,0,nNumOfKind);
	for(i=0;i<diclong;i++)
	{
		*(sumword+i)=0;
		*(Central+i)=0;
	}
//	memset(sumword,0,diclong);
//	memset(Pd,0,nNumOfKind);
	for(i=0;i<nNumOfKind;i++)
	{
		for(j=0;j<diclong;j++)
		{
			*(*(Pdw+i)+j)=0;
			*(*(num+i)+j)=0;
		}
		//memset(*(Pdw+i),0,diclong);
		//memset(*(num+i),0,diclong);
	}
	j=0;
	while (m<nNumOfKind)
	{
		for(int i=0;i<diclong;i++)
		{
			if(*((*pkinddoct)+i)!=0)
			{
				Central[i]++;
			}
			sumwordfreq+=*((*pkinddoct)+i);
			pwordfreq=wordfreq+j;
			*pwordfreq+=*((*pkinddoct)+i);	
			sumword[i]+=*((*pkinddoct)+i);
			pnum=(*(num+j)+i);
			*pnum=*((*pkinddoct)+i);		
		}
		j++;m++;
		pkinddoct++;
	
	}
	for(i=0;i<diclong;i++)
	{
		Central[i]=log(Ndoctotal/Central[i]+0.01);
	}
	for(i=0;i<Ndoctotal;i++)
	{
		*(Pd+i)=((double)(*(wordfreq+i)))/((double)sumwordfreq);
		for(j=0;j<diclong;j++)
		{
			*(*(Pdw+i)+j)=((double)(*(*(num+i)+j)))/sumword[j];
		}
	}
	
	long double Hd=0,Hdw[diclong];
	for(i=0;i<diclong;i++)
	{
		Hdw[i]=0;
	}
	
	for(i=0;i<Ndoctotal;i++)
	{
		Hd+=-((*(Pd+i))*log(*(Pd+i)));
	}
	for(i=0;i<diclong;i++)
	{
		for(j=0;j<Ndoctotal;j++)
		{
			Hdw[i]+=-(*(*(Pdw+j)+i)*log(*(*(Pdw+j)+i)));
		}
	}
	
	double IG[diclong];
	
	for(i=0;i<diclong;i++)
	{
		IG[i]=Hd-Hdw[i];
	}
	
	double (*Weight)[diclong]=new double [nNumOfKind][diclong];
	
	for(i=0;i<nNumOfKind;i++)
	{
		for(j=0;j<diclong;j++)
		{
			*(*(Weight+i)+j)=0;
		}
	//	memset(*(Weight+i),0,diclong);
	}

	for(i=0;i<Ndoctotal;i++)
	{
		double Weightstd=0;
		for(j=0;j<diclong;j++)
		{
			*(*(Weight+i)+j)=*(*(num+i)+j)*Central[j]*IG[j];
			Weightstd+=(*(*(Weight+i)+j))*(*(*(Weight+i)+j));
		}
		for(j=0;j<diclong;j++)
		{
			*(*(Weight+i)+j)=(*(*(Weight+i)+j))/sqrt(Weightstd);
		}
	}

	CListNode node;

	for(i=0;i<Ndoctotal;i++)
	{
		for(j=0;j<diclong;j++)
		{
			if(Weight[i][j]>Weig_threshold && num[i][j]>Word_threshold && Central[j]>Centr_threshold)
			{
				node.WordIndex = j;
				node.Central=Central[j];
				node.Weight=*(*(Weight+i)+j);
				node.WordFreq=*(*(num+i)+j);

				(**pwordlist).AddTail(node);

			}
		}
		*pwordlist++;
		
	}
	delete wordfreq;
	for(i=0;i<nNumOfKind;i++)
	{
		delete[] *(Pdw+i);
		delete[] *(Weight+i);
		delete[] *(num+i);
	}

	delete Pd;
}

⌨️ 快捷键说明

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