zoukankan      html  css  js  c++  java
  • 统计词

    /***********************************************************************/
    /*
    程序功能:统计文件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
  • 相关阅读:
    Button与Submit调用前台与后台代码的方法
    ASP.NET前台代码绑定后台变量方法总结
    点击后禁用提交按钮
    SilverLight3测试(1): Message: AG_E_NETWORK_ERROR
    SilverLight 问题解决
    XmlSerializers.dll.deploy 未成功
    命令模式泛型?问题?
    SilverLight 收藏(2009年3月27日)
    在Web安装工程中为虚拟目录指定不同的本地路径
    Silverlight 3 Sample Application: Slidentity
  • 原文地址:https://www.cnblogs.com/huangzq/p/3088794.html
Copyright © 2011-2022 走看看