使用map和set实现简单的词频统计

2024-03-18 12:28

本文主要是介绍使用map和set实现简单的词频统计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、运行效果图

在这里插入图片描述

二、代码示例

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;class TextQuery {
public:void readFile(const string &filename);void query(const string &word);
private:vector<string> _lines; // 用于保存每一行的内容map<string, set<int>> _wordsNumbers; // 用于保存每个词所在的行号map<string, int> _dict; // 用于保存每个词的词频
};void TextQuery::readFile(const string &filename) {// 打开文件流ifstream ifs(filename);if (!ifs.good()) {ifs.close();cerr << "open " << filename << " is fail" << endl;return;} // 操作数据string line;size_t lineNumber = 0; // 行号while (getline(ifs, line)) {++lineNumber;_lines.push_back(line); // 记录每一行istringstream iss(line);string word;// 一行一行地处理while (getline(iss, word, ' ')) {word.erase(remove_if(word.begin(), word.end(), [](const char c) {return !isalpha(c); // 处理掉非字母部分}),word.end());if (word.size() == 0) { // 跳过空字符continue;}++_dict[word]; // 词频+1// 存入word的行号auto it = _wordsNumbers.find(word);if (it == _wordsNumbers.end()) { // 还没有word对应的keyset<int> numbers;numbers.insert(lineNumber);_wordsNumbers[word] = numbers;} else { // 有对应key,直接插入it->second.insert(lineNumber);}}}// 关闭文件流ifs.close();
}void TextQuery::query(const string &word) {// 先判断是否存在auto dictIt = _dict.find(word);if (dictIt == _dict.end()) {cout << "\"" << word << "\"" << " never appears!" << endl;return;}// 查找数据cout << "\"" << word << "\"" << " occurs " << dictIt->second << ((dictIt->second > 1) ? " times" : " time") << endl;auto wordsNumbersIt = _wordsNumbers.find(word); // 不用再校验for (const auto &lineNumber : wordsNumbersIt->second) {cout << lineNumber << ": ";// 标亮显示行内容istringstream iss(_lines[lineNumber - 1]);string tempWord;while (getline(iss, tempWord, ' ')) {if (word == tempWord) {cout << "\033[31m" << tempWord << "\033[0m" << " ";                } else {cout << tempWord << " ";}}cout << endl;}
}void test0() {TextQuery tq;tq.readFile("./test.txt");string word;while (cout << "请输入要查询的关键字:", getline(cin, word)) {tq.query(word);} cout << endl;
}int main(void) {test0();return 0;
}

这篇关于使用map和set实现简单的词频统计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/822328

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法