结对第二次—文献摘要热词统计及进阶需求
作者:互联网
结对第二次—文献摘要热词统计及进阶需求
格式描述
• 课程名称:软件工程1916|W(福州大学)
• 作业要求:结对第二次—文献摘要热词统计及进阶需求
• 结对学号:041602421 翁昊 |
• 作业目标:
一、基本需求:实现一个能够对文本文件中的单词的词频进行统计的控制台程序。
二、进阶需求:在基本需求实现的基础上,编码实现顶会热词统计器。
________________________________________
• 作业格式描述:该博客首段
• 作业完成工具: IDEA & github
• 博客编辑器: MARKDOWN
• PSP:正文
• github: www.
________________________________________
WordCount基本需求
(一)WordCount基本需求
实现一个命令行程序,不妨称之为wordCount。
统计文件的字符数:
• 只需要统计Ascii码,汉字不需考虑
• 空格,水平制表符,换行符,均算字符
统计文件的单词总数,单词:至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写。
英文字母: A-Z,a-z
字母数字符号:A-Z, a-z,0-9
分割符:空格,非字母数字符号
例:file123是一个单词,123file不是一个单词。file,File和FILE是同一个单词
统计文件的有效行数:任何包含非空白字符的行,都需要统计。
统计文件中各单词的出现次数,最终只输出频率最高的10个。频率相同的单词,优先输出字典序靠前的单词。
按照字典序输出到文件result.txt:例如,windows95,windows98和windows2000同时出现时,则先输出windows2000
输出的单词统一为小写格式
输出的格式为
characters: number
words: number
lines: number
: number
: number
(二)WordCount进阶需求
新增功能,并在命令行程序中支持下述命令行参数。说明:字符总数统计、单词总数统计、有效行统计要求与个人项目相同
- 使用工具爬取论文信息
从CVPR2018官网爬取今年的论文列表,输出到result.txt(一定叫这个名字),内容包含论文题目、摘要,格式如下:
为爬取的论文从0开始编号,编号单独一行
两篇论文间以2个空行分隔
在每行开头插入“Title: ”、“Abstract: ”(英文冒号,后有一个空格)说明接下来的内容是论文题目,或者论文摘要
后续所有字符、单词、有效行、词频统计中,论文编号及其紧跟着的换行符、分隔论文的两个换行符、“Title: ”、“Abstract: ”(英文冒号,后有一个空格)均不纳入考虑范围 - 附加题(20')
本部分不参与自动化测试,如有完成,需在博客中详细描述,并在博客中附件(.exe及.txt)为证。附加功能的加入不能影响上述基础功能的测试,分数取决于创意和所展示的完成度,创意没有天花板,这里不提出任何限制,尽你们所能去完成。
________________________________________
1 . 解题思路
总体:先完成大致的函数框架,再对框架进行细节填补和调试。
具体:WordCount基本需求:从文本文件中按行逐个读取所有字符,然后将每行存入字符数组,接着通过指针读取字符,使用正则表达式和标志位判断是否为单词,保存于word中,统计并排序,最后将统计结果输出到文件中。
2 . 设计过程
• 阶段一
o 共同讨论WordCount的基本功能需求
o 代码基本实现WordCount的基本需求
o 将项目各个功能分离成独立函数并进行相应的测试调整
o 对代码进行相应的测试和调整优化
• 阶段二
o 将项目按照作业格式上传github
o 撰写博客
3 . 关键代码
WordCount基本需求
//爬取单词
int TextAnalysisUtil::wordAnalysis(char * fileName, WordInf * tempArr)
{
ifstream fin(fileName);
if (!fin)
{
cout << "cuowu";
return -1;
}
char ch;
string str;
int state = 0;
int nflag;
int wordCount = 0;
unordered_map<string, int> map;
while (fin.get(ch))
{
switch (state)
{
case 0:
//查找单词首的状态
if (isdigit(ch))
{
//转入找到数字开头的过滤状态
state = 1;
}
else if (isalpha(ch))
{
//找到单词,转入爬取单词状态
state = 2;
str = ch;
nflag = 1;//记录单词开头字母数
}
break;
case 1:
//转入找到数字开头或不符合单词开头有4个字母的过滤状态
if (!(isdigit(ch)||isalpha(ch)))
{
state = 0;
}
break;
case 2:
//爬取单词状态
if (isalpha(ch))
{
++nflag;
str += ch;
if (nflag >= 4)
//进入爬取单词尾部状态
state = 3;
}
else
{
//不满足单词开头有4个字母
state = 1;
}
break;
case 3:
//爬取单词尾部状态
if (isdigit(ch) || isalpha(ch))
{
str += ch;
}
else
{
//处理和存入字符串
transform(str.begin(), str.end(), str.begin(), ::tolower);
state = 0;
wordCount++;
map[str]++;
}
break;
default:
break;
}
}
//遍历找出频率最高的top10单词
for (auto iter = map.begin(); iter != map.end(); iter++)
{
if (isWordGreater(iter->first, iter->second, tempArr[9].word, tempArr[9].count))
{
tempArr[9].word = iter->first;
tempArr[9].count = iter->second;
for (int i = 9; i >= 1; i--)
{
if (isWordGreater(tempArr[i].word, tempArr[i].count, tempArr[i - 1].word, tempArr[i - 1].count))
{
swap(tempArr[i], tempArr[i - 1]);
}
}
}
}
fin.close();
return wordCount;
}
//主函数
int main(int argc, char *argv[])
{
TextAnalysisUtil TA;
ifstream infile;
WordInf tempArr[10] = {
};
infile.open(argv[1], ifstream::binary | ifstream::in);
if (!infile) {
cout << "失败" << endl;
return 1;
}
infile.close();
ofstream outFile;
outFile.open("result.txt");
if (!outFile) {
cout << "失败" << endl;
return 1;
}
outFile << "characters: " << TA.asciiCount(argv[1]) << endl;
outFile << "words: " << TA.wordAnalysis(argv[1],tempArr) << endl;
outFile << "lines: " << TA.countLines(argv[1]) << endl;
for (int d = 0; d < 10; d++)
{
if(tempArr[d].count>0)
outFile <<"<"<<tempArr[d].word << ">: " << tempArr[d].count << endl;
}
}
```
4.WordCount基本需求单元测试
5.交流与讨论
简单交流了下实现问题,还交流了下单元测试实现的问题,总之很顺利的就沟通好了。
6.困难与解决
1.一开始不知道从哪里开始下手。就对需求进行了细读分析,发现需求也分成了较大的版块。于是就对大的板块着手进行分析。调出关键部分函数进行分析构建,也就有了入手之处。
2.由于没找到适合储存单词的类,就构造了一个类来存储,解决了单词存储问题。
3.对分隔符一开始理解不够,以为就是空格。后来才发现分隔符在需求上有定义。所以认真看需求也很重要。
4.对于成为单词的条件没有完全使用正则表达式来实现,而是使用了标志位加正则表达式实现,想来是复杂了。
5.有一些细节问题,开始编码的时候未发现,后来通过步入调试一一解决了。
7.心得与总结
虽然只完成了基础需求部分。但从需求到实现,也动了很多脑筋。比如字符的读入,正则表达式的读入,数据的存放,排序和命令行参数。中间的调试也花了不少时间。最后测试完,也对代码进行了一些调整。总之,就是不会就上网搜索学习,有好的方法也要跟着吸收。
翁昊
自己:完成了部分代码的编写和调试,编程能力得到了提升,也认识到自己的能力上的不足又学到复习了很多实用的知识。进阶部分没来得及完成还是很遗憾的。
队友:认真负责,积极提供了重要的帮助,也完成了另一部分的工作,合作很愉快。
邱志勇
自己:
队友:
总结
这次任务涉及代码部分但其实是模仿现在公司的代码编程规范,现在让我们接触这些规范是有好处的,能及时的改成我们的错误的编程,培养良好的,高效率的编程。这是非常重要的。
psp
标签:tempArr,需求,结对,ch,进阶,热词,WordCount,单词,统计 来源: https://www.cnblogs.com/wenghaoo/p/10538864.html