c语言实现词频统计

需求:

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

2.文章中包含的标点不计入统计。

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

设计:

1.因为是跨专业0.0···并不会c++和java,只能用仅学过的C语言进行编写,还是挺费劲的。

2.定义一个包含单词和频率两个成员的结构体来统计词频(进行了动态分配内存,可以处理较大文本)。

3.使用fopen函数读取指定的文档。

4.使用fgetc函数获取字符,再根据取得的字符是否是字母进行不同的处理。

5.采用快速排序法对统计结果进行排序。

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

部分代码:

结构体定义:

struct fre_word
{
    int num;
    char a[18];
}; 

分配初始内存:

struct fre_word *w;
    w=(struct fre_word *)malloc(100*p*sizeof(struct fre_word));//给结构体分配初始内存

读取文本:

printf("输入读入文件的名字:");
    scanf("%s", filename);                                     //输入需要统计词频的文件名
    if((fp=fopen(filename, "r"))==NULL)
    {
        printf("无法打开文件\n");
        exit(0);
    }

单词匹配:

/****************将单词出现次数设置为1****************************/
    for(i=0;i<100;i++)
    {
        (w+i)->num=1;
    }
/****************单词匹配****************************************/
    i=0;
    while(!feof(fp))//文件尚未读取完毕
    {
        ch=fgetc(fp);
        (w+i)->a[j]=‘\0‘;
        if(ch>=65&&ch<=90||ch>=97&&ch<=122)                            //ch若为字母则存入
        {
            (w+i)->a[j]=ch;
            j++;
            flag=0;                                                  //设标志位判断是否存在连续标点或者空格
        }
        else if(!(ch>=65&&ch<=90||ch>=97&&ch<=122)&&flag==0)       //ch若不是字母且上一个字符为字母
        {
            i++;
            j=0;
            flag=1;
            for(m=0;m<i-1;m++)                                    //匹配单词,若已存在则num+1
            {
                if(stricmp((w+m)->a,(w+i-1)->a)==0)
                {
                    (w+m)->num++;
                    i--;
                }
            }
        }
/****************动态分配内存****************************************/
        if(i==(p*100))                                                      //用i判断当前内存已满
        {
            p++;
            w=(struct fre_word*)realloc(w,100*p*(sizeof(struct fre_word)));
            for(n=i;n<=100*p;n++)                                           //给新分配内存的结构体赋初值
                (w+n)->num=1;

        }
    }

快速排序:

void quick(struct fre_word *f,int i,int j)
{
    int m,n,temp,k;
    char b[18];
    m=i;
    n=j;
    k=f[(i+j)/2].num;                            //选取的参照
    do
    {
        while(f[m].num>k&&m<j) m++;             // 从左到右找比k小的元素
        while(f[n].num<k&&n>i) n--;             // 从右到左找比k大的元素
        if(m<=n)
        {                                       //若找到且满足条件,则交换
            temp=f[m].num;
            strcpy(b,f[m].a);
            f[m].num=f[n].num;
            strcpy(f[m].a,f[n].a);
            f[n].num=temp;
            strcpy(f[n].a,b);
            m++;
            n--;
        }
    }
    while(m<=n);
    if(m<j) quick(f,m,j);                      //运用递归
    if(n>i) quick(f,i,n);
}

结果输出:

    for(n=0;n<=i;n++)
    {
        printf("文档中出现的单词:");
        printf("%-18s",(w+n)->a);
        printf("其出现次数为:");
        printf("%d\n",(w+n)->num);
    }

测试用例:

看了之前同学的博客以及老师的评论,就使用了较长的文本进行测试,用的是奥巴马就职演讲稿。

部分测试结果:

时间: 2024-11-08 21:49:11

c语言实现词频统计的相关文章

C语言实现词频统计——第二版

原需求 1.读取文件,文件内包可含英文字符,及常见标点,空格级换行符. 2.统计英文单词在本文件的出现次数 3.将统计结果排序 4.显示排序结果 新需求: 1.小文件输入. 为表明程序能跑 2.支持命令行输入英文作品的文件名 3. 支持命令行输入存储有英文作品文件的目录名,批量统计 4. 从控制台读入英文单篇作品,重定向输出 代码实现: 在原代码的基础上稍做了修改,使之可以批量读取文件夹下的所有文件,所以加了一个mode来判断是单个文件输入还是文件夹输入,来不及整理程序,所以现在程序有点丑.这次

C语言词频统计设计

