【LittleXi】 N-gram模型(C++实现)

LittleXi

  • N-gram模型(C++实现)
    • 马尔科夫性 (独立性假设)
    • 代码实现
      • 英文训练版本
      • 中文训练版本
    • 训练效果

N-gram模型(C++实现)

定义:通俗地讲,就是利用前文的单词,来推算下一个最大概率出现的单词

马尔科夫性 (独立性假设)

但是前文或许有很多单词,这样编程很复杂,不妨讲比较远的单词抛弃掉,仅取最近的2or3个单词作为“提示词”,即一个单词的概率只取决于前面固定数量的单词。

本文采用的取的两个单词,建立的二元bigram模型,代码实现也非常简单~

代码实现

英文训练版本

#include<iostream>
#include<vector> 
#include<map>
#include<string>
#include<algorithm>
#include<fstream>
#pragma warning(disable:4996)
using namespace std;

map<pair<string, string>, map<string, int>> mp;
map<pair<string, string>, string> store_keyval;

void train()
{
	string s4;
	int cnt=0;
	string s1, s2, s3;
	ifstream inFile;
	inFile.open("train.txt");
	inFile >> s1 >> s2 >> s3;
	while (1)
	{
		inFile >> s4;			
		if (s4 == "my_over")
		{
			break;
		}
		s1 = s2;
		s2 = s3;
		s3 = s4;
		mp[{s1, s2}][s3]++;
	}
	inFile.close();
	for (auto& sssi : mp)
	{
		string s1 = sssi.first.first, s2 = sssi.first.second;
		vector<pair<string, int>> tv;
		for (auto& si : sssi.second)
			tv.push_back({ si });

		//对出现概率进行排序
		sort(tv.begin(), tv.end(), [&](pair<string, int>& p1, pair<string, int>& p2){
			return p1.second > p2.second;
			});
		
		store_keyval[{s1, s2}] = tv[0].first;
	}
}

void test()
{
	int len = 0;
	cout << "请输入续写的长度:" << endl;
	cin >> len;
	cout << "请输入想要续写的内容" << endl;
	string s1, s2;
	cin >> s1 >> s2;
	for (int i = 0; i < len; i++)
	{
		string s3;
		if (store_keyval.find({s1, s2}) == store_keyval.end())
			s3 = "and";
		else
			s3 = store_keyval[ { s1, s2 }];
		cout << s3 << " ";
		s1 = s2;
		s2 = s3;
	}
	cout << endl;
}

int main()
{
	train();
	int test_time = 0;
	cout << "请输入需要询问的次数" << endl;
	cin >> test_time;
	while (test_time--)
	{
		test();
	}
}

中文训练版本

#include<iostream>
#include<vector> 
#include<map>
#include<string>
#include<algorithm>
#include<fstream>
#pragma warning(disable:4996)
using namespace std;


map<pair<string, string>, map<string, int>> mp;
map<pair<string, string>, string> store_keyval;

void train()
{
	string s4;
	int cnt=0;
	ifstream inFile;
	inFile.open("zh-train.txt");
	//inFile >> s1 >> s2 >> s3;
	//wstring s;
	while (1)
	{
		cnt++;
		inFile >> s4;			
		//cout << s4 << endl;
		if (s4 == "my_over")
		{
			break;
		}
		if (cnt % 100000==0)
			cout << cnt << endl;
		string s1, s2, s3;
		if (s4.size() <= 6)
			continue;
		s1 = s4.substr(0, 2);
		s2 = s4.substr(2, 2);
		s3 = s4.substr(4, 2);
		//cout << s1<<s2<<s3 << endl;
		for (int i = 6; i < s4.size(); i+=2)
		{
			s4 = s4.substr(i, 2);
			s1 = s2;
			s2 = s3;
			s3 = s4;
			mp[{s1, s2}][s3]++;
		}
	}
	inFile.close();
	for (auto& sssi : mp)
	{
		string s1 = sssi.first.first, s2 = sssi.first.second;
		vector<pair<string, int>> tv;
		for (auto& si : sssi.second)
			tv.push_back({ si });

		//对出现概率进行排序
		sort(tv.begin(), tv.end(), [&](pair<string, int>& p1, pair<string, int>& p2){
			return p1.second > p2.second;
			});
		
		store_keyval[{s1, s2}] = tv[0].first;
	}
}

