20180918-1 词频统计

作业要求参见 https://edu.cnblogs.com/campus/nenu/2018fall/homework/2126

本次作业代码地址:https://coding.net/u/KamiForever/p/SPEC20180918/git/blob/master/wf.cpp。

一,重点分析和代码实现:

1.关于单词的输入,我才去每次都只选取一个字母,如果字母是大写英文字母就变成小写,不是字母就把之前的合并成一个单词(用一个before变量去判定前面的是一个字母,如果不是字母则跳过),然后用hash去把单词给记录进结构体words中储存。

while(~scanf("%c", &c)) {
        if((c >= 65 && c <= 90) || (c >= 97 && c <= 122)) {
            if(c >= 65 && c <= 90) c += 32;
            word[i++] = c;
            before = 1;
        }
        else {
            if(before) {
                word[i] = ‘\0‘;
                Hash(word);
                i = 0;
                before = 0;
            }
        }
    }

其中关于单词辨识,我认为有任何符号就是把两个单词分开来了,其中会将形如we‘ll或者someone‘s处理成两个单词,但是只会处理成we和ll而不是we和will,这里是一个盲点,目前不知道如何解决。

2.关于文件夹批量处理,这里采用_finddata_t结构体和_findfirst与_findnext函数进行处理,具体的使用方式学习于https://blog.csdn.net/wangqingchuan92/article/details/77979669。

bool solvethree(char fileName[]) {
    strcat(fileName, "\\*.txt");
    long k = HANDLE = _findfirst(fileName, &file);
    if(k == -1) return false; //得到的文件夹名字后面加.txt如果能找到就说明输入的是文件夹的名字
    else {
        while (k != -1) {
            printf("%s\n", file.name);
            solve(file.name);
            output();
            k = _findnext(HANDLE, &file);
            if(k != -1) printf("----\n");
        }
        _findclose(HANDLE);
    }
    return true;
}

3.对于将单词插入结构体words中,由于考虑到可能数据量很大,采用了hash的方式去插入,具体就是取每个单词的前3个字母(不到3个,有几个取几个)组合成一个6位数,然后去mod一个Maxn(代码里面取的是1000000,可以随情况更改),对于得到的数进行hash插入,如果这个数的位置上有单词了,就往后移动一位知道能插入位置。

void Hash(char word[]) {
    int len = strlen(word);
    if(len >= 3) len = 3;
    int t = 0;
    for(int i = 0; i < len; i++) {
        t = t * 100;
        t += (word[i] - 97);
    }
    t = t % Maxn;
    while(1) {
        if(words[t].cnt == 0) {
            words[t].cnt = 1;
            strcpy(words[t].content, word);
            wordtotal += 1;
            wordcnt += 1;;
            return;
        }
        else {
            if(strcmp(words[t].content, word) == 0) {
                words[t].cnt += 1;
                wordtotal += 1;
                return;
            }
            else {
                if(t == Maxn - 1) t = 0;
                else t += 1;
            }
        }
    }
}

4.重定向,由于样例输入中有“<”将输入重定向到一个文件中,输出则用freopen函数去重定向到文件夹中,先用getwcd函数获取算法文件的地址buff,然后在后面接上\out.txt即为输入到的文件名,生成输入到的文件名的地址,然后用freiopen见输出重定向到out.txt中。

char buf[200];
    char out[200];
    getcwd(buf, sizeof(buf));  //获取本地文件直接地址
    strcat(buf, "\\");
    strcpy(out, buf);
    strcat(out, "out.txt");
    freopen(out, "w", stdout); // freopen重定向使输出到out.txt中

使用完需要用fclose()函数去关闭重定向。

5.文件输入,用到fopen函数,定义FILE变量fp,用fgetc(fp)去读取文件中的每个字符,然后用feof(fp)去判定文件时候到底,最后用fclose关闭。

void getword(char name[]) {
    fp = fopen(name, "r");  //用fopen打开文件从而进行输入
    before = 1;
    wordcnt = 0;
    wordtotal = 0;
    int i = 0;
    memset(words, 0, sizeof(*words));
    while(!feof(fp)) {   //用于构造单词,并且把所有的大写字母变为小写字母
        c = fgetc(fp);
        if((c >= 65 && c <= 90) || (c >= 97 && c <= 122)) {
            if(c >= 65 && c <= 90) c += 32;
            word[i++] = c;
            before = 1;
        }
        else {
            if(before) {
                word[i] = ‘\0‘;
                Hash(word); //将构造出来的单词hash插入结构体words中
                i = 0;
                before = 0;
            }
        }
    }
    fclose(fp);
    fp = NULL;
    return;
}

