/***********************************************************************/
/*
程序功能:统计文件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。
*/