如何让马尔可夫链聊天机器人工作?

我一直在考虑用类似马尔可夫链的东西创建一个聊天机器人,但我不完全确定如何让它工作。根据我的理解,你需要从数据中创建一个表格,包含给定的词和随后出现的词。是否可以在训练机器人的同时附加任何类型的概率或计数器?这样做是个好主意吗?

问题的第二部分是关于关键词的。假设我已经可以从用户输入中识别关键词,我该如何生成一个使用该关键词的句子?我不总是想用关键词开始句子,那么我该如何播种马尔可夫链呢?


回答:

几年前我用 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”

如果你有更多值,你可以跳转到任何键。值越多,你拥有的组合就越多,文本就越随机和有趣。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注