我一直在考虑用类似马尔可夫链的东西创建一个聊天机器人,但我不完全确定如何让它工作。根据我的理解,你需要从数据中创建一个表格,包含给定的词和随后出现的词。是否可以在训练机器人的同时附加任何类型的概率或计数器?这样做是个好主意吗?
问题的第二部分是关于关键词的。假设我已经可以从用户输入中识别关键词,我该如何生成一个使用该关键词的句子?我不总是想用关键词开始句子,那么我该如何播种马尔可夫链呢?
回答:
几年前我用 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"]
......
现在构造一个循环:
选择一个随机键,比如“hi my”,然后随机选择一个值,这里只有一个,所以是“name”
(保存 “hi my name”)。
现在向右移动一步,取“my name”作为下一个键并选择一个随机值…“is”
(保存 “hi my name is”)。
现在移动并取“name is” … “Al”
(保存 “hi my name is AL”)。
现在取“is Al” … “and”
(保存 “hi my name is Al and”)。
…
当你来到“and i”时,你将随机选择一个值,比如“can”,然后生成单词“i can”等等……当你到达停止条件或没有值时,打印构造的字符串,在我们的例子中是:
“hi my name is Al and i can live in there as long as i want”
如果你有更多值,你可以跳转到任何键。值越多,你拥有的组合就越多,文本就越随机和有趣。