基于马尔可夫链的写作机器人软件

2023-10-31

数据结构课设(二)

作业要求

设计并实现一个基于马尔可夫链的写作机器人软件。
软件通过对素材文本的学习,建立词库以及单词的马尔可夫链,然后使用所建立的单词马尔可夫链配合随机数选择,自动生成一段文字。

分析

由于不太清楚老师的具体要求,所以在网上找了个马尔可夫链的简单教程,基于的是一阶马尔可夫链,只往前看一个词,所以比较简单,就决定做这个了,虽然感觉和马尔可夫链没多大关系。

具体实现

具体原理不太懂,就不多说了,只能根据前一个字推测出下一个字,所以关联度很低,比较简单的句子效果更好,学习多的句子就不太顺了。
比如:
在这里插入图片描述
根据这个例子,来讲解一下我的程序。
首先,用了一个vector来存储每句话的第一个字,这样子我们生成句子的时候,生成的第一个字就从这个vector里面随机选取。

vector<string> Start;//开始token

然后用了一个map存储所有的字

map<string,int> T;//Token序列

接着就是这个map和一个二维的vector存储着所有的“词典”,这个Co结构体里的weight可能是整个算法和马尔可夫有一点关系的东西…

struct Co
{
    string name;//字
    int weight;//出现次数
    Co(string n)
    {
        name=n;
        weight=1;
    }
};
vector<vector<Co> > Token;//词典

最后存储的效果大概是这样子的
在这里插入图片描述
前面的是所有的字,后面的是就是类似于组词一样,在样本中出现的临近字。从这里就可以看出关联性是比较弱的,两个毫无关系的词也会组在一起,比如“好-朋,明-是”,如果是英文的应该会好一点,中文的许多单个字是不成意思的。
read函数

int Read(vector<string> &Start,map<string,int> &T,vector<vector<Co> > &Token)//训练马可夫链,得到词典
{
    ifstream fin("test2.txt");
    if(!fin)
    {
        cout<<"can't find your file"<<endl;
        return 0;
    }
    char p;
    string s;
    bool finish=1;//判断是否为开始Token
    int val=0;//计算Token序列个数
    int fir=0;
    Token.resize(1000);
    //这一步有点傻,因为不清楚有多少个字,所以用resize申请了1000的空间,这样子的做的后果是如果你字少的话会出现资源浪费,如果字多的话,内存不够程序就会报错,所以这一步可以改进。
    while(fin.get(p))
    {
        if(p=='\n'||p=='\0'||p=='\t') continue;
        if(s.size()==2) //一个汉字或符号
        {
            if(s=="("||s==")"||s=="”"||s=="“"||s=="、"||s==";") continue;//大部分符号都被抛弃了,只是为了偷懒,不要学我
            int lo=0;
            //pari<string,string>中的第一个
            int sec=0;//pari<string,string>中的第二个
            if(Charjudge(s)==0) {
                if(T.count(s)==0)//判断Token序列里有没有s,没有就加入
                {
                    lo=val;
                    T[s]=val;
                    val++;
                }
                else lo=T[s];
            }
            if(finish==1)//开始
            {

                AddStart(s,Start);
                finish=0;
                //AddToken(s,Token,lo);
            }
            else
            {
                if(Charjudge(s)==1)//结束
                {
                    finish=1;
                    //AddToken(s,Token,lo);
                }
                AddToken(s,Token,fir);
                //AddToken(s,Token,lo);
            }
            fir=lo;
            s.clear();
        }
        s+=p;
    }
    fin.close();
    return 0;
}

然后就是生成一段文字了。
在这里我规定遇到句号问号这种符号算一句话结束,生成一段100字以内的句子。

	int n=100;
    while(Charjudge(s==0)&&n--)

首先,第一个字用随机函数来选取;

	srand((unsigned)time(NULL));
    int r=rand()%(Start.size());
    string first=Start[r];

