关于使用马尔可夫链算法生成文本

时间:2013-05-06 02:13:31

标签: algorithm markov-chains

我正在阅读Brian W. Kernighan和Rob Pike撰写的“编程实践”一书。第3章提供了马尔可夫链方法的算法,该方法读取源文本并使用它来生成“读得好”的随机文本(意味着输出更接近于正确的英语而不是乱码):

set w1 and w2 to the first two words in the source text
print w1 and w2
loop:
   randomly choose w3, one of the successors of prefix w1 and w2 in the source text
   print w3
   replace w1 and w2 by w2 and w3
   repeat loop

我的问题是:处理w2和w3的新值在源文本中没有后继的情况的标准方法是什么?

非常感谢提前!

3 个答案:

答案 0 :(得分:1)

这是您的选择:

  1. 随机选择一个单词? (一直有效)
  2. 随机选择新的W2? (可以想象仍然循环)
  3. 备份到之前的W1和W2? (可以想象仍然循环)
  4. 我可能会尝试一次#2或#3,然后再回到#1 - 这将始终有效。

答案 1 :(得分:1)

您描述的情况考虑3-grams,即给定数据集中3元组的统计频率。要创建一个没有adsorbing states的马尔可夫矩阵,这不是f_2(w1,w2) -> w3f_2(w2,w3) = 0的点,您必须扩展可能性。 @ ThomasW答案的一般扩展是:

  1. 如果设置的预测变量f_2(w1,w2) != 0
  2. 中抽取
  3. 如果设置的预测变量f_1(w2) != 0
  4. 中抽取
  5. 如果设置的预测变量f_0() != 0
  6. 中抽取

    也就是说,正常情况下从3克组中抽取,而不是2克组,而不是1克组。在最后一步,你只需按照统计频率随机抽取一个单词。

答案 2 :(得分:0)

我认为这是NLP中的一个严重问题,没有一个简单的解决方案。一种方法是除了实际的单词之外还标记词性,以便概括映射。使用词性,如果单词序列没有先例,则程序至少可以预测单词W2和W3应该跟随哪个词性。 “一旦对训练样例进行了这种映射,我们就可以在这些训练样例上训练一个标记模型。给定一个新的测试句子,我们就可以从模型中恢复标记序列,并且可以直接识别由模型。”来自哥伦比亚notes