几年前,我用 Python 为 IRC 制作了一个马尔可夫链聊天机器人,可以透露一些我是如何做到的。生成的文本不一定有意义,但读起来确实很有趣。让我们分步骤分解它。假设你有一个固定的输入,一个文本文件,(你可以使用聊天文本或歌词的输入,或者只是发挥你的想象力)
循环文本并制作一个字典,意思是键-值容器。并将所有单词对作为键,将后面的单词作为值。
例如:如果你有一个文本“a b c a b k”,则以“a b”作为键,“c”作为值,然后“b c”和“a”作为值......该值应该是一个列表或任何包含 0 的集合..许多“项目”,因为给定的一对单词可以有多个值。在上面的示例中,您将出现两次“a b”,然后是“c”,最后是“k”。所以最后你将得到一个如下所示的字典/哈希:{'a b': ['c','k'], 'b c': ['a'], 'c a': ['b']}
现在您已经拥有了构建时髦文本所需的结构。您可以选择从随机密钥或固定位置开始!因此,给定我们拥有的结构,我们可以首先保存“a b”,然后从值 c 或 k 中随机取出后续单词,因此循环中的第一个保存是“a b k”(如果“k”是选择的随机值)然后你继续向右移动一步,在我们的例子中是“b k”,并为该对保存一个随机值(如果你有,在我们的例子中没有),这样你就可以跳出循环(或者你可以决定其他东西,比如从头再来)。循环完成后,您将打印保存的文本字符串。
输入越大,您的键(单词对)的值就越多,然后就会有一个“更智能的机器人”,这样您就可以通过添加更多文本(也许是聊天输入?)来“训练”您的机器人。如果你有一本书作为输入,你可以构造一些漂亮的随机句子。请注意,您不必仅采用一对后面的一个单词作为值,您可以采用 2 个或 10 个单词。不同之处在于,如果您使用“更长”的构建块,您的文本会显得更准确。以一对作为键,后面的单词作为值开始。
所以你会发现你基本上可以有两个步骤,首先创建一个结构,你随机选择一个键开始,然后获取该键并打印该键的随机值,然后继续,直到没有值或其他条件为止。如果您愿意,您可以从键值结构的聊天输入中“播种”一对单词来开始。如何开始你的连锁店取决于你的想象力。
用真实的单词举例:
"hi my name is Al and i live in a box that i like very much and i can live in there as long as i want"
"hi my" -> ["name"]
"my name" -> ["is"]
"name is" -> ["Al"]
"is Al" -> ["and"]
........
"and i" -> ["live", "can"]
........
"i can" -> ["live"]
......
现在构造一个循环:
选择一个随机键,说“嗨,我的”并随机选择一个值,这里只有一个,所以它是“名称”(保存“嗨,我的名字”).
现在向右移动一步,将“我的名字”作为下一个键,然后选择一个随机值...“是”(保存“嗨,我的名字是”).
现在移动并取“名字是”...“Al”(保存“嗨,我的名字是 AL”).
现在采取“是阿尔”...“和”(保存“嗨,我的名字是阿尔和”).
...
当你来到“and i”时,你会随机选择一个值,比如说“can”,然后“i can”这个词就会出现,等等......当你达到停止条件或者你没有值时,打印构造的值在我们的例子中是字符串:
“嗨,我叫阿尔,我想住多久都可以”
如果您有更多值,您可以跳转到任何键。值越多,您拥有的组合就越多,文本就越随机、越有趣。