然后就可以在“词典”中一个个生成后面的字了。在这里需要注意一个循环的情况,比如“我-和-你”三者循环,“我”之后跟着“和”,“和”之后跟着“你”,“你”之后跟着“我”,这样子输出会一直在这个圈子里循环下去,一直到100字为止。
所以我用了一个map记录一个字输出次数,如果出现两次之后就更换字。
函数Max()是找下一个字最有可能的字是哪个,Rand()就是解决可能的循环情况。


    int Write(vector<string> Start,map<string,int> T,vector<vector<Co> > Token)
{
    srand((unsigned)time(NULL));
    int r=rand()%(Start.size());
    string first=Start[r];
    string sen=Max(Token,T[first]);
    map<string,int> xxx;
    cout<<first;
    xxx[first]++;
    int n=200;
    while(n>0)
    {
        cout<<sen;
        xxx[sen]++;
        if(sen==",")
        {
            int t=rand()%(Start.size());
            sen=Max(Token,T[Start[t]]);
            xxx[Start[t]]++;
            cout<<Start[t];
        }
        else if(Charjudge(sen)) break;
        else
        {
            if(xxx[sen]>0)
            sen=Rand(Token,T[sen]);
            else sen=Max(Token,T[sen]);
        }
        n--;
    }
    cout<<endl;
    return 0;
}

这是学习了三体部分内容之后生成的句子。
在这里插入图片描述

不足

这个算法不足之处挺多的,首先一开始选择中文文本就感觉有点不太对劲了。需要考虑编码问题和中文分词的问题,在这里我都没有解决,所以读的文本只能是GB格式的汉字,一个字占两个字节,并且是单个字的形式。然后里面造句的话都是根据前一个字来组词的,最后凑成一个句子,关联性基本没有。此外,由于我没有存训练好的文件,所以每次使用前都要重新训练一次。

结束

这个算法是一天写完的,写的很简陋,就是为了交作业。如果最开始选择用英文并且前缀词用两个词会比较好,这样子和马克尔夫链的算法关联也大一些,不过难度也会相应大一点,所以就这样吧,以后有时间再来改吧。终于还差最后一个课设就可以开始期末复习了。
源码上传在我的GitHub上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于马尔可夫链的写作机器人软件 的相关文章

  • deepin开启ssh远程登录

    1 安装登录服务端 sudo apt get install openssh server 2 配置端口 sudo vi etc ssh sshd config port 22 处即为修改端口的地方 默认不修改就是22端口 3 重启SSH服
  • 数据提取之jsonpath模块

    目录 一 Jsonpath简介 1 jsonpath的介绍 2 jsonpath模块的使用场景 二 Jsonpath的使用 1 jsonpath安装 2 jsonpath模块提取数据的方法 3 jsonpath语法 一 Jsonpath简介

