3.1 马尔科夫链算法
在这里,我们可以将输入当成由一些互相重叠的短语构成的序列,而马尔科夫链算法把每个短语分割为两个部分:多个词组成的前缀和只包含一个词的后缀。根据原文本的统计性质,马尔科夫算法随机的选择跟在前缀后面的特定后缀以生成输出短语序列。如果我们采用三个词作为短语的长度划分,那么算法就可以工作的很好。
而算法的实现则为:
设置w1和w2为文本的前两个词
输出w1和w2
循环:
随机地选出w3,它是文本中w1w2的后缀中的一个
打印w3
把w1和w2分别换成w2和w3
重复循环
为了说明算法的实现过程,我们基于文章开头引语中的句子生成一些随机文本,这里采用两个词作为前缀
下面是一些输入的词和跟随在它们之后的词:
对于这个算法来讲,我们可以看到:
步骤一:
选择文章开头的第一个短语作为前缀,则是“Show your”。而整篇文章中存在两个“Show your”同时由于我们把后缀词数目限定为一个,则后缀分别为第一行的“flowcharts”和第二行的“tables”
步骤二:
我们 随机的选择一个后缀 和 第一个前缀中的 后一个词 组成新的前缀。例如,我们把“your flowcharts”当作第二个前缀,整篇文档中有两个“your flowcharts”。因此,”your flowcharts”的后缀是“and”和“will”;
若是我们把“your tables”当成第二个后缀,便览全文,一共有两个“your tables”,因此后缀为“and”。
步骤三:
重复步骤二,直到文章末尾。
对于这个文本,我们可能出现的一种重新生成段落就是:
Show your->flowcharts
your flowcharts->will
flowcharts will ->be
will be->obvious. (结束)
连起来就是一个新的段落:
Show your flowcharts will be obvious.
当然,生成别的段落的可能是绝对存在的,甚至有可能出现无限循环的情况(理论上)因此,我们可以采用避免多次选中的方法来避免无限循环的情况发生。
我们的程序将读入一段英语文本,并利用马尔可夫链算法,基于文本中固定长度的短语的出现频率,产生一段新文本。前缀中词的数目是个参数,上面用的是2。如果将前缀缩短,产生出来的东西将趋向于无聊词语,更加缺乏内聚力;如果加长前缀,则趋向于产生原始输入的逐字拷贝。对于英语文本而言,用两个词的前缀选择第三个是一个很好的折衷方式。看起来它既能重现输入的风味,又能加上程序的古怪润饰。
即使应用了马尔科夫链算法,数据对于我们来说也是一件麻烦事。对于解决的方法就需要数据结构了。