统计词

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

 

posted @ 2013-05-20 16:15  黄QQ  阅读(105)  评论(0编辑  收藏  举报