个人作业——词频统计

本次编程项目的主题为英文单词词频统计,主要分为下面四个小项目:

1、统计已存在的文档中的英文单词词频统计,并降序输出;

2、用户输入文件名,程序对其中的内容进行词频统计并降序输出;

3、用户输入指定文件夹的路径,程序遍历路径下的所有文件,并分别对其中的内容进行词频统计,降序输出前10个单词的词频;

4、用户在控制台按照要求输入文本内容,并将输入的内容存入指定文本中,程序对输入的内容进行词频统计并降序输出。

我在本科学期间进行过C/C++的学习,所以本次作业使用的语言为C++,使用codeblock进行代码编写;但是由于时间距离较长,遗忘了很多,在编程开始前用了一些时间进行复习。因为编程序的时候将四个小项目放在四个文件中,后来为了方便使用才将它们的代码放在了一个文件中,并进行用户输入选择,实现不同的项目功能,所以不同选择中会有代码重复,这次由于时间问题没有进行解决,之后会将其进行合并解决。项目选择部分如下图:

图 1 项目选择头部

下面对每个小项目进行详细介绍:

  项目一:

项目一的功能是统计已存在的文档(test2.txt)中的英文单词词频统计,并降序输出。我构建了名为wq的结构体,创建结构体数组word[M]来存放单词的内容和词频;将大写字母均换成了相应的小写字母,避免单词因大小写不同而重复;在单词读取过程中我进行了是否读到文件末尾的判断;使用稳定的排序算法——冒泡排序按照词频数进行降序排列,最终输出。项目一的重点和难点主要是实现文档读取的功能。项目一的运行截图如下:

图 2 项目一运行截图

重要代码片段如下(打开文件和读取并存储单词信息):

        fp = fopen("C://Users//Administrator//wf//test2.txt", "r");//读取文件,若有需求则应改为你要读取的文件的绝对路径
        //读所有单词
        while (!feof(fp)){
            //feof()检测是否达到文件尾部
            ch = getc(fp);//获取当前字符
            if (ch == ‘ ‘ || ch == 10){
                //ASCLL码中10为换行符,此条件为遇到空格或换行则跳过
                continue;
            }
            if ((ch >= ‘a‘&&ch <= ‘z‘) || (ch >= ‘A‘&&ch <= ‘Z‘)) {
                //发现一个单词
                K = 0;
                t_word.count = 1;
                while ((ch >= ‘a‘&&ch <= ‘z‘) || (ch >= ‘A‘&&ch <= ‘Z‘) || (ch == ‘\‘‘)){
                    if (ch >= ‘A‘&&ch <= ‘Z‘)
                        ch += 32;    //大写转换成小写
                    t_word.danci[K++] = ch;  //把当前字母存入数组
                    ch = getc(fp);
                }
                t_word.danci[K++] = ‘\0‘;//结束标志\0,一个单词结束
                j = n;   //j用来记录当前单词的个数
                for (i = 0; i<j; i++) {
                    //与前面的单词比较
                    if (strcmp(t_word.danci, word[i].danci) == 0){
                        //如果有单词相同
                        word[i].count++;//则此类单词加1
                        break;
                    }
                }
                if (n == 0 || i == j){
                    //前面如果没有相同的单词
                    word[n] = t_word;//则为此类单词开辟新单元
                    n++;
                }
            }
        }

项目二:

项目二的功能是用户输入文件名,程序对其中的内容进行词频统计并降序输出。项目二实际上是在项目一的基础上增加了文件名输入和读取相对路径下名称特定的文件的功能,这也是此项目的一个重点、难点。项目二的运行截图如下:

图 3 项目二运行截图

由于单词数量较多,当运行结束后在控制台界面上无法出现前面的单词等内容,所以我将项目二的运行情况进行了分别截图,并在程序末尾又增加了显示不重复单词总数的输出语句,以证明统计不重复单词总数这个功能的能够正确使用。

重要的代码片段如下(文件名输入和读取路径):

        int K, n = 0, i, j;
        string name;
        string lujing;
        cout<<"请输入文件名 Jane_Eyre"<<endl;
        cin>>name;
         lujing="C://Users//Administrator//wf//folder//"+name+".txt";
        string s=lujing;
        char *dst = new char[255];
        for(i=0; i <=s.length(); i++)
            dst[i]=s[i];
        dst[i] = ‘\0‘;
        fp=fopen(dst,"r");

 项目三:

项目三功能是用户输入指定文件夹的路径,程序遍历路径下的所有文件,并分别对其中的内容进行词频统计并降序输出前10个单词的词频。项目三特有的重点是遍历指定目录下的所有文件,并依次对文件进行读取操作,我使用listFiles()方法进行目录文件的查询。由于我使用了_findfirst()、_findnext()进行搜索,得到了“.”和“..”两个文件夹名,经过上网查找资料发现“”这两个可以忽略。此外,项目三中获取输入地址时我使用的是cin.getline,但是在运行程序时发现没有进行输入,程序就跳出了,也是上网查询后加入了“cin.ignore();”语句得到了解决。项目代码中我定义当输入‘\’符号表示地址路径输入结束,点击回车键即可进行下面的查询、统计工作。在指定目录下我存放了三个不同名称和内容的TXT文档。项目要求分别输出每个文档词频数最高的10个单词及其词频数,只需将循环输出的上界进行修改。项目三的运行截图如下:

图 4 项目三运行截图

重要代码片段如下(查找路径下的所有文件):

void listFiles(const char * dir){
    intptr_t handle;
    _finddata_t findData;
    handle = _findfirst(dir, &findData);    // 查找目录中的第一个文件
    if (handle == -1){
        cout << "无法找到目录中的第一个文件!\n";
        return;
    }
    while (_findnext(handle, &findData) == 0){
        if (findData.attrib & _A_SUBDIR&& strcmp(findData.name, ".") == 0&& strcmp(findData.name, "..") == 0)
            // 是否是子目录并且不为"."或".."
            cout<<endl;
        else{
            txtname[f]=findData.name;
            f++;
        }
    }
    _findclose(handle);    // 关闭搜索句柄
}

  项目四:

项目四的功能是用户在控制台按照要求输入文本内容,并将输入的内容存入指定文本中,程序对输入的内容进行词频统计并降序输出。项目四我使用了fstream和io.h头文件中的函数进行文件的读写操作,若当前路径下没有指定文件则先创建新文件,再进行读写操作。我对写入操作设置了特定的结束符“EOF”,输入结束后按下空格键,再输入“EOF”就表示文字输入完毕。项目四的运行截图如下:

重要代码片段如下(打开文件并输入文本内容):

        fstream iofile("test.txt",ios::out);
        if(!iofile){
            cout << "创建新文档中……\n";
            exit(0);
        }
        cout << "请输入内容(输入结束后请按回车并输入“EOF”结束标志):"<<endl;
        while(1){
            getline(cin,str);
            if(str=="EOF") break;
            iofile << str << endl;
        }
        iofile.close();

  PSP阶段表格


分类


预计花费时间(分)


实际花费时间(分)


项目一


120


61


测试项目一并完善修改


80


项目二


180


52


测试项目二并完善修改


164


项目三


240


95


测试项目三并完善修改


246


项目四


200


98


测试项目四并完善修改


112


项目最终测试和修改


120


124

对比我计划和实际消耗的时间发现,虽然在编程之前对程序的实现过程和算法有了一定的了解,但实际消耗的时间要远远大于计划时间,尤其在测试和修改项目时花费了很多时间。我觉得这很大的原因是不能熟练地掌握C++的一些函数和算法,在程序运行时遇到了很多问题,从而需要特别多的时间去查询相应的原因和解决方法,这样在项目实现部分就花费了很多超计划的时间。

代码及版本控制

地址:https://git.coding.net/jyj5951/wf.git

时间: 2024-10-29 05:00:30

个人作业——词频统计的相关文章

第二周作业-词频统计

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

软件工程第二次作业 词频统计

1.项目名称:词频统计 2.代码地址:https://coding.net/u/songyuu/p/python_wf/git 3.代码如下: 1 import os 2 import re 3 import collections 4 #print(os.getcwd()) #显示wf.py路径 5 #print(os.listdir())#显示目录下的文件 6 file_name=input("wf ") 7 if not os.path.isfile(file_name+'.tx