vector<string> dic = { "的","一","了","是","我","不","在","人","们","有" };

void test()
{
	srand((unsigned)time(NULL));
	int len = 300;
	//cout << "请输入续写的长度:" << endl;
	//cin >> len;
	cout << "请输入想要续写的内容" << endl;
	string s;
	cin >> s;
	//cout << s.size() << endl;
	string s1, s2;
	s1=s.substr(s.size() - 4, 2);
	s2 = s.substr(s.size() - 2, 2);
	for (int i = 0; i < len; i++)
	{
		string s3;
		if (store_keyval.find({ s1, s2 }) == store_keyval.end())
		{
			int p = rand()%10;
			s3 = dic[p];
		}
		else
			s3 = store_keyval[ { s1, s2 }];
		cout << s3 << " ";
		s1 = s2;
		s2 = s3;
	}
	cout << endl;
}

int main()
{
	train();
	int test_time = 0;
	cout << "请输入需要询问的次数" << endl;
	cin >> test_time;
	while (test_time--)
	{
		test();
	}
}

训练效果

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot超市进销存系统

本次设计任务是要设计一个超市进销存系统&#xff0c;通过这个系统能够满足超市进销存系统的管理及员工的超市进销存管理功能。系统的主要功能包括&#xff1a;首页、个人中心、员工管理、客户管理、供应商管理、承运商管理、仓库信息管理、商品类别管理、 商品信息管理、采购信…

Elasticsearch 8.8.1安装及启动

华为云的镜像去下载 ElasticSearch: https://mirrors.huaweicloud.com/elasticsearch/?CN&OD logstash: https://mirrors.huaweicloud.com/logstash/?CN&OD kibana: https://mirrors.huaweicloud.com/kibana/?CN&OD 原文链接&#xff1a;https://blog.csdn.ne…

2022前端趋势报告(下)

前端博主&#xff0c;热衷各种前端向的骚操作&#xff0c;经常想到哪就写到哪&#xff0c;如果有感兴趣的技术和前端效果可以留言&#xff5e;博主看到后会去代替大家踩坑的&#xff5e; 主页: oliver尹的主页 格言: 跌倒了爬起来就好&#xff5e; 一、前言 本文内容来自于《St…

RocketMQ5.0消息消费<二> _ 消息队列负载均衡机制

RocketMQ5.0消息消费&#xff1c;二&#xff1e; _ 消息队列负载均衡机制 一、消费队列负载均衡概览 RocketMQ默认一个主题下有4个消费队列&#xff0c;集群模式下同一消费组内要求每个消费队列在同一时刻只能被一个消费者消费。那么集群模式下多个消费者是如何负载主题的多个…

阿里云绑定域名