6.文件输出,由于单词数量可能过多,所以只输出前10个单词,当单词数不够10个的时候按此时单词数输出,其中为了统一输出格式,用\t去控制空格数量,此时我认为最长单词不超过24位。

void output() {
    for(int i = 0; i < ((wordcnt < 10) ? wordcnt : 10); i++) {
        int len = strlen(words[i].content);
        printf("%s", words[i].content);
        for(int j = 0; j < 3 - (len / 8); j++) printf("\t");
        printf("%d\n", words[i].cnt);
    }
    return;
}

二,每种功能实现方式和功能执行图

1.功能一:

读取文件名test.txt,然后获取每个单词并且用hash方法插入到结构体中,用sort排序然后输出,本功能并没有任何难点。

2.功能二:

读取文章的名字,然后在文章的名字后面加上词缀.txt,然后就和功能一同样的实现方法了,问题在于和功能三的区分这里在功能三的介绍中会出现,由于会有大数据所以数组要开的大一点,我初步认为不会重复的单词数量不超过1000000,如果不够可以改变文件开头的Maxn值去改善。

3.功能三:

读取文件夹的名字,关于在和功能二的区分上,我在获得的字符串后面加上“\*.txt”生成fileName,然后用_findfirst(fileName, &file),如果返回结果为-1,则说明输入的是文章的名字而并非文件夹的直接地址,关于文件夹内容批量处理我在上文说过,这里不再赘述,在批量处理中能得到文件的名字,然后将得到的每一个文件的名字都用功能一去处理就完事了。

4.功能四:

功能四的不同点在于可以重定向输入输出,输入可以用"< 文件名"的样例形式,输出则用freopen重定向,然后printf就可以把输出的重定向的文件内。

原文地址:https://www.cnblogs.com/KamiForever/p/9695218.html

时间: 2024-08-30 12:43:56

20180918-1 词频统计的相关文章

词频统计-单元测试

我自己的单元测试没有弄出来,我用c编的,在visual studio中貌似实现不了单元测试,而李俞寰同学是用c#编写的词频统计,在vs2015中实现单元测试无比的方便,所以我请教了他并借鉴了一下. [TestMethod()] public void DictionarySortTest() { Dictionary<string,int>input=new Dictionary<string,int>() { {"you,1}, {"are",1},

词频统计-功能一

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

词频统计效能测试---------第二版

在第一次的词频统计中,对JProfile 款软件不是很熟悉,感觉数据不是很准确,在程序启动时JProfile总是提示Java虚拟机已退出,后来经过查阅知道解决方案:截图如下   要将 keep vm alive 勾选上. 程序总体总体情况如下: 当程序运行之后,cpu和内存的使用几乎在同一时间有一个明显的上升过程. 各个对象使用情况如下 下面是热点函数的展示,这也和我在程序中运用时间戳确定建树函数[generateCharTree()]占用时间较多的情况相符.因为对这个程序来说主要时间都花费在单

结对项目 - 词频统计Ⅱ

目的与要求 代码复审练习 结对练习 编写单元测试 基于上一个结对项目的结果,读取小文本文件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

实验二-3 Hadoop&amp;Paoding 中文词频统计

  参考教程 在Hadoop上使用庖丁解牛(较复杂,并未采用,可以之后试试) http://zhaolinjnu.blog.sohu.com/264905210.html Lucene3.3.Lucene3.4中文分词——庖丁解牛分词实例(屈:注意版本) http://www.360doc.com/content/13/0217/13/11619026_266124504.shtml 庖丁分词在hadoop上运行时的配置问题(采纳了一半,没有按照其所写配置dic属性文件) http://f.da

初学Hadoop之中文词频统计

1.安装eclipse 准备 eclipse-dsl-luna-SR2-linux-gtk-x86_64.tar.gz 安装 1.解压文件. 2.创建图标. ln -s /opt/eclipse/eclipse /usr/bin/eclipse #使符号链接目录 vim /usr/share/applications/eclipse.desktop #创建一个  Gnome 启动 添加如下代码: [Desktop Entry] Encoding=UTF-8 Name=Eclipse 4.4.2

第二周作业-词频统计

本周作业是词频统计,编程具体要求如下: 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

组合数据类型练习,英文词频统计实例

1.由字符串创建一个作业评分表,做增删改查询统计遍历操作,例如查询第一个3分的下标,统计1分的同学有几个,3分的同学有几个,增删改查等等. 2.字典实例:建立学生学号成绩字典,做增删改查遍历操作. 3.列表,元组,字典,集合的遍历. 4.英文词频统计实例 news = '''When I was young I'd listen to the radio Waiting for my favorite songs When they played I'd sing along, It make