统计词
/***********************************************************************/ /* 程序功能:统计文件P000.txt ~ P234.txt中 目标单词的数量, df,tf-idf 目标单词放在文件vo.txt内 统计结果放在文件mm.txt内 程序完成时间:2013.5.20 */ /***********************************************************************/ #include<iostream> #include<algorithm> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<map> #include<cmath> #include<fstream> using namespace std; #define N 235 //文件数量 #define M 100 //目标单词的数量上限,特别的 myc[i][M]表示第i篇文章的单词总数 int main() { string targetWord[1000],str; int targetWordNum=0; int i,j,k; //读取目标单词到targetWord【】字符串数组中 char rFileName[64]; sprintf(rFileName,"vo.txt",i); freopen(rFileName,"r",stdin); while(cin>>targetWord[targetWordNum++]); targetWordNum--; fclose(stdin); //为增加查找速度,将targetWord【】中的目标单词以平衡二叉树的形式保存在map m中 map <string,int> m; for(i=0;i<targetWordNum;i++) m[targetWord[i]]=i; map <string,int>::iterator it; //统计myc【】 int myc[N][M+1]={0};//myc[i][j]表示第i篇文章中,第j目标词出现的次数,特别的 myc[i][M]表示第i篇文章的单词总数 double df[M+1]={0}; //在所有文档(N个)中,有df[j]个文件出现了第j目标词 (DF) for(i=0;i<N;i++) { sprintf(rFileName,"P%03d.txt",i); ifstream fin(rFileName,ios::in); while(fin>>str) { myc[i][M]++; it=m.find(str); if(it==m.end()) continue; myc[i][(*it).second]++; } } //计算df for(i=0;i<N;i++) { for(j=0;j<targetWordNum;j++) { if(myc[i][j]>0) df[j]+=1; } } sprintf(rFileName,"mm.txt",i); freopen(rFileName,"w",stdout); //写df printf("df文件频率统计信息:\n"); for(j=0;j<targetWordNum;j++) { printf("有 %3.0f 篇文章中有该单词; ",df[j]); printf(" df 为: %.4lf ; ",df[j]=log10f(float(N)/float(df[j]))); cout<<"单词:"<<targetWord[j]<<endl; } //每篇文章中的词频及tf-idf printf("\n各篇文章中的统计信息\n"); for(i=0;i<N;i++) { printf("第%03d篇文章: 总单词数量为:%d\n",i,myc[i][M]); for(j=0;j<targetWordNum;j++) { double tf_temp=double(myc[i][j])/double(myc[i][M]); printf("次数:%3d ; ",myc[i][j]); printf("tf: %.4lf ; ",tf_temp); printf("tf-idf: %.4lf ; ",tf_temp*df[j]); cout<<"单词:"<<targetWord[j]<<endl; } cout<<endl; } fclose(stdout); system("mm.txt"); } /* 例1.有很多不同的数学公式可以用来计算TF-IDF。 这边的例子以上述的数学公式来计算。 词频 (TF) 是一词语出现的次数除以该文件的总词语数。 假如一篇文件的总词语数是100个,而词语“母牛”出现了3次,那么“母牛”一词在该文件中的词频就是3/100=0.03。 一个计算文件频率 (DF) 的方法是测定有多少份文件出现过“母牛”一词,然后除以文件集里包含的文件总数。 所以,如果“母牛”一词在1,000份文件出现过,而文件总数是10,000,000份的话,其逆向文件频率就是 lg(10,000,000 / 1,000)=4。 最后的TF-IDF的分数为0.03 * 4=0.12。 */