前言
开始
认识马尔可夫模型
马尔可夫模型是一种图,其中点是状态,边权是概率。它可以处理相对更离散的模型,其中最明显的特征就是接下来的状态与之前的状态无关。由于这些特征,它被广泛的应用在包括但不限于娱乐1,低辨析度的垃圾短信邮件生成,等中。
根据马尔可夫模型生成数据
根据马尔可夫模型生成数据可以通俗的理解成一个动态规划或者一个图上的dfs,如果根据下面的马尔可夫模型生成数据,有如下过程:
稍有点不好辨析,凑活吧
从晴天开始
有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
作者
hit-road
拜拜,下课!
回到顶部
这里指进行自然语言生成产生的胡言乱语 ↩︎