您的位置:首页 > 其它

分析一个文档(英语文章)中各个词出现的频率,并打印频率最高的前10个。

2014-03-02 14:00 585 查看
程序思路1.首先完成读文件的操作,并存储单词,

    2,利用map的value排序,并记录单词的个数。

3。打印频率最高的10个。

日记:刚开始拿到这个题目是有点棘手,以前也做过类似的输入一段英文字母,并计算单词个数以及文件读取输入的操作,但要把他们合起来一块就没有做过了。

回去后我做了一下程序的分析思路。

先是确定程序具体需要实现怎样的功能,打印频率前10的单词。

所以我们需要有处理分析一个文本的东西,我用map的value排序,借助vector 。

之后我通过调用函数库里的函数进行了插入,排序,读取在,最后输出。里面最新颖的还是利用了map这个关联式容器,增加和删除节点对迭代的结果很小。还有其中的插入,排序,查找,删除的功能,效率高。

时间安排:

2.26 我开始想起要做软件工程的作业了,想了一下,感觉时间还很充裕,就想了下该做些什么。把题目先明确了。

2.28 晚上有些时间,写了一些代码,零零总总的一个文件读写功能实现模块。想了想怎么实现排序,插入等集成功能,实用类还是用容器。

3.1 上网查了下,发现map这个容器很不错,效率也挺高,搞过来了。然后调试代码,很费劲。但也能实现基本功能,有一些是网上的东西。

#include <iostream>
#include <algorithm>
#include <fstream>
#include <map>
#include <vector>
#include <iterator>
#include <functional>
#include <string>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
#define COUNT 10 //打印前多少个单词
//单词类
class WordTop10
{
private :
map<string,int> mapWord; //存储单词
vector<pair<string ,int > > pair_vec; //因为要按map的value排序,借助vector
public :

void insertWord(const string& word); //插入单词到map
void sortWord(); //按map的value排序
void readFile(const string& strFileName); //从文件读数据
void outPut(); //输出
};

//在map中插入一个单词
void WordTop10::insertWord(const string& word)
{
map<string,int>::iterator mit;
mit = mapWord.find(word);
if( mit != mapWord.end())
{
mit->second ++;
}
else
{
mapWord[word] = 1;
}
}
//递减排序
int cmp(const pair<string ,int >& a,const pair<string ,int >& b)
{
return a.second > b.second;
}
//按map中的value排序
void WordTop10::sortWord()
{

for(map<string,int>::iterator map_iter = mapWord.begin(); map_iter != mapWord.end(); ++map_iter)
{
pair_vec.push_back(make_pair(map_iter->first,map_iter->second));
}
sort(pair_vec.begin(),pair_vec.end(),cmp); //排序

}

void WordTop10:: outPut()
{
int i = 0;
for(vector<pair<string ,int > >::iterator cur = pair_vec.begin(); cur != pair_vec.end(); ++cur)
{
i++;
if(i >COUNT) //输出前COUNT个
{
return ;
}
cout << cur->first <<"\t"<<cur->second<<endl;
}
}

//从文件中读取数据
void WordTop10::readFile(const string& strFileName)
{
string text;
// c_str函数的返回值是const char*的,不能直接赋值给char*,所以就需要我们进行相应的操作转化,下面就是这一转化过程。
ifstream in(strFileName.c_str());

if (!in)
{
cout << "~文件打开失败~" << endl;

}

while (in >> text)
{
//text.erase(remove_if(text.begin(),text.end(),bind2nd(equal_to<char>(),'-')), text.end());
//因为读入是以空格分割的,需要处理两边的表标点符号
//取出最后的标点,假设最多有三个尾标点
string::iterator it = text.end();
if(text.length() != 0 && ispunct(text[text.length()-1]))
text.erase(it-1); //去掉最后那个标点

it = text.end();
if(text.length() != 0 && ispunct(text[text.length()-1]))
text.erase(it-1);

it = text.end();
if(text.length() != 0 && ispunct(text[text.length()-1]))
text.erase(it-1);
//有时前面也有符号 ,假设3个
it = text.begin();
if(text.length() != 0 &&ispunct(text[0]))
text.erase(it);

it = text.begin();
if(text.length() != 0 && ispunct(text[0]))
text.erase(it);

it = text.begin();
if(text.length() != 0 &&ispunct(text[0]))
text.erase(it);

//很多字符串带 “--”,特殊处理,--也是标点符号,两头的已在前面处理过,这里处理中间的
size_t npos = text.find("--");
if( npos != -1)
{
string text1 = text.substr(0,npos); //--把text分割成两个单词
string text2 = text.substr(npos+2);
insertWord(text1);
insertWord(text2);

}
else
{
insertWord(text);
}

}

in.close();
in.clear();
return ;
}

int main()
{

WordTop10 wordTop;

wordTop.readFile("H:\\haha.txt");
wordTop.sortWord();
wordTop.outPut();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: