【C++】统计文本词频程序
1 #include <iostream> 2 #include <fstream> 3 #include <string> 4 #include <iomanip> 5 #include <vector> 6 #include <map> 7 #include <cctype> 8 #include <algorithm> 9 bool cmp(std::pair<std::string, size_t>& a, 10 std::pair<std::string, size_t>& b){ 11 return a.second > b.second; 12 }//词频从大到小排序 13 14 int main(){ 15 std::ifstream ifs{}; 16 ifs.open("./input.txt", std::ifstream::in);//从input.txt读入文本 17 std::string text( (std::istreambuf_iterator<char>(ifs) ), 18 (std::istreambuf_iterator<char>() ) ); 19 //std::istreambuf_iterator<char>()表示文件结尾 20 ifs.close(); 21 const std::string separators{" ():;.[],\n"};//分隔符,可自定义 22 std::map<std::string, size_t> mp; 23 std::string word{}; 24 size_t start{text.find_first_not_of(separators)}, end{}; 25 while(start != std::string::npos){ 26 end = text.find_first_of(separators, start+1); 27 word = text.substr(start, end-start); 28 std::transform(word.begin(), word.end(), word.begin(), 29 [](unsigned char c){ return std::tolower(c); });//将单词统一转换为小写字母 30 ++mp[word]; 31 start =text.find_first_not_of(separators, end+1); 32 } 33 size_t cnt{}; 34 const size_t perline{6};//每行输出6个单词和词频 35 std::vector<std::pair<std::string, size_t> > v; 36 copy(mp.begin(), 37 mp.end(), 38 std::back_inserter<std::vector<std::pair<std::string, size_t> > >(v)); 39 sort(v.begin(), v.end(), cmp); 40 std::stringstream ss{}; 41 for(const auto& item : v){ 42 ss << std::right << std::setw(15) << item.first << " : " << std::left << std::setw(5) << item.second; 43 if(++cnt % perline == 0){ 44 ss << std::endl; 45 } 46 } 47 ss << std::endl; 48 std::ofstream ofs{}; 49 ofs.open("./res.txt", std::ofstream::out | std::ofstream::trunc );//结果输出到res.txt中 50 ofs << ss.str(); 51 ofs.close(); 52 return 0; 53 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· Qt个人项目总结 —— MySQL数据库查询与断言