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

11 投票
6 回答
1528 浏览
提问于 2025-04-15 13:10

马尔可夫链是一种(几乎是标准的)方法,用来生成看起来很聪明的随机胡言乱语,但其实是没有意义的,普通人一眼看上去可能觉得很有道理。你会怎么去识别马尔可夫生成的文本和人类写的文本呢?

如果你能推荐一些对Python友好的资源,那就太好了。

6 个回答

5

我建议对Evan的回答进行一些扩展:自己做一个马尔可夫模型,并用你手头的一大堆样本来训练它,同时把剩下的样本留作“测试数据”。然后,看看你训练出来的模型在测试数据上的表现如何,比如用卡方检验来判断模型的拟合情况。如果模型的拟合效果“太好”,这可能意味着测试数据确实是由这个模型生成的;而如果拟合效果很差,那就说明模型的结构可能有问题——一个结构不对的过拟合模型在这种情况下表现得非常糟糕。

当然,在调整模型时还有很多问题需要考虑,比如模型的结构——你是怀疑只用简单的词组组合,还是需要一个更复杂的模型,比如带有语法状态的模型。幸运的是,你可以通过使用一些已知自然文本的大型语料库,以及自己用不同结构的模型生成的文本,来很好地调整这些参数。

另一种方法是使用nltk来解析你得到的句子——即使是自然文本,也会有少量解析错误(因为人类不完美,解析器也不完美——它可能不知道某个词X可以作为动词使用,只把它当作名词来分类,等等),但大多数马尔可夫模型(除非它们的模型结构和你的解析器恰好一致——你可以使用多个解析器来对抗这个问题!)会导致比即使是有阅读障碍的人类还要多得多的解析错误。同样,使用自然文本和合成文本进行调整,你就会明白我想表达的意思!

8

一种简单的方法是让一大群人来阅读输入的文本,看看这些文本是否有意义。我说这话有点开玩笑,但这确实是个棘手的问题。

我认为这是个难题,因为通过马尔可夫链生成的文本在单词频率和单词顺序的简单关系上,会和真实人类的文本有很多相似之处。

真实文本和马尔可夫链生成的文本之间的区别在于更高级的语法规则和语义意义,这些是很难用程序来编码的。另一个问题是,马尔可夫链生成的文本足够好,有时会产生语法和语义上都正确的句子。

举个例子,这里有一句来自kantmachine的名言

今天,他会坚信人类的意志是自由的;明天,考虑到自然的不可分割链条,他会把自由视为一种幻觉,并宣称自然是一切。

虽然这句话是由计算机程序写的,但很难说人类绝对不会说出这样的话。

我认为,除非你能提供更多关于计算机生成文本和人类生成文本的具体细节,以揭示更明显的区别,否则用计算机编程来解决这个问题会很困难。

6

你可以用一种“暴力破解”的方法,比较生成的语言和收集到的高阶n-gram数据,这些数据比生成它的马尔可夫模型要高级。

也就是说,如果这个语言是用二阶马尔可夫模型生成的,那么3-gram的频率是正确的,但4-gram的频率可能就不对了。

你可以从谷歌的公共n-gram数据集中获取到5-gram的频率。不过这个数据集非常大——压缩后有24G,你需要通过邮寄的方式从LDC获取DVD。

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

这些n-gram的计数已经做好了,所以你只需要以一种快速查找的方式存储这些计数(或频率)。一个合适的索引数据库,或者使用Lucene索引应该都可以。

给定一段文本,扫描它并在你的数据库中查找每个5-gram的频率,看看它和其他以相同4个词开头的5-gram相比排名如何。

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

撰写回答