随机推荐

  • vue中使用wow.js+animate.css实现页面滚动加载元素动画

    1 npm 安装 wow js 安装后 animate css 会自动安装 npm install wowjs save dev 或者使用yarn安装 yarn add wow js 2 在main js中引入animate css imp
  • 三秒绘画!我的AI绘画之旅——Adobe体验

    首发于微信公众号 AI执剑人 微信号 AISwordholder 欢迎大家订阅关注 你敢相信下面这幅图只用了三秒就画出来了吗 画画如此简单 这都是源于AIGC的快速发展 所谓AIGC 就是使用人工智能来生成内容 是现在人工智能中最为火热的领
  • Kafka日志结构(详解)大数据开发

    Kafka作为大数据技术生态的重要组件 尤其是实时流数据处理场景下 作为分布式生产 消费系统 得到广泛的重用 而Kafka在数据生产和消费上 日志是主要的场景 今天的大数据开发学习分享 我们就来讲讲kafka日志结构的基础 Kafka消息是
  • lib库知识全面讲解(.lib、.dll)

    一 静态链接lib库和lib导入库以及动态链接库dll的关系 lib静态库 和 导入lib库 这些词汇相信我们经常听说了吧 但是lib怎么来的 怎么使用的我们很多人还真不知道哦 我也是专门研究学习才发现的 所以在此详细讲述下 分享给大家 想
  • 华为OD机试 - 喊7的次数重排(Java)

    题目描述 喊7是一个传统的聚会游戏 N个人围成一圈 按顺时针从1到N编号 编号为1的人从1开始喊数 下一个人喊的数字为上一个人的数字加1 但是当将要喊出来的数字是7的倍数或者数字本身含有7的话 不能把这个数字直接喊出来 而是要喊 过 假定玩
  • 龙芯 buildroot 使用详解

    龙芯 buildroot 使用详解 一般文件系统都要包含很多第三方软件 如 busybox tftp apache PHP DNS qt等等 为了避免繁琐的移植工作 buildroot应运而生 通过menuconfig来配置我们需要的功能
  • 基于Golang的gRPC框架使用与开发

    一 gRPC 基础 包括 rpc gRPC Protobuf 等概念 网上已经有详细的介绍 此处不再过多说明 关于 gRPC 的介绍 可以参考官方介绍文档 以及微软官方文档介绍 通俗的来说 gRPC 是一种 rpc 的具体实现 其利用 Pr
  • 五、STL容器:STL算法总结

    5 STL算法 5 1 构成 头文件 功能
  • 从被吐槽的Amazon看,如何建设好的on call机制?

    对于每个程序员来说 进入市值万亿的Amazon工作 似乎都是一件值得骄傲的事 但只要在网络上一提起Amazon 关于它的on call 机制的吐槽就会此起彼伏 要知道在互联网公司 on call应该是非常普遍的现象 但大家为什么对Amazo
  • 职工管理系统(超详细版c++)

    一 项目概述 编写一个有添加 删除 修改 显示 排序 查找功能的职工管理系统 对一些职工的信息进行处理 保存到文本文件中 便于后续使用 二 创建项目 在本篇文章中我们使用vs2022版本编写程序 为了使我们的代码结构严谨 减少冗余 便于修改
  • 我从未结束的Java之旅(二)

    目录 大胆北漂 餐饮 团队扩张 扩张的烦恼 团队管理的探索 大胆北漂 餐饮 团队扩张 由于公司业务的扩展以及战略方向的变更 之前负责得小团队不得不扩招 由5个人得团队补充到了20人 当时我们saas服务已经很庞大了 基本涉及到餐饮相关的所有
  • Go语言之JSON解码函数Unmarshal

    直接上代码 package main import encoding json fmt 定义Actress结构体 type Actress struct Name string Birthday string BirthPlace stri
  • springboot 之 JPA

    一 说明 JPA提供了操作数据库的接口 在开发过程中继承和使用这些接口 可简化现有的持久化开发的工作 二 JPA提供的接口 1 JpaRepository JpaRepository继承自PagingAndSortingRepository
  • P1541 [NOIP2010 提高组] 乌龟棋(dp)dp5

    https www luogu com cn problem P1541 include
  • 【MySQL】表的内外连接

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 内连接 表1 inner join 表2 on 1 显
  • DBNN实验进展

    实验环境 cpu version 1 Precsion Recall f1 scorem precision of mbnn is 0 8756 recall of mbnn is 0 8670 f1 score of mbnn is 0
  • 元宇宙(四)ROBLOX

    至2019年 已有超过500万的青少年开发者使用Roblox开发3D VR等数字内容 吸引的月活跃玩家超1亿 Roblox在玩法上进一步创新升级 类型更全面 除了传统的探索建造类沙盒玩法外 Roblox还覆盖主流的角色扮演 第一人称射击 动
  • 第9届Python编程挑战赛北京赛区复赛真题剖析-2023年全国青少年信息素养大赛

    导读 超平老师计划推出 全国青少年信息素养大赛Python编程真题解析 50讲 这是超平老师解读Python编程挑战赛系列的第16讲 全国青少年信息素养大赛 原全国青少年电子信息智能创新大赛 是 世界机器人大会青少年机器人设计与信息素养大赛
  • 不同格式点云存储结构(txt、pcd、las、ply)整理以及基本的读写、可视化方法

    不同格式点云存储结构整理以及基本的读写 可视化方法 一 文本 txt 1 1 存储结构 1 2 读取 二 PCD格式 1 1 存储结构 1 2 读写 1 2 1 open3d读写 python 1 2 2 PCL读写 C 三 LAS格式 3
  • 基于马尔可夫链的写作机器人软件

    数据结构课设 二 作业要求 设计并实现一个基于马尔可夫链的写作机器人软件 软件通过对素材文本的学习 建立词库以及单词的马尔可夫链 然后使用所建立的单词马尔可夫链配合随机数选择 自动生成一段文字 分析 由于不太清楚老师的具体要求 所以在网上找