第二周结对编程作业——词频统计

本周作业是结对编写一个词频统计的程序,我们组是我(欧阳思琪)和贺晋飞同学共同完成这项任务.在仔细阅读了要求之后,我们组对程序编程进行了讨论.由于语言可以不必局限于要求中的C.C++,我们便考虑JAVA或python,两者各有优缺点,JAVA写起来比较繁重,而基于以往用python处理NLP相关项目的经验觉得python较为简单,但觉得在简单要求下,使用JAVA的运行速度明显更快,所以我们选择使用JAVA来完成本次作业. 分工:欧阳思琪 代码编写与博客编写 贺晋飞   代码审查与代码测试 实际:由

软件工程第二周作业----词频统计

实验要求: 统计文件中出现过的单词数目,并按数目和字典顺序排序,将结果输出到指定文件中.需要统计单词的文件名从命令行输入. 实验分工: 代码编写&测试:张文杰 博客编写:朱昱青 实验思路: 1.在主函数中打开输入和输出文件,获得文件的指针,然后以指针为参数调用count()函数进行词频统计. 2.在count()函数中,利用while循环,不断从文件中分离出可能是单词的字符串(也就是被分隔符隔开的连续字母和数字),然后进一步判断该字符串是否是一个单词.如果是,再查看这个单词是否出现过,如果出现过

【现代软件工程】第一次作业——词频统计

目录 1.1基本功能 1.2设计实现 1.3代码结构 1.4测试运行 1.5性能分析 1.6项目总结 1.7 PSP展示   1.1 基本功能 1. 统计文件的字符数(只需要统计Ascii码,汉字不用考虑,换行符不用考虑,'\0'不用考虑)(ascii码大小在[32,126]之间) 2. 统计文件的单词总数 3. 统计文件的总行数(任何字符构成的行,都需要统计)(不要只看换行符的数量,要小心最后一行没有换行符的情形)(空行算一行) 4. 统计文件中各单词的出现次数,输出频率最高的10个. 5. 

作业4词频统计2

[必做 2] 读取小文本文件A_Tale_of_Two_Cities.txt 或者 大文本文件Gone_with_the_wind.txt,统计某一指定单词在该文本文件中出现的频率. 命令行格式: 提示符> Myapp.exe -f filename.txt -w word (PS:C++ 程序,Java 程序输出方式类似) 解释: 选项 -f 表示打开某一文件(filename.txt) 选项 -w 表示统计其后单词(word)在打开的文件(filename.txt)中的频率. package

作业8-组合数据类型练习,英文词频统计实例上

1.字典实例:建立学生学号成绩字典,做增删改查遍历操作. 总结列表,元组,字典,集合的联系与区别. 运行结果: 2.列表,元组,字典,集合的遍历,总结列表,元组,字典,集合的联系与区别. 运行结果: 区别: 列表用"[]"表示,列表是可变的数据类型,即这种类型是可以被改变的,并且列表是可以嵌套的. 元组用"()"表示,元祖和列表十分相似,不过元组是不可变的,但也可以嵌套. 字典用"{}"表示,注意它们的键/值对用冒号分割,而各个对用逗号分割,所有

作业10-中文词频统计

中文分词 下载一中文长篇小说,并转换成UTF-8编码. 使用jieba库,进行中文词频统计,输出TOP20的词及出现次数. 排除一些无意义词.合并同一词. 对词频统计结果做简单的解读. 运行结果: 分析:讲的是岛村和一名女子的故事.

词频统计-功能一

一.完成一个小程序 我 拿到这个题目之后,就决定用最不熟悉的c#来实现,因为老师说不懂的去学才会有进步.布置任务后的第二天就开始去图书馆借了两本书<c#从入门到精髓>,<c#项目实战>,拿到书之后看了入门书<c#从入门到精髓>,看书的过程时痛苦的,因为发现大二选修课学的c#全交还给老师了,只能重头再学了.唯一有点印象的就是窗口应用程序,基于UI的设计. 写代码首先需要工具,由于电脑上没有visual studio的安装包,当时求助了度娘. 如果没有安装包的同学们,可以借