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

 

測試結果:


免責聲明!

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



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