📄 ccm.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 + -