C语言词频统计设计

项目需求:

1.设计一个词频统计小软件,对给定的英文文章进行单词频率的统计。

2.文章中相应的标点不计入统计。

3.将统计结果以从大到小的排序方式输出。 

 

设计:

1.因为功能相对简单,采用C语言直接进行编写。

2.项目包含的统计功能利用定义的结构体分别对单词和次数进行统计。

3.以字符串的形式读取单词,并对其中的每个字符进行标点分析。

4.统计完成后采用冒泡排序的方式对次数进行排序。

5.将整个统计结果循环输出。

 

部分核心代码:

结构体定义:

定义一个结构体来存放读取的单词与其统计的次数。

typedef struct addup
{
    char word[50];
    int count;
}R;

读取文本1.0(采用fopen函数读取固定路径文本):

       char temp[50];
       R fin[10000]={"\0",0};
       fp=fopen("f:/1.txt","r");

读取文本2.0(采用stdin函数手动输入读取路径):

改进:相对之前的代码,更换函数使得可以用户手动录入想要读取的文本路径,而不用直接修改源码。

       char temp[50];
       R fin[10000]={"\0",0};
char file[10]; fflush(stdin); gets(file); fp=freopen(file,"r",stdin);

单词匹配:

针对读取的每个单词,和结构体中之前存取的单词进行对比,如果相同则累计数量,如果不同则更新数组。

while(!feof(fp))
       {
           fscanf(fp,"%s",temp);
           q=strlen(temp);
           n++;
    for(i=0;i<n;++i)
        if(strcmp(fin[i].word,temp)==0)
        {
             fin[i].count++;
              n--;
              break;
         }
         if(i>=n)
         {
             strcpy(fin[n-1].word,temp);
             fin[n-1].count++;
         }
       }

标点判定:

将读取的字符串以字符为单位判断标点并去除。

for(i=0;i<q;i++)
{
     if(temp[i]==','||temp[i]=='.'||temp[i]=='?'||temp[i]=='!'||temp[i]=='"')
     temp[i]='\0';
}

冒泡排序:

for (i=0;i<n;i++)  
        for (j=0;j<n-i;j++)  
          {  
            if (fin[j].count<fin[j+1].count)  
               {  
               ls[0]=fin[j+1];  
               fin[j+1]=fin[j];  
               fin[j]=ls[0];  
               }  
          }  

输出结果:

 freopen("f:/2.txt","w",stdout);      
       for(i=0;i<n;i++)
       {
         printf("%s : ",fin[i].word);
         s=0;
            for(j=0;j<fin[i].count;++j)
             s++;
         printf("%d 次",s);
         printf("\n");
       }
       fclose(stdout);

 

测试用例:

因为词频统计单词重复几率不会过高,因此小篇幅文章不一定能得出好的测试结果,选取了马丁路德金的《I have a dream》演讲稿进行统计。

全篇单词量:1666

 

测试结果:

posted @ 2016-09-05 12:42  shaloo  阅读(4866)  评论(3编辑  收藏  举报