c++实现词频统计

Posted _Boxer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++实现词频统计相关的知识,希望对你有一定的参考价值。

需求:从一个英文txt中读取内容,实现词频统计。

现完成:基本功能大概完成了,由于编程基础比较差,文件操作部分还不是很熟练,我发现从文件中提取字符串流读取到程序的string对象中,会把所有的空格过滤掉,导致没法统计单词频率,目前还没找到解决方法,只能先手动输入文章了。ORZ...

好好学习java,目前看来,处理字符串等问题还是java有成熟的解决方案。

  1 /**
  2  * 对一段英文的词频统计
  3 
  4  */
  5 #include <iostream>
  6 #include <string>
  7 
  8 using namespace std;
  9 /**
 10  * 单词对象
 11  */
 12 struct Word
 13 {
 14     Word() : Str(""), Count(0)
 15     {}
 16     string Str;
 17     int Count;
 18 
 19     /**
 20      * 交换单词(用于排序)
 21      *  word 交换的单词对象
 22      */
 23     void exchange(Word &word)
 24     {
 25         string tStr = word.Str;
 26         int tCount = word.Count;
 27         word.Str = Str;
 28         word.Count = Count;
 29         Str = tStr;
 30         Count = tCount;
 31     }
 32 };
 33 
 34 /**
 35  * 统计词频
 36  * words 单词数组
 37  * newWord 单词内容
 38  *  size 单词总数
 39  */
 40 void CalcCount(Word * words, string &newWord, int size)
 41 {
 42     int i = 0;
 43     for(; i < size; i++)
 44     {
 45         if(words[i].Str == newWord)
 46         {
 47             words[i].Count++;
 48             return;
 49         }
 50         else if(words[i].Str == "")
 51             break;
 52     }
 53     words[i].Str = newWord;
 54     words[i].Count = 1;
 55 }
 56 
 57 
 58 void SortWordDown(Word * words, int size)
 59 {
 60     for(int i = 0; i < size; i++)
 61     {
 62         for(int j = 0; j < size-1; j++)
 63         {
 64             if(words[j].Count <  words[j+1].Count)
 65             {
 66                 words[j].exchange(words[j+1]);
 67             }
 68         }
 69     }
 70 }
 71 
 72 int main()
 73 {
 74     Word * words;
 75     string content;
 76     cout << "输入一段英文:";
 77     getline(cin, content);
 78 
 79     //计算单词总数
 80     int wCount = 1;
 81     for(unsigned int i = 0; i < content.length(); i++)
 82     {
 83         if(content[i] ==  )
 84             wCount++;
 85     }
 86     words = new Word[wCount];
 87 
 88     string::size_type offset = content.find( );//单词都是以空格隔开
 89     while(offset != string::npos)
 90     {
 91         string wStr = content.substr(0, offset);
 92         content.erase(0, offset+1);
 93         CalcCount(words, wStr, wCount);
 94         offset = content.find( );
 95     }
 96     CalcCount(words, content, wCount);//计算最后一个单词
 97 
 98     SortWordDown(words, wCount);
 99     int printCount = wCount ;
100     
101     for(int i = 0; i < printCount; i++)
102     {
103         cout << words[i].Str << "\t" << words[i].Count <<  endl;
104     }
105 
106     delete [] words;
107     return 0;
108 }

 

以上是关于c++实现词频统计的主要内容,如果未能解决你的问题,请参考以下文章

个人项目 - 词频统计

词频统计单元测试

c语言实现词频统计

结对项目— 词频统计(语言C++)

词频统计

结对项目— 词频统计2(语言C++)