在阿里云安全组与宝塔安全放开8081端口 server {listen 8081;server_name www.whxyyds.top;charset utf-8;location / {root /home/ruoyi/projects/ruoyi-ui;try_files $uri $uri/ /index.html;index index.html index.htm;}location /prod-api/ {proxy_set_header …

为生信写的Python简明教程 | 视频10

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在&#xff1a;https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

第N4周:使用Word2vec实现文本分类

目录 二、数据预处理1.加载数据2.构建词典3.生成数据批次和迭代器 二、模型构建1.搭建模型2.初始化模型3.定义训练与评估函数 三、训练模型1.拆分数据集并运行模型2.测试指定数据 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&…

Spring Boot 系列2 -- 配置文件

目录 1. 配置文件的作用 2. 配置文件的格式 3. properties 配置文件说明 3.1 properties 基本语法 3.2 读取配置文件 3.3 properties 缺点 4.yml 配置文件说明 4.1 yml 基本语法 4.2 yml 使用进阶 4.2.1 yml 配置不同数据类型及 null 4.2.2 yml 配置读取 4.2.3 注意…

DPWWN1靶场详解

DPWWN1靶场详解 首先还是nmap -sP 192.168.102.0/24扫描到ip地址&#xff0c;然后对这个ip进行一个单独的扫描&#xff0c;发现这个靶场有一个mysql数据库&#xff0c;猜测可能会用到sql注入&#xff0c;但是没用到。 ip登陆到网页发现并没有什么可利用的 唯一的切入点也就数…

Java 动态规划 Leetcode 62. 不同路径

代码展示&#xff1a; class Solution {public int uniquePaths(int m, int n) {//定义dp数组//二维数组多增加一行一列&#xff0c;方便对数组进行初始化int[][]dpnew int[m1][n1];//初始化dp[0][1]1;//填充数组for(int i1;i<m;i){for(int j1;j<n;j){dp[i][j]dp[i-1][j…

基于springboot+Redis的前后端分离项目(七)-【黑马点评】

&#x1f381;&#x1f381;资源文件分享 链接&#xff1a;https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwdeh11 提取码&#xff1a;eh11 发布笔记&#xff0c;点赞&#xff0c;点赞排行 达人探店1、达人探店-发布探店笔记2、 达人探店-查看探店笔记3、 达人探店-点赞功…

《网络安全标准实践指南》(72页)

导读 摘要&#xff1a;为指导网络数据安全风险评估工作&#xff0c;发现数据安全隐患&#xff0c;防范数据安全风险&#xff0c;依据《中华人民共和国网络安全法》《中华人民共和国数据安全法》《中华人民共和国个人信息保护法》等法律法规&#xff0c;参照数据安全相关国家标…

STM32寄存器点亮LED灯

一&#xff1a; 如何寄存器点灯 1&#xff1a;看单片机的原理图 找到LED灯 这个灯是 PB5引脚 看原理图可以看出 让GPIOB5输出低电平 就能点亮那么我们得让打开控制GPIOB5的时钟让GPIOB5 输出模式让GPIOB5低电平 二&#xff1a;看中文参考手册配置寄存器 2.1&#xff1a;打开管…

【Windows】Redis集群部署

集群是如何进行工作的 Redis采用哈希槽来处理数据与节点之间的映射关系&#xff0c;一个集群共有16384 个哈希槽&#xff0c;每个key通过 CRC16算法计算出一个16bit的值&#xff0c;再对16384取模&#xff0c;得到对应的哈希槽&#xff0c;集群通过维护哈希槽与节点的关系来得…

redis与分布式

主从复制 概念 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(Master)&#xff0c;后者称为从节点(Slave)&#xff0c;数据的复制是单向的&#xff0c;只能由主节点到从节点。Master以写为主&#xff0c;Slave 以读为…

MySQL----MHA高可用

文章目录 一、MHA理论1.1什么是 MHA1.2MHA 的组成1.3MHA 的特点 二、MHA的一主两从部署实验设计故障修复步骤&#xff1a; 一、MHA理论 1.1什么是 MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出…

【Django】Django框架使用指南

Django使用指南 作者简介&#xff1a;嗨~博主目前是长安大学软件工程专硕在读&#x1f4d8;&#xff0c;喜欢钻研一些自己感兴趣的计算机技术&#xff0c;求关注&#x1f609;&#xff01; 框架简介&#xff1a;Django是一个基于Python语言的开源Web应用框架&#xff0c;采用 M…

基于STM32FFT(快速傅里叶变换)音频频谱显示功能实现

+ v hezkz17进数字音频系统研究开发交流答疑 一实验效果 二 设计过程 要用C语言实现STM32频谱显示功能,可以按照以下步骤进行操作: 1 确保已经安装好了适当的开发环境和工具链,例如Keil MDK或者GCC工具链。 2 创建一个新的STM32项目,并选择适合的MCU型号。 3 配置G…

【数据挖掘】时间序列教程【九】

第5章 状态空间模型和卡尔曼滤波 状态空间模型通常试图描述具有两个特征的现象 有一个底层系统具有时变的动态关系,因此系统在时间上的“状态”t 与系统在时间的状态t−1有关 .如果我们知道系统在时间上的状态t−1 ,那么我们就有了我们需要知道的一切,以便对当时的状态进行推…

Android Zygote 启动流程

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: Android系统包含netd、servicemanager、surfaceflinger、zygote、media、installd、bootanimation 等基本服务&#xff0c;具体作用请看下图。 Android…