马尔可夫模型

前言

开始

认识马尔可夫模型

马尔可夫模型是一种图,其中点是状态,边权是概率。它可以处理相对更离散的模型,其中最明显的特征就是接下来的状态与之前的状态无关。由于这些特征,它被广泛的应用在包括但不限于娱乐1,低辨析度的垃圾短信邮件生成,等中。

50%
30%
10%
35%
15%
40%
30%
45%
45%
晴天
雨天
阴天

根据马尔可夫模型生成数据

根据马尔可夫模型生成数据可以通俗的理解成一个动态规划或者一个图上的dfs,如果根据下面的马尔可夫模型生成数据,有如下过程:

50%
30%
10%
35%
15%
40%
30%
45%
45%
晴天
雨天
阴天

稍有点不好辨析,凑活吧

从晴天开始
有50%概率还是晴天,15%概率雨天,35%阴天
第二天还是晴天
有50%概率还是晴天,15%概率雨天,35%阴天
第三天是阴天
有10%概率还是阴天,45%概率雨天,45%晴天
第四天是雨天
有30%概率还是雨天,30%晴天,40%阴天
第五天是晴天
有50%概率还是晴天,15%概率雨天,35%阴天
第六天是雨天
有30%概率还是雨天,30%晴天,40%阴天
第七天是阴天
……
见伪代码

获取数据并存储在data中
获取需要生成数据长度并存储在len中
获取需要生成数据的初始状态并存储在s中
建立空的列表res
建立函数Marcov,参数len,S:
	如果len为1:
		返回从data的第S项中按照概率选取的值
	否则
		从data的第S项中按照概率选取值并存储在s中
		返回将s和用len - 1,s作为参数调用Marcov的结果拼接成的字符串
输出以len和s作为参数调用Marcov的结果

见python代码

import random
data = eval(input())
len = int(input())
s = input()
def rand(dataset):
	ls = []
	for v,n in dataset.items():
		ls += [v] * n
	return random.choice(ls)
def rchoice(dt):
	keys = list(dt.keys())
	return random.choice(keys)
def Marcov(len,S,data):
	if(S not in data):
		return S + Marcov(len - 1,rchoice(data),data)
	elif(len == 1):
		return rand(data[S])
	else:
		s = rand(data[S])
		return s + Marcov(len - 1,s,data)
print(Marcov(len,s,data))

生成马尔可夫模型

这里就不做演示了
见伪代码

获取数据并存储在data中
建立空的列表dt
从第2个元素开始遍历data并将当前索引存储在i中:
	建立空的列表it
	在it尾部添加data的第i - 1项
	在it尾部添加data的第i项
	在dt尾部添加it
建立空的映射m
遍历dt并将当前项存储在i,j中:
	如果i在m中出现过:
		m的第i项的第j项增加1
	否则:
		在m中建立第i项和第i项的第j项并赋值为1
输出m

见python代码

d = input()
data = d.split(',')
def gen(data):
	dt = []
	for i in range(1,len(data)):
		it = [data[i - 1],data[i]]
		dt.append(it)
	m = {}
	for i,j in dt:
		if(i not in m):
			m[i] = {}
			m[i][j] = 1
		elif(j not in m[i]):
			m[i][j] = 1
		else:
			m[i][j] += 1
	return m
print(gen(data))

小栗子

自然语言生成器
其实超级"简单"兴奋到飞起

import random
listlen = len
def rand(dataset):
	ls = []
	for v,n in dataset.items():
		ls += [v] * n
	return random.choice(ls)
def rchoice(dt):
	keys = list(dt.keys())
	return random.choice(keys)
def Marcov(len,S,data):
	if(S not in data):
		return S + Marcov(len - 1,rchoice(data),data)
	elif(len == 1):
		return rand(data[S])
	else:
		s = rand(data[S])
		return s + Marcov(len - 1,s,data)
def gen(data):
	dt = []
	for i in range(1,listlen(data)):
		it = [data[i - 1],data[i]]
		dt.append(it)
	m = {}
	for i,j in dt:
		if(i not in m):
			m[i] = {}
			m[i][j] = 1
		elif(j not in m[i]):
			m[i][j] = 1
		else:
			m[i][j] += 1
	return m
def dict_comb(d1,d2):
	res = dict(d1)
	for k,v in d2.items():
		if(k in res):
			res[k] += d2[k]
		else:
			res[k] = d2[k]
	return res
fnamer = input()
fnamew = input()
splitter = input()
len = int(input())
s = input()
print('generating marcov model')
marcov = {}
with open(fnamer,'r') as f:
	line = f.readline()[:-1]
	if(splitter):
		line = line.split(splitter)
	else:
		line = list(line)
	m = gen(line)
	marcov = dict_comb(marcov,m)
print('marcov model all set')
print('start generaing unreadable rubbish text')
with open(fnamew,'w') as f:
	marc = Marcov(len,s,marcov)
	f.write(splitter.join([str(i) for i in marc]))
print('unreadable rubbish text generated')

输入语料文件路径,生成文件路径,语料文件中使用的分隔符,生成的长度和初始字符。

小栗子代码精讲

import random
listlen = len
def rand(dataset):
	ls = []
	for v,n in dataset.items():
		ls += [v] * n
	return random.choice(ls)
def rchoice(dt):
	keys = list(dt.keys())
	return random.choice(keys)

导入库,复制len函数,定义按照概率生成随机数的函数和从字典中随机挑选的函数

def rand(dataset):
	ls = []
	for v,n in dataset.items():
		ls += [v] * n
	return random.choice(ls)

这部分是按照语料中的"a跟在b后面"的情况及出现次数,随机挑选一种情况的函数。
将字典中的情况及出现次数展开成一个列表(例如{1:2,2:3}展开成[1,1,2,2,2])
然后用random.choice随机选出一个

def Marcov(len,S,data):
	if(S not in data):
		return S + Marcov(len - 1,rchoice(data),data)
	elif(len == 1):
		return rand(data[S])
	else:
		s = rand(data[S])
		return s + Marcov(len - 1,s,data)
def gen(data):
	dt = []
	for i in range(1,listlen(data)):
		it = [data[i - 1],data[i]]
		dt.append(it)
	m = {}
	for i,j in dt:
		if(i not in m):
			m[i] = {}
			m[i][j] = 1
		elif(j not in m[i]):
			m[i][j] = 1
		else:
			m[i][j] += 1
	return m

这部分见根据马尔可夫模型生成数据生成马尔可夫模型,有伪代码做解释

def dict_comb(d1,d2):
	res = dict(d1)
	for k,v in d2.items():
		if(k in res):
			res[k] += d2[k]
		else:
			res[k] = d2[k]
	return res

将两个dict合并。

fnamer = input()
fnamew = input()
splitter = input()
len = int(input())
s = input()
print('generating marcov model')

输入数据并输出提示语

marcov = {}
with open(fnamer,'r') as f:
	line = f.readline()[:-1]
	if(splitter):
		line = line.split(splitter)
	else:
		line = list(line)
	m = gen(line)
	marcov = dict_comb(marcov,m)
print('marcov model all set')
print('start generaing unreadable rubbish text')

对语料的每一行建立马尔可夫模型,并与大模型marcov合并,并输出提示语

with open(fnamew,'w') as f:
	marc = Marcov(len,s,marcov)
	f.write(splitter.join([str(i) for i in marc]))
print('unreadable rubbish text generated')

生成并存储狗屁不通文章,输出提示语

小栗子github

github传送门

作者

hit-road

拜拜,下课!
回到顶部



  1. 这里指进行自然语言生成产生的胡言乱语 ↩︎

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值