识别马尔可夫生成内容的算法?

时间:2009-07-26 19:45:14

标签: python algorithm markov

Markov链是一种(几乎是标准的)生成random gibberish的方式,它对未经训练的眼睛看起来很聪明。您将如何从人类书面文本中识别马尔可夫生成的文本。

如果您指向的资源是Python友好的,那将是非常棒的。

6 个答案:

答案 0 :(得分:8)

一种简单的方法是让一大群人为您阅读输入文本,并查看文本是否有意义。我只是半开玩笑,这是一个棘手的问题。

我认为这是一个难题,因为马尔可夫链生成的文本在词频和词的排序之间的简单关系方面将具有许多与真实人类文本相同的属性。

马尔可夫链生成的真实文本和文本之间的差异在于更高级别的语法规则和语义含义,这些规则很难以编程方式编码。另一个问题是马尔可夫链在生成文本方面已经足够好了,有时它们会在语法和语义上用正确的语句来表达。

例如,这是一个aphorism from the kantmachine

  

今天,他会相信这一点   人的意志是自由的;明天,   考虑到不可分割的链条   大自然,他会把自由视为一种自由   仅仅是幻觉,宣称自然是   所有功能于所有

虽然这个字符串是由计算机程序编写的,但很难说人类永远不会这么说。

我认为,除非你能给我们更多关于计算机和人类生成的文本的具体细节,这些细节揭示了更明显的差异,否则很难用计算机编程来解决这个问题。

答案 1 :(得分:6)

您可以使用“强力”方法,将生成的语言与比生成它的马尔可夫模型更高阶的n-gram收集的数据进行比较。

即。如果使用二阶马尔可夫模型生成语言,则最多3克将具有正确的频率,但4克可能不会。

您可以从Google的公开n-gram dataset.获得高达5克的频率。虽然这是24G 压缩 - 但您需要通过LDC的DVD发布。

编辑:添加了一些实施细节

n-gram已被计算,因此您只需要以快速搜索的方式存储计数(或频率)。正确索引的数据库,或者Lucene索引应该可以正常工作。

给定一段文本,扫描它并在数据库中查找每个5克的频率,并查看它与其他5克相比的位置,以相同的4个单词开头。

实际上,更大的障碍可能是数据集的许可条款。可能会禁止将其用于商业应用。

答案 2 :(得分:5)

我建议对Evan的答案进行推广:制作一个自己的马尔可夫模型,并用你给出的一大块(非常大)样本训练它,将剩下的样本保留为“测试数据”。现在,看看你训练过的模型对测试数据的影响程度,例如:用卡方检验表明“拟合是好的”(表明测试数据确实是由这个模型产生的)以及拟合非常差的情况(暗示模型结构中的错误 - 结束在这种情况下,具有错误结构的训练模型是一项非常糟糕的工作。)

当然,校准仍然存在许多问题,例如模型的结构 - 你是否怀疑基于Ntuples的单词和更多的简单模型,或者更复杂的具有语法状态等的模型。幸运的是,你可以通过使用大量已知的自然文本来校准事物,也可以使用各种结构的模型自行生成。

另一种方法是使用nltk来解析你给出的句子 - 即使在自然文本中也会出现少量误解(因为人类不完美,解析器也是如此) - 它可能不知道单词X可以用作动词并且只能将它分类为名词等等),但是大多数马尔可夫模型(除非它们建模的解析器碰巧使用的语法结构基本相同 - 并且您可以使用多个解析器来尝试和抵消它! - )将导致比甚至诵读困难的人更多的错误解析。再次,校准自然与合成文本,你会明白我的意思! - )

答案 3 :(得分:2)

如果您有几个大型马尔可夫生成的文本,您可以通过比较每个样本之间的单词频率来确定它们是如此。由于马尔可夫链依赖于恒定的单词概率,因此任何给定单词的比例在样本之间应大致相等。

答案 4 :(得分:2)

众包。使用Mechanical Turk并让一些人投票。甚至有一些库可以帮助你解决这个问题。例如:

这是来自O'Reilly Radar的博客文章,介绍使用Mechanical Turk完成工作的提示:

答案 5 :(得分:0)

如果编写一个程序,从任何符号序列生成马尔可夫过渡概率,然后计算马尔可夫矩阵的熵率。 (参见http://en.wikipedia.org/wiki/Entropy_rate#Entropy_rates_for_Markov_chains)这基本上是对使用马尔可夫链预测文本的容易程度的估计(更高的熵意味着更难预测)。因此,我认为马尔可夫矩阵的熵越低,文本样本越有可能被马尔可夫矩阵控制。如果您对如何编写此代码有疑问,我碰巧在python中有一个程序,它可以在我的计算机上执行此操作,因此我可以帮助您