c++實現文本中英文單詞和漢字字符的統計


源代碼下載:http://download.csdn.net/detail/nuptboyzhb/4987141

1.統計文本中漢字的頻數,為后續的文本分類做基礎。對於漢字的統計,需要判斷讀取的是否為漢字。源代碼如下:

[C++ code]

[cpp]   view plain copy
  1. /* 
  2.  *@author:鄭海波 http://blog.csdn.net/NUPTboyZHB 
  3.  *參考:實驗室小熊 
  4.  *注:有刪改 
  5.  */  
  6. #pragma warning(disable:4786)  
  7. #include <iostream>  
  8. #include <vector>  
  9. #include <fstream>  
  10. #include <string>  
  11. #include <map>  
  12. #include <queue>  
  13. #include <ctime>  
  14. using namespace std;  
  15. void topK(const int &K)  
  16. {  
  17.     double t=clock();  
  18.   
  19.     ifstream infile("test.txt");  
  20.     if (!infile)  
  21.         cout<<"can not open file"<<endl;  
  22.   
  23.     string s="";  
  24.     map<string,int>wordcount;  
  25.     unsigned char temp[2];  
  26.     while(true)//國標2312  
  27.     {  
  28.         infile>>temp[0];  
  29.         if(infile.eof()) break;  
  30.         if (temp[0]>=0xB0)//GB2312下的漢字,最小是0XB0  
  31.         {  
  32.             s+=temp[0];  
  33.             infile>>temp[1];  
  34.             s+=temp[1];  
  35.         }  
  36.         else//非漢字字符不統計  
  37.         {  
  38.             s="";  
  39.             continue;  
  40.         }  
  41.         wordcount[s]++;  
  42.         s="";  
  43.     }  
  44.     cout<<"單詞種類:"<<wordcount.size()<<endl;  
  45.     //優先隊列使用小頂堆,排在前面的數量少,使用">";  
  46.     priority_queue< pair< int,string >,vector< pair< int,string > >,greater< pair< int,string> > > queueK;  
  47.     for (map<string,int>::iterator iter=wordcount.begin(); iter!=wordcount.end(); iter++)  
  48.     {  
  49.         queueK.push(make_pair(iter->second,iter->first));  
  50.         if(queueK.size()>K)  
  51.             queueK.pop();  
  52.     }  
  53.     pair<int,string>tmp;  
  54.     //將排在后面的數量少,排在前面的數量多  
  55.     priority_queue< pair< int,string >,vector< pair< int,string > >,less< pair< int,string> > > queueKless;  
  56.     while (!queueK.empty())  
  57.     {  
  58.         tmp=queueK.top();  
  59.         queueK.pop();  
  60.         queueKless.push(tmp);  
  61.     }  
  62.     while(!queueKless.empty())  
  63.     {  
  64.         tmp=queueKless.top();  
  65.         queueKless.pop();  
  66.         cout<<tmp.second<<"\t"<<tmp.first<<endl;  
  67.     }  
  68.     cout<<"< Elapsed Time: "<<(clock()-t)/CLOCKS_PER_SEC<<" s>"<<endl;  
  69. }  
  70.   
  71. int main()  
  72. {  
  73.     int k=0;  
  74.     cout<<"http://blog.csdn.net/NUPTboyZHB\n";  
  75.     while (true)  
  76.     {  
  77.         cout<<"查看前K個頻率最高的漢字,K=";  
  78.         cin>>k;  
  79.         if(k<=0)break;  
  80.         topK(k);  
  81.     }  
  82.     return 0;  
  83. }  


[圖1]


2.統計英文單詞的出現頻率。這比統計漢字更加的容易,因為單詞和單詞之間是用空格分開的,所以,直接將單詞保存到string中即可。

[c++ code]

[cpp]   view plain copy
  1. /* 
  2.  *@author:鄭海波 http://blog.csdn.net/NUPTboyZHB 
  3.  *參考:實驗室小熊 
  4.  *注:有刪改 
  5.  */  
  6. #pragma warning(disable:4786)  
  7. #include <iostream>  
  8. #include <vector>  
  9. #include <fstream>  
  10. #include <string>  
  11. #include <map>  
  12. #include <queue>  
  13. #include <ctime>  
  14. using namespace std;  
  15. void topK(const int &K)  
  16. {  
  17.     double t=clock();  
  18.   
  19.     ifstream infile;  
  20.     infile.open("test.txt");  
  21.     if (!infile)  
  22.         cout<<"can not open file"<<endl;  
  23.     string s;  
  24.     map<string,int>wordcount;  
  25.   
  26.     while(true)  
  27.     {  
  28.         infile>>s;  
  29.         if(infile.eof()) break;  
  30.         wordcount[s]++;  
  31.     }  
  32.     cout<<"單詞種類:"<<wordcount.size()<<endl;  
  33.     //優先隊列使用小頂堆,排在前面的數量少,使用">";  
  34.     priority_queue< pair< int,string >,vector< pair< int,string > >,greater< pair< int,string> > > queueK;  
  35.     for (map<string,int>::iterator iter=wordcount.begin(); iter!=wordcount.end(); iter++)  
  36.     {  
  37.         queueK.push(make_pair(iter->second,iter->first));  
  38.         if(queueK.size()>K)  
  39.             queueK.pop();  
  40.     }  
  41.     pair<int,string>tmp;  
  42.     priority_queue< pair< int,string >,vector< pair< int,string > >,less< pair< int,string> > > queueKless;  
  43.     while (!queueK.empty())  
  44.     {  
  45.         tmp=queueK.top();  
  46.         queueK.pop();  
  47.         queueKless.push(tmp);  
  48.     }  
  49.     while(!queueKless.empty())  
  50.     {  
  51.         tmp=queueKless.top();  
  52.         queueKless.pop();  
  53.         cout<<tmp.second<<"\t"<<tmp.first<<endl;  
  54.     }  
  55.     cout<<"< Elapsed Time: "<<(clock()-t)/CLOCKS_PER_SEC<<" >"<<endl;  
  56. }  
  57. int main()  
  58. {  
  59.     int k=0;  
  60.     cout<<"http://blog.csdn.net/NUPTboyZHB\n";  
  61.     while (true)  
  62.     {  
  63.         cout<<"PUT IN K: ";  
  64.         cin>>k;  
  65.         if(k<=0)break;  
  66.         topK(k);  
  67.     }  
  68.     return 0;  
  69. }  


[圖2]


參考:實驗室小熊


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM