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

agi*_*liq 11 python algorithm markov

马尔可夫链是一种(几乎标准的)产生随机乱码的方式,对于未经训练的眼睛看起来很聪明.您将如何从人类书面文本中识别马尔可夫生成的文本.

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

Jam*_*son 8

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

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

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

举个例子,这是来自kantmachine格言:

今天,他会相信人类的意志是自由的; 明天,考虑到不可分割的自然链,他将自由视为一种幻想,并宣称自然是全部的.

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

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

  • 事实上,这非常令人不安.我读过"纯粹理性的批判"(康德唯一的作品,我实际上可以让自己阅读/理解),而且,我绝对不会说,格言是由机器生成的. (5认同)

puf*_*ish 6

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

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

您可以从Google的公共n-gram数据集中获得高达5克的频率.它是巨大的 - 24G 压缩 - 你需要通过LDC的 DVD发布它.

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

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

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

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


Ale*_*lli 5

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

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

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