使用马尔可夫模型自动生成文章

摘要:
使用马尔可夫模型自动生成文章马尔可夫链是一个随机过程,在这个过程中,我们假设前一个或前几个状态对预测下一个状态起决定性作用。我们可以将马尔可夫模型表示为一个转移矩阵,矩阵的每一行代表一个状态,每一列代表该状态转移到另外一个状态的概率。文章生成器马尔可夫模型有个很酷的应用是一种语言模型,在这个模型中,我们根据当前的一个或几个词预测下一个词是什么。如果我们用上两个词预测,则它是一个二阶马尔可夫模型。

使用马尔可夫模型自动生成文章

马尔可夫链是一个随机过程,在这个过程中,我们假设前一个或前几个状态对预测下一个状态起决定性作用。和抛硬币不同,这些事件之间不是相互独立的。通过一个例子更容易理解。

使用马尔可夫模型自动生成文章第1张

想象一下天气只能是下雨天或者晴天。也就是说,状态空间是雨天或者晴天。我们可以将马尔可夫模型表示为一个转移矩阵,矩阵的每一行代表一个状态,每一列代表该状态转移到另外一个状态的概率。

然而,通过这个状态转移示意图更容易理解。

换句话说,假如今天是晴天,那么有90%的概率明天也是晴天,有10%的概率明天是下雨天。

文章生成器

马尔可夫模型有个很酷的应用是一种语言模型,在这个模型中,我们根据当前的一个或几个词预测下一个词是什么。如果我们只是根据上一个词预测,则它是一个一阶马尔可夫模型。如果我们用上两个词预测,则它是一个二阶马尔可夫模型。

在我的实例中,我使用Henry Thoreau的小说Walden做训练。为了好做实验,我也加入了Nietszche的Thus Spoke Zarathustra,以及一些Obama的演讲。无论你训练什么样的文本,模型都会生成相似的结果,是不是很酷?

首先我们引入NLTK,它是Python中最好的NLP库。我想说,虽然我们这里做的自然语言处理很简单,但NLTK的内置函数还是帮我节省了很多代码。然后我们利用split()函数将字符串(从文本文件中获得的)转换成一个数组。

importnltk

importrandom

file=open('Text/Walden.txt','r')

walden=file.read()

walden=walden.split()

上边两个函数是代码的基本函数。我们最终要使用的NLTK中的“条件频率字典”必须以成对数组作为输入,所以短语“Hi my name is Alex”需要变为[(“Hi”, “my”), (“my, “name”), (“name”, “is”), (“is”, “Alex”)]。函数makePairs以一个数组(以词分割字符串得到)作为输入,输出符合上边格式的数组。

生成文章的方法,需要一个条件频率分布作为输入。想想看,“农场”的后边每一个词出现的次数是多少?这是一个“条件频率分布”的输出(对于所有的词,而不只是“农场”)。生成函数的其余部分是根据训练数据中观察到的分布输出文本。我通过创建一个出现在当前词后边的每一个词组成的数组实现这一点。数组中也有正确的计数,因此,接下来我只需要随机选择数组中的一个词即可,而这个过程也是服从分布的。

defmakePairs(arr):

pairs=[]

foriinrange(len(arr)):

ifi<len(arr)-1:

temp=(arr[i],arr[i+1])

pairs.append(temp)

returnpairs

defgenerate(cfd,word='the',num=50):

foriinrange(num):

arr=[]# make an array with the words shown by proper count

forjincfd[word]:

forkinrange(cfd[word][j]):

arr.append(j)

print(word,end=' ')

word=arr[int((len(arr))*random.random())]

最后三行代码,我们输出了一些很像Walden风格的文本。

pairs = makePairs(walden)

cfd = nltk.ConditionalFreqDist(pairs)

generate(cfd)

输出结果:

我建议你看一下我Github上的iPython笔记,因为我继续完成了一个方法。利用这个方法,你只需要输入一个文件名,它就能输出生成的文本。Obama的例子也非常的酷。

如果你想自己尝试一下,只需要创建一个文本文件,然后把它放在合适的目录即可。

------------------------------

本人微信公众帐号: 心禅道(xinchandao)

使用马尔可夫模型自动生成文章第2张

使用马尔可夫模型自动生成文章第3张

本人微信公众帐号:双色球预测合买(ssqyuce)

免责声明:文章转载自《使用马尔可夫模型自动生成文章》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JAVA协程 纤程 与Quasar 框架大数据 Hadoop 单机版安装下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

环形队列

环形队列 思路介绍 思路如下: front 变量: front 就指向队列的第-个元素,也就是说arr[front]就是队列的第一个元素,front的初始值= 0 rear 变量: rear 指向队列的最后一个元素的后-一个位置因为希望空出一个空间做为约定.rear的初始值=0 当队列满时,条件是(rear +1) % maxSize==front [满...

php中对象转换数组与数组转换对象实例

用stdClass转换数组为对象                                                                                  Php代码 $arr = array(); $arr['a'] = 1;...

leetcode常规算法题复盘(第七期)——区间和的个数(附带排序算法归纳)

题目原文   327. 区间和的个数   给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper。区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。 说明:最直观的算法复杂度是 O(n2) ,请在此基础上优化你的算法。 示例: 输入...

解决:Vue中给input框手动赋值,视图却不更新

1.使用数组方法splice this.arr =[{item1},{item2},{item3},{item4}] item1.a= 0 this.arr.splice(0, 1, item1) 注意: 由于 JavaScript 的限制,Vue 不能检测以下变动的数组: 1.当你利用索引直接设置一个项时,例如:arr[1] = newValue2.当...

nltk安装配置以及语料库的安装配置

一 nltk的安装   nltk的安装个人推荐使用pip安装 直接在pycharm的Termial中安装即可    其中 安装语句为 pip3 install nltk (如有python版本不同 可尝试pip install nltk)   此处我的已经安装过所以显示的是安装位置  在安装时如果很慢 可以使用其他的源路径 如 阿里云 :-i http:...

json编码格式化美化

有时候你想存储一个json到文件中,然后让别人调用或者读取或者作为临时存储,诸如此类。 但是php json_encode后数据是压缩的没有格式化,导致读起来有点费劲。 所以你可以这样(php 5.4以后)    代码如下: <?php $arr = array( 'status' => true, 'info' =&g...