【tips】【词频统计】中可能用到的资源,以C++为例
前言
我不知道C#什么情况,不过C++里面,什么参数都不传时,argc=1,argv里面是当前程序名。当你传入dir时,argc=2,当你传入-e dir时,argc=3。
这个文章十分适合有一点C语言基础,然后想自己独立完成这个作业的童鞋。预计只有一点点C语言基础的童鞋只需要5个小时左右就能搞定~
如果有帮助请点赞。。还有哦。。blog里肯定不能给出代码的是吧,blog里面不能!!!~
分析词频统计这个题目,主要需要实现3个部分:
- 递归的查找一个文件夹下面符合规则的文件。
- 对于每一个合法文件,进行读入,按照“单词规则”进行词的划分。
- 对于所有的词进行统计,排序,输出。
这肯定不会给出源码。但是肯定对C语言基础的童鞋独立完成作业有很大的帮助!
文件读入
这里给出一个简单的方法:
如果我们知道每个合法文件的绝对路径,就可以依次打开文件进行读取(用C的fopen或者C++的ifstream)。关键是如何知道一个文件夹下面所有的文件。如果你会使用CMD,就会知道在windows环境下dir这个指令和列出文件目录有关。通过查看dir的帮助文档,发现用如下命令可以递归的列出一个文件夹下面所有文件:
dir [dictionary] /S /B > FileDir.tmp
并且cmd支持正则表达式,所以可以用*.txt等直接获得合法的文件。后面的大于号表示将输出保存到当前目录下面的FilrDir.txt文件中:
于是我们就获得了所有需要统计的文件的绝对路径。这些信息保存在当前目录下的一个tmp文件中(其实就是一个文本文件)。关键是怎么在C++里面执行这个指令。stdlib.h里面有一个函数叫system(char* userCmd),表示在cmd里面执行userCmd命令。其中userCmd是一个字符串。所以我们可以在程序里面用system()函数执行那句命令,然后得到tmp文件。统计的时候,只需要把地址依次读出,然后打开那个地址指向的文件。统计词频就可以。好吧。。看来这里有很多问题。。。
显然在你直接使用这个命令的时候不会出现任何问题。
system(argv[argc-]);
但在程序里面测试实际地址的时候,竟然有人写了如下语句,然后还一直埋怨说调试过不了:
char str[]="D:\n.txt";
system(str);
我不想用咆哮体,但。。。但忍不住啊!!!你输出回车的时候用的是什么啊?不是printf("\n");吗?难道就木有发现\是个转意字符吗?正确的写法是D:\\Dir好不好啊!!!
单词划分 这个用不用C++特性无所谓,唯一需要的是细心,不要漏掉规则。
词频统计
如果说,让你统计有n个100以内的数字,每个数字出现的次数。这个很简单,你肯定会开一个长度101的数组arr,然后每当k出现一次,arr[k]++。但现在是统计单词出现次数。C++里面你可以是用一个东西叫做map(在map头文件中)。用map可以实现一个“数组” arr,这个数组的下表就是单词,保存的内容就是单词出现的次数。比如有一个单词叫buaa,那么通过map定义的“数组”,你可以实现arr["buaa"]++;这个操作。这个“数组”叫做map容器,可以当数组一样使用。定义一个map容器很简单:map的用法建议参考C++ primer。
map<string,int> wordMap;
还有一个问题是怎么样保存应该输出哪个单词,在这里我是用了另一个map<string, string>保存的。就是所有的单词全换成小写,作为下标。对于某个单词输出的时候,输出的值是该单词在第二个map对应的单词,以及第一个map里对应的次数。
排序输出
在这里你可能需要先了解vector头文件中的vector,utility头文件中的pair,以及刚才提到的map。这两个数据结构都在C++primer中有详细介绍,分别在P78,P306,P309。如果你不了解这3个东西,下面一段话很可能看不懂。不过没有关系,你都有整个map容器了,大不了自己写一堆代码,把map的值全遍历到一个自己的数据结构里面,然后排个序输出。下面的方法只是讲用C++的库函数省了写过多代码。
C++里面自带sort函数,在algorithm头文件中。sort函数可以排序数组,vector,等等(我不知道能不能排序map,没有试过,因为不用考虑效率问题,当时直接把所有map的内容移到vector里面了)。因为最后的答案是<key,value>键值对,而pair就是这种形式。所以直接用pair保存每一个<单词,次数>键值对。然后放在vector中。
pair<string,int> tmp;
tmp.first=wordTrans[mapIt->first];
tmp.second=mapIt->second;
接下来对于vector(这里vector变量名是sortArray)直接sort就好了。
sort(sortArray.begin(),sortArray.end(),Compare);
sort函数包含3个参数,分别是排序起始的位置,排序结束的位置,以及比较函数函数名。这个比较函数是自己写的。
bool Compare(pair<string, int> a,pair<string, int>b){...}
函数需要返回bool型,以便告诉sort,在什么情况下,我认为a<b。
通过这种方式,只需要几行代码就能完成最后一步。工作量要小不少。
以上就是整个作业的大体。写下来大约100行左右。如果有什么问题或者需要接一下C++ primer,可以留言或者找我们小组的成员。
Z.XML
编辑:肖俊鹏
【tips】【词频统计】中可能用到的资源,以C++为例的更多相关文章
- Programming | 中/ 英文词频统计(MATLAB实现)
一.英文词频统计 英文词频统计很简单,只需借助split断句,再统计即可. 完整MATLAB代码: function wordcount %思路:中文词频统计涉及到对"词语"的判断 ...
- sqoop进行将Hive 词频统计的结果数据传输到Mysql中
使用sqoop进行将Hive 词频统计的结果数据传输到Mysql中. mysql准备接受数据的数据库与表 hive准备待传输的数据 sqoop进行数据传输 mysql查看传输结果 二:电子书 ...
- 作业3-个人项目<词频统计>
上了一天的课,现在终于可以静下来更新我的博客了. 越来越发现,写博客是一种享受.来看看这次小林老师的“作战任务”. 词频统计 单词: 包含有4个或4个以上的字 ...
- C语言实现词频统计——第二版
原需求 1.读取文件,文件内包可含英文字符,及常见标点,空格级换行符. 2.统计英文单词在本文件的出现次数 3.将统计结果排序 4.显示排序结果 新需求: 1.小文件输入. 为表明程序能跑 2.支持命 ...
- c语言实现词频统计
需求: 1.设计一个词频统计软件,统计给定英文文章的单词频率. 2.文章中包含的标点不计入统计. 3.将统计结果以从大到小的排序方式输出. 设计: 1.因为是跨专业0.0···并不会c++和java, ...
- 软件工程第一次个人项目——词频统计by11061153柴泽华
一.预计工程设计时间 明确要求: 15min: 查阅资料: 1h: 学习C++基础知识与特性: 4-5h: 主函数编写及输入输出部分: 0.5h: 文件的遍历: 1h: 编写两种模式的词频统计函数: ...
- Hadoop上的中文分词与词频统计实践 (有待学习 http://www.cnblogs.com/jiejue/archive/2012/12/16/2820788.html)
解决问题的方案 Hadoop上的中文分词与词频统计实践 首先来推荐相关材料:http://xiaoxia.org/2011/12/18/map-reduce-program-of-rmm-word-c ...
- 使用storm分别进行计数和词频统计
计数 直接上代码 public class LocalStormSumTopology { public static void main(String[] agrs) { //Topology是通过 ...
- jieba库分词词频统计
代码已发至github上的python文件 词频统计结果如下(词频为1的词组数量已省略): {'是': 5, '风格': 4, '擅长': 4, '的': 4, '兴趣': 4, '宣言': 4, ' ...
随机推荐
- webpack4——打包html报错解决
①先引入html-webpack-plugin插件,然后在终端下载 npm install --save-dev html-webpack-plugin ②我的文件结构 ③修改webpack.dev. ...
- lua浮点数取整
向下取整 math.floor(num) 向上取整 math.ceil(num) 取整取余 math.modf(num) 测试 num = 12.4 print(math.floor(num)) 12 ...
- 企业Shell面试题及企业运维实战案例(三)
1.企业Shell面试题1:批量生成随机字符文件名案例 使用for循环在/oldboy目录下批量创建10个html文件,其中每个文件需要包含10个随机小写字母加固定字符串oldboy,名称示例如下: ...
- 【mysql学习-2】
part-1: USE mysql;CREATE TABLE tb_x(id INT,NAME CHAR(10));INSERT INTO tb_x VALUES(5,"a");S ...
- Elasticsearch 常用API
1. Elasticsearch 常用API 1.1.数据输入与输出 1.1.1.Elasticsearch 文档 #在 Elasticsearch 中,术语 文档 有着特定的含义.它是指最顶 ...
- node获取头信息数据
req.fresh req.stale var version = 100; app.get('/test',function(req,res){ res.set('etag',version); i ...
- FPGA算法学习(1) -- Cordic(圆周系统之旋转模式)
三角函数的计算是个复杂的主题,有计算机之前,人们通常通过查找三角函数表来计算任意角度的三角函数的值.这种表格在人们刚刚产生三角函数的概念的时候就已经有了,它们通常是通过从已知值(比如sin(π/2)= ...
- MVC中输入的保护验证用:HttpServerUtility.HtmlEncode
安全说明: 上面的代码使用HttpServerUtility.HtmlEncode来保护应用程序的恶意输入 (即 JavaScript).详细信息请参阅如何: 在 Web 应用程序,通过应用 HTML ...
- Microsoft Security Essentials 和 Windows Defender 离线升级包下载地址
自从微软提供了免费的杀毒软件之后我就卸载掉了其他的杀毒软件.但是最近遇到了个小问题,我这里有一批电脑不能联网,杀毒软件的升级成了问题.在网上搜索了一番,终于找到了官方的离线升级包下载地址.放在这里备用 ...
- 5 多线程 模拟qq聊天
1.多线程思路 使用多线程完成一个全双工的QQ聊天程序 2.版本1:程序小框架 #1.收数据,然后打印 def recvData(): pass #2.检测键盘,发数据 def sendData(): ...