一个文本分词程序

 WordMap类从分词库中读入分词 

将分词存入unordered_map<std::string, int> 中

#pragma once
#include<istream>
#include<unordered_map>
#include<string>
#include<ctime>
class WordMap {
public:WordMap(const std::string& filename);~WordMap();bool init();std::unordered_map<std::string, int> m_map;std::string m_filename;private:time_t difftime;std::string timestr( tm*);
};
#include"wordmap.h"
#include<fstream>
#include<iostream>
#include<sstream>
#include<ctime>
WordMap::WordMap(const std::string& filename):m_filename(filename), difftime(5)
{
}WordMap::~WordMap() {}bool WordMap::init()
{std::ifstream input(m_filename);std::istringstream inputstring;time_t last;time(&last);time_t cur;if (input.is_open()){std::string inputs;tm nowtime; localtime_s(&nowtime,&last);std::cout << "开始初始化分词库,当前时间" << timestr(&nowtime)<<std::endl;while (std::getline(input, inputs)){time(&cur);std::istringstream inputstring(inputs);int num;int num2;std::string word;inputstring >> num;inputstring >> word;inputstring >> num2;m_map[word] = num2;if (cur - last > difftime){std::cout << "已初始化分词个数:" << m_map.size() << std::endl;last = cur;}}time(&cur);localtime_s(&nowtime, &cur);std::cout << "结束初始化分词库,当前时间" << timestr(&nowtime) << std::endl;}else{std::cerr << "can't not open file:" << m_filename;return false;}return true;
}std::string WordMap::timestr(tm* nowtime)
{std::ostringstream out;out << nowtime->tm_hour << ":" << nowtime->tm_min << ":" << nowtime->tm_sec;return  std::move(out.str());
}

从文本中读入,对文本进行分词,分词方法详见

http://yangshangchuan.iteye.com/blog/2031813

以下是实现

#pragma once
#include<string>
using std::string;
#include<vector>
using std::vector;
#include"wordmap.h"
class FindWord 
{
public:FindWord() {};~FindWord() {};vector<string> GetKeyWords(const string& filename,const WordMap& wordmap);
private:int wsize = 5;bool ischinese(const char* c);
public:int getlocalfindstring(const string& ostring, int begpos);
};
@ -0,0 +1,71 @@
#include "findword.h"
#include<fstream>
#include<sstream>
#include<iostream>
using std::ifstream;
using std::istringstream;
vector<string> FindWord::GetKeyWords(const string & filename, const WordMap& wordmap)
{vector<string> l_keyword;ifstream inputfile(filename);if (!inputfile.is_open()){std::cerr << "cann't not open file:" << filename;return l_keyword;}string sinput;string last;while (std::getline(inputfile, sinput)){last = sinput;int begpos = 0;int length;while ((length = getlocalfindstring(last, begpos)) != 0){int movelen = ischinese(&last[begpos]) ?  2:1;int findlen = -1;while (movelen<=length){string ls = last.substr(begpos, movelen);auto res = wordmap.m_map.find(ls);if (res != wordmap.m_map.end()){findlen = movelen;}movelen += ischinese(&last[begpos + movelen]) ? 2 : 1;}if (findlen != -1){l_keyword.push_back(last.substr(begpos, findlen));begpos = begpos + findlen;}else {begpos += length;}}}return l_keyword;
}bool FindWord::ischinese(const char* c)
{unsigned char cur = *c;unsigned char next = *(c + 1);if (next == 0)return false;return (cur >= 0xB0 && cur <= 0xF7) && (next >= 0xA1 && next <= 0xFE);
}int FindWord::getlocalfindstring(const string& ostring,int begpos)
{int size = wsize;int endpos = begpos;while (size > 0 && ostring[endpos]){if (ischinese(&ostring[endpos])) {endpos++;}size--;endpos++;}return endpos-begpos;
}

样例程序

@ -0,0 +1,16 @@
#include"wordmap.h"
#include<iostream>
#include<string>
#include"findword.h"
using std::string;
int main()
{WordMap m_wordmap("../../../word/word1.txt");FindWord m_findword;if (!m_wordmap.init()) { return 0; };vector<string> res= m_findword.GetKeyWords("../../../inputfile/1999.txt", m_wordmap);for (auto elems : res)std::cout << elems << " ";return 0;
}

github:https://github.com/wuzhuorui/kjct.git

转载于:https://www.cnblogs.com/creativityroom/p/8472253.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

scala学习手记28 - Execute Around模式

我们访问资源需要关注对资源的锁定、对资源的申请和释放&#xff0c;还有考虑可能遇到的各种异常。这些事项本身与代码的逻辑操作无关&#xff0c;但我们不能遗漏。也就是说进入方法时获取资源&#xff0c;退出方法时释放资源。这种处理就进入了Execute Around模式的范畴。 在s…

【时序数据库InfluxDB】Windows环境下配置InfluxDB+数据可视化,以及使用 C#进行简单操作的代码实例...

前言&#xff1a;如题。直接上手撸&#xff0c;附带各种截图&#xff0c;就不做介绍了。1、influxDB的官网下载地址 https://portal.influxdata.com/downloads/打开以后&#xff0c;如下图所示&#xff0c;可以选择版本号&#xff0c;以及平台。此处咱们选择windows平台。不过…

官宣 微软跨平台 UI 框架 .NET MAUI 6 正式发布

微软宣布 .NET MAUI 已正式 GA。 .NET MAUI (.NET Multi-platform App UI) 是一个跨平台 UI 框架&#xff08;前身是 Xamarin.Forms&#xff09;&#xff0c;用于通过 C# 和 XAML 创建原生移动和桌面应用。基于 .NET MAUI&#xff0c;开发者可在单个共享代码库中创建同时支持 A…

92. Reverse Linked List II

Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1->2->3->4->5->NULL, m 2 and n 4, return 1->4->3->2->5->NULL. Note:Given m, n satisfy the following condition:1 ≤ m ≤ n ≤ lengt…

Reset

在常用的代码中&#xff0c;我们使用AddForm.form.reset();或者AddForm.getForm().reset();来将FormPanel重置。 但是当页面增加和修改公用一个formpanel时&#xff0c;当先点击修改时&#xff0c;窗体修改显示出数据&#xff0c;关闭窗体后&#xff08;window.hide()&#xff…

《.NET物联网从零开始》系列

近日搞硬件网关时&#xff0c;那些残存的数电、模电和通信原理的记忆时常在脑海中萦绕&#xff1b;想起来多年前看张高兴的博客学会了.netcore树莓派进行物联网开发。使用dragonboard(龙板)搭载windows 10 iot系统&#xff0c;配合光电传感器和rfid实现了一个项目原型。碰巧逛g…

设计好接口的 36 个锦囊(原则)

目录 设计好接口的 36 个锦囊 | 接口参数校验 | 修改老接口时&#xff0c;注意接口的兼容性 | 设计接口时&#xff0c;充分考虑接口的可扩展性 | 接口考虑是否需要防重处理 | 重点接口&#xff0c;考虑线程池隔离 | 调用第三方接口要考虑异常和超时处理 | 接口实现考虑…

嵌入式第11次实验

嵌入式软件设计第11次实验报告 学号&#xff1a;140201236 姓名&#xff1a;沈樟伟 组别&#xff1a;第2组 实验地点&#xff1a;D19 一、实验目的&#xff1a; 1、了解短信AT指令的使用方法。 2、掌握使用短信AT指令驱动SIM900A发送和接收短信的方…

Linux文件系统之df

df用于查看当前挂载的文件系统-a 查看所有的文件系统可以自己指定容量单位&#xff0c;-BM -BG 但是还是h的选项好用-i 查看inode的使用信息-l(L) 显示本地文件系统--output 可以指定管理员想要看的列--outputField_List可用的字段有source fstype itotal iused iavail ipcent …

普通老实人的生活

2019独角兽企业重金招聘Python工程师标准>>> 有一个朋友&#xff0c;他家有一套营业房&#xff0c;租给了两个年轻人&#xff0c;合同签订为半年&#xff0c;房租7000&#xff0c;合同到期当天&#xff0c;乙方一直没有联系甲方&#xff0c;说明续租或不续租&#x…

如何在 C# 中运行 Python 代码

前言Python是一门强大的编程语言。特别的是&#xff0c;它还具有众多出色的库&#xff08;例如numPy&#xff0c;sciPy&#xff0c;pandas等&#xff09;&#xff0c;可以显著简化和加速开发。因此&#xff0c;在解决某些问题时&#xff0c;通过 Python 实现可能是最理想的方式…

Ubuntu开机默认进入命令行模式/用户图形界面

一、开机默认进入命令行模式 # 输入命令&#xff1a; sudo systemctl set-default multi-user.target # 重启&#xff1a; reboot要进入图形界面&#xff0c;只需要输入命令startx 从图形界面切换回命令行&#xff1a;ctrlaltF7 二、开机默认进入图形用户界面 # 输入命令&…

数组查找数字5

public class Second {/*** param args*/public static void main(String[] args) {// TODO Auto-generated method stubint []a{2,1,3,4,5};for (int i0;i<a.length-1;i){if(a[i]!5){i;}}System.out.println("这组数里有5呢"); }} 转载于:https://www.cnblogs.co…

【QGIS入门实战精品教程】10.2:QGIS中DEM三维显示方法

QGIS中数字高程模型DEM三维显示方法。 参考阅读: 【ArcGIS Pro微课1000例】0006:ArcGIS Pro 2.5三维显示DEM数字高程模型 【ArcGIS Pro微课1000例】0005:ArcGIS Pro 2.5基于矢量数据制作拉伸三维地图案例 ArcGIS实验教程——实验二十六:ArcScene实现二维数据的三维显示 文章…

AUTH password

为redis服务请求设置一个密码。redis可以设置在客户端执行commands请求前需要通过密码验证。通过修改配置文件的requirepass就可以设置密码。 如果密码与配置文件里面设置的密码一致&#xff0c;服务端就会发会一个OK的状态码&#xff0c;接受客户端发送其他的请求命令&#xf…

基于Dubbo框架构建分布式服务(三)

我们将上面开发的服务提供方服务&#xff0c;部署到2个独立的节点上&#xff08;192.168.14.1和10.10.4.125&#xff09;&#xff0c;然后可以通过Dubbo管理中心查看对应服务的状况&#xff0c;如图所示&#xff1a; 上图中可以看出&#xff0c;该服务有两个独立的节点可以提供…

开篇-开启全新的.NET现代应用开发体验

01云原生技术底座畅想DaprMASA Framework研发管理研发协作平台&#xff1a;CI/CD、Application ManagementApplication Quota Management、Version Control、Troubleshooting、Testable网格应用程序管理API网关&#xff1a;Reverse Proxy、Traffic Control 、Security Strategy…

Ubuntu安装docker详细教程

1.安装 sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && sudo add-apt-repository &qu…

java多线程编程——锁优化

并发环境下进行编程时&#xff0c;需要使用锁机制来同步多线程间的操作&#xff0c;保证共享资源的互斥访问。加锁会带来性能上的损坏&#xff0c;似乎是众所周知的事情。然而&#xff0c;加锁本身不会带来多少的性能消耗&#xff0c;性能主要是在线程的获取锁的过程。如果只有…

【QGIS入门实战精品教程】10.3:QGIS栅格DEM数据重复类方法案例汇总

QGIS栅格DEM数据重复类方法案例汇总:按表格重分类、按图层重分类。 参考阅读: 【GlobalMapper精品教程】029:栅格重分类案例详解 ArcGIS实验教程——实验四十三:ArcGIS栅格重分类(Reclass)案例详解 ArcGIS怎样获取重分类后各类所占的像元个数 文章目录 一、按表格分类二、…