项目需求: 1.设计一个词频统计小软件,对给定的英文文章进行单词频率的统计. 2.文章中相应的标点不计入统计. 3.将统计结果以从大到小的排序方式输出. 设计: 1.因为功能相对简单,采用C语言直接进行编写. 2.项目包含的统计功能利用定义的结构体分别对单词和次数进行统计. 3.以字符串的形式读取单词,并对其中的每个字符进行标点分析. 4.统计完成后采用冒泡排序的方式对次数进行排序. 5.将整个统计结果循环输出. 部分核心代码: 结构体定义: typedef struct addup { cha

结对项目 - 词频统计Ⅱ

目的与要求 代码复审练习 结对练习 编写单元测试 基于上一个结对项目的结果,读取小文本文件A_Tale_of_Two_Cities.txt 或者 大文本文件Gone_with_the_wind.txt,统计某一指定单词在该文本文件中出现的频率. 命令行格式: 提示符> Myapp.exe -f filename.txt -w word (PS:C++ 程序,Java 程序输出方式类似) 解释: 选项 -f 表示打开某一文件 选项 -w 表示统计其后单词在打开的文件中的频率 详细内容 开发语言:J

个人项目——词频统计

前言: 开发工具:Visual Studio 2013 开发语言:C++ 源代码管理工具:Github Github源代码网址:https://github.com/superyy/YY1/blob/master/%E8%AF%8D%E9%A2%91%E7%BB%9F%E8%AE%A1main.cpp 预计各功能所花时间:some hours 实际各功能所花时间:some hours 性能提高所花时间:some hours 要求 :实现一个控制台程序,给定一段英文字符串,统计其中各个英文单词(4

第二周作业-词频统计

本周作业是词频统计,编程具体要求如下: https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/922 对实现功能进行简要的介绍: 功能一:小文件输入,为表明程序能跑.需要在控制台下输入命令,得到文件中不重复的总单词数.并对单词出现的次数进行排序输出. 功能二:支持命令行输入英文作品的文件名,亲自录入,输出显示不重复单词总数,并对出现频率最高的前10的单词进行输出 功能三:支持命令行输入存储有英文作品文件的目录名,批量统计词频. 功能四:

结对项目 - 词频统计

目的与要求 代码复审练习 结对练习 编写单元测试 基于作业3的结果,读取一个较小的文本文件A_Tale_of_Two_Cities.txt,统计该文件中的单词的频率,并将统计结果输出到当前目录下的 Result1.txt 文件. (第一阶段初稿完成该要求) 命令行格式: 提示符> Myapp.exe -f filename.txt > Result.txt (PS:C++ 程序,Java 程序输出方式类似) filename.txt 为前面下载的文件名. 解释: 选项 -f 表示后面跟文件名

Hadoop的改进实验(中文分词词频统计及英文词频统计)(4/4)

声明: 1)本文由我bitpeach原创撰写,转载时请注明出处,侵权必究. 2)本小实验工作环境为Windows系统下的百度云(联网),和Ubuntu系统的hadoop1-2-1(自己提前配好).如不清楚配置可看<Hadoop之词频统计小实验初步配置> 3)本文由于过长,无法一次性上传.其相邻相关的博文,可参见<Hadoop的改进实验(中文分词词频统计及英文词频统计) 博文目录结构>,以阅览其余三篇剩余内容文档. (五)单机伪分布的英文词频统计Python&Streamin

个人作业——词频统计

本次编程项目的主题为英文单词词频统计,主要分为下面四个小项目: 1.统计已存在的文档中的英文单词词频统计,并降序输出: 2.用户输入文件名,程序对其中的内容进行词频统计并降序输出: 3.用户输入指定文件夹的路径,程序遍历路径下的所有文件,并分别对其中的内容进行词频统计,降序输出前10个单词的词频: 4.用户在控制台按照要求输入文本内容,并将输入的内容存入指定文本中,程序对输入的内容进行词频统计并降序输出. 我在本科学期间进行过C/C++的学习,所以本次作业使用的语言为C++,使用codebloc

词频统计单元测试

我这次用构造单词树的形式进行词频统计,此次的任务是对已有的程序进行单元测试.选用的工具是JUnit.它是基于测试驱动开发(TDD)原理的. 此次词频统计的主体思想是,每次读入文章中的128(自己设定)个字符(目的是防止溢出),将这些字符存储到一颗树中,树中的节点有一个存储词频的变量和一个指向子节点的数组(类似于c语言中的指针).最后遍历整棵树,按照词频进行排序. 下面是我的片段代码 下面这段代码是定义的节点的结构 class CharTreeNode{ int count=0; CharTree