基于 Web 的数据库驱动的聊天机器人项目 — 模块 1:近似字符串匹配

一个跨越网络编程、数学、人工智能等的项目。 ——我一直对聊天机器人很着迷,从我十几岁开始,我在学习编程的同时创造了几十个。然而,我从来没有让我的聊天机器人实现任何目标,所以我唯一的动力是好奇心,我的机器人仅限于从事非常有限的闲聊……

基于 Web 的数据库驱动的聊天机器人项目 — 模块 1:近似字符串匹配

一个跨越网络编程、数学、人工智能等的项目。

我一直对聊天机器人很着迷,从十几岁开始,我在学习编程的同时创造了数十个。然而,我从来没有让我的聊天机器人实现任何目标,所以我唯一的动力是好奇心,我的机器人仅限于进行非常有限的闲聊。当然,我会很快放弃每个项目。

但现在,由于我的主要工作、副业和爱好在网上有一个专业的存在,我有机会创建一个聊天机器人,其目的是:回答我网站访问者的问题并指导他们完成它。 JavaScript 编程的强大功能让我可以很轻松地做到这一点。此外,我可以为我的聊天机器人提供两种回复机制:一种基于由近似字符串匹配函数辅助的大型问答对数据集;另一个基于 GPT-3 的问题相关微调。在本文中,我将讨论第一个轨道,它利用问答对和停用词的开放数据集,以及量化一对字符串的相似性的程序。 GPT-3 轨道将在以后的文章中出现,它对于摆脱封闭式问答数据库的限制非常重要,敬请期待!

Introduction

正如你在上面的总结中看到的,我一直对聊天机器人很感兴趣。事实证明,我现在刚刚构建(实际上我每天都在不断扩展)一个完整的聊天机器人,所有基于网络的,弹出在我网站的不同页面中,引导访问者并回答他们的问题。我将此聊天机器人编写为 HTML/JS 组件,因此我可以轻松地将其合并到任何页面中,只需一个脚本标签。通过使用浏览器的 localStorage 功能,我的聊天机器人可以在用户打开我网站的多个页面时保持流畅的对话,即使在不同的选项卡或窗口中也是如此。通过使用 CSS,聊天机器人可以轻松适应智能手机或电脑屏幕。我让机器人将对话写入我网站上的一个文件,然后我可以检查该文件以了解访问者通常会问什么以及他们通常与核心知识数据库有什么偏差,这样我就可以相应地改进聊天机器人。

但我将在以后的文章中讨论设计和功能。在这里我想描述它的主要模块的第一个轨道,该模块允许机器人直接回答我的访问者的问题,并且还可以从通过近似字符串匹配解析的数据库中提取一些基本的闲聊。在即将发表的文章中,我将描述聊天机器人的第二条轨道,它通过将知识库与 GPT-3 的文本生成相结合,极大地扩展了它的功能。

回答来自知识库的问题,容忍错别字和可变措辞——感谢字符串比较算法

有很多方法可以对聊天机器人进行分类,但一个非常重要的区别是它们是仅提供从数据库中直接获取的答案,还是实际上可以编造文本作为对问题的合理答复。从编程的角度来看,后者更具挑战性,需要某种形式的高端自然语言处理协议来将问题转换为合理的答案。这种基于人工智能的方法的主要优点是,如果做得好,它是非常通用的,并且可以为以多种不同方式提出的问题提供正确的答案;此外,它本身就可以容忍拼写错误和语法错误。但是构建这样的人工智能程序并不容易;最重要的是,您总是冒着机器人可能会编造包含不正确信息甚至不适当内容、敏感信息或只是不可读文本的文本的风险。 GPT-3 等高端自然语言处理程序可能是一个很好的解决方案,但即使是这些程序也可能使文本出现错误或不适当的内容。

我很快就会变成我的聊天机器人的 GPT-3 模块,而在这里我将开发通过问题/答案匹配工作的模块。如果您非常好奇并且迫不及待地想看到我描述机器人 GPT-3 模块的文章,让我在这里与您分享一些我写的关于 GPT-3 的文章,您会发现一些负面和正面的观点以及相当多的一些代码和说明,供您使用此技术进行自己的测试:

请确保我很快就会回到 GPT-3,因为它为我网站聊天机器人大脑的第二条轨道提供动力。

我网站聊天机器人的问答模块

在这里,您有一个我的聊天机器人的屏幕截图,它使用它的问题/答案匹配轨道与碰巧问笑话的人类用户聊天:

让我们看看这个问题/答案匹配模块是如何工作的,它可以替代复杂的 AI 模型并且更安全,因为它只回复数据库中编码的内容。本质上,这包括“简单地”在问题和答案数据库中搜索人类的输入,然后提供相应的预编译答案。如果数据库足够大并且人类被警告机器人的代码仅限于某些主题,那么整体体验可能就足够好,至少在其预期用途范围内。

但是,有几个要点需要处理:

  • 一个“足够大”的问答对数据库并不容易获得,至少不是一个你可以确定其内容的数据库。
  • 人类可能会出现拼写错误和书写错误,因此理想情况下聊天机器人应该能够容忍它们。
  • 即使没有任何错误,人类也可以(并且很可能)以不同于数据集中编码的方式提出问题。聊天机器人也应该尝试解决这个问题。

数据库问题的解决并不容易。正如我在下面详述的那样,对于我的聊天机器人,我从微软的 GitHub 帐户中获取了一个问答对的开源(MIT 许可)数据库,并使用关于我和我从事的项目的特定内容对其进行了扩展——因为这就是聊天机器人应该回答。同时,错别字、错误和输入可变性带来的困难可以通过在数据库中搜索而不是寻找确切的问题,而是寻找与数据库中每个条目相似的问题来解决。这需要使用字符串比较指标而不是完美匹配,并且在进行搜索之前需要对人类输入进行相当多的清理。

让我们一一查看所有这些要点。

1.清理人工输入

我在我的聊天机器人中编写了一个可以清理人工输入不同方面的功能。根据参数,该函数将扩展缩写、删除符号、删除多种形式的数字或删除停用词。请注意,这意味着数据库最好不要包含任何符号、数字信息或缩写,因为它们会降低搜索时的匹配分数。例如,数据库中“website’s”的所有实例都扩展为“website is”。

清理中涉及的操作似乎微不足道,但同样受到数据库可用性的限制,例如停用词。我从一些资源中编制了一个很长的列表,你现在可以借用 – 但请承认我,就像我的代码承认我的来源一样!

这是完整的功能,包括停用词、符号等的列表:http://lucianoabriata.altervista.org/chatbotallweb/cleaningfunction.txt[0]

请注意,在调用该函数时,可以选择要清理的内容。我的代码的某些部分要求完全清理,而其他部分则要求清理符号和数字,但不是停用词。此外,我的代码还在为知识数据库创建搜索查询之前清理了其他潜在的问题来源。例如,它将出现的“he”、“him”和“his”替换为“luciano”——因为我假设任何向我网站的机器人询问第三人的人指的是我,并且它在数据库中的编码是这样的。当然,如果访问者实际上是在询问另一个人,这将无法正常工作……无论如何,数据库的答案中到处都有“卢西亚诺”,所以很明显,即使这个人可能正在考虑,答案也指的是我自己其他人。同样,清理过程的一部分是将所有输入变为小写,并将数据库的所有问题也使用小写(同时所有答案都正确大写)。此外,所有输入和问题都被完全修剪掉任何终端空间。

2.问答对数据库

对于我的聊天机器人,我使用了英文版的 Microsoft 个性化聊天数据库的聊天机器人,并开始添加关于我和我从事的项目的特定内容。为什么?好吧,因为我的机器人的全部目的是引导我网站的访问者并回答他们关于我和我的项目的问题 – 当然,微软对我和我的项目一无所知!事实上,当访问者登陆我的网站时,聊天机器人已经解释说它的知识仅限于谈论某些主题(我手动将其引入数据库)和基本的闲聊(来自微软的数据库以及一些自定义添加和编辑) .

这是我从 Microsoft 使用的数据库。如您所见,支持不同的语言和个性风格:

实际上,我重新调整了这个文件,在同一行中包含问答对,这使得添加更多条目变得更加容易。对于许多问题,我会给出多个可能的答案,这样当访问者重复一个问题或提出两个非常相似的问题时,机器人并不总是会重复自己。

这是来自知识库的示例条目:

hello||good morning||good evening||good night||whats up||wasup||whasup##***##***##Hello, all good?||Hi there, how are doing?

该行在 4 个字段中由 ## 分隔符分隔:第一个字段包含所有可能的提问方式(好吧,这里只是打招呼的一些方式,另一行还有更多方式),用 || 分隔。最后一个字段是可能的答案列表,同样用 || 分隔,这里有两个不同的选项。

第二个字段包含一种“免责声明”,如果聊天机器人在给出可能的答案之前只找到与其中一个问题的部分匹配,它将使用它来产生更自然的对话。例如,如果用户问“你叫什么名字?”如果有一些拼写错误,机器人会回答“询问我的名字?”然后是预设答案之一。请注意,按照我编写机器人的方式,如果错字非常小,则不会触发。例如,在这里我首先用一个拼写错误(导致直接回答),然后用多个拼写错误(答案前面有一个简短的免责句)提问:

第三个字段保留代表问答对的主要主题的关键字,有助于在对话中保持至少一些最小的上下文。例如,这里人类询问了moleculARweb(我和同事一起开发的一个网站),然后问了另一个关于“it”引用它的问题……聊天机器人得到了它:

3. Searching the database

当然,搜索问题的最快选择是简单地将人类键入的输入文本与每个可能行中列出的每个可能输入进行匹配。聊天机器人会这样做,这是它尝试的第一件事。如果找到匹配项,代码会随机选择列出的答案之一并显示它。例如,尝试向我的聊天机器人询问一些笑话:

聊天机器人还通过清理人类的输入以及所有停用词中的所有可能输入来进行完美匹配搜索。同样,如果有完美匹配,它将显示列表中的答案。但在此之前,聊天机器人会尝试在数据库中查找人类输入的问题,这一次允许出现拼写错误、语法错误,甚至换词。为此,它使用了两个测量字符串相似度的函数:

Jaro-Wrinkler 距离,它测量两个序列之间的编辑距离,即将一个序列转换为另一个序列所需的最小操作数。它的范围从 0 到 1,其中 1 表示完美匹配。请参阅此处以获取 Wikipedia 条目。这里是 Jaro 和 Wrinker 的原始论文。[0][1]

文本余弦相似度,用于衡量两个字符串之间每个单词出现次数的匹配程度,作为由两个字符串中所有 n 个单词的所有频率组成的 n 维向量形成的角度的余弦值。它的范围也从 0 到 1,其中 1 表示完美匹配。它是更一般的余弦相似度的一个具体应用,您可以在 Ben Chamblee 在 TDS 上的这篇非常好的文章中阅读有关它的内容。[0][1][2]

请注意,通过构造,Jaro-Wrinkler 距离将为具有拼写错误和不同拼写高度相似的字符串对评分。例如说 super 和 suter 或建模和建模。另一方面,文本余弦相似度会给带有拼写错误的单个单词打分非常差,因为在频率计算中每个单词都将被视为不同的单词。但相反,与 Jaro-Wrinkler 距离不同,文本余弦相似度度量将对由不同顺序的相同单词组成的句子对评分为完美匹配。因此,显然这两种类型的字符串相似度度量是非常互补的。这就是为什么我将两者都合并到我的聊天机器人中,并在两个分数中的任何一个高于阈值时假设匹配。

Jaro-Wrinkler 和文本余弦相似度指标非常互补,因此我为聊天机器人提供了两者都使用的选项。如果其中任何一个高于相似度阈值,则将其视为用户键入(或可能想要键入)的实际输入。

阈值实际上有 2 个级别:当用户文本与知识库中的一个问题之间的相似度高于 0.95 时,将其视为完美匹配,因此立即给出来自库的答案。如果分数在 0.88 和 0.95 之间,程序给出相同的答案,但前面有一个可变句子“你是说这个吗?”。如果分数在 0.8 到 0.88 之间,聊天机器人会澄清它不确定问题,然后是来自基础的候选问题及其相应的答案。

但是如何准确计算 Jaro-Wrinkler 和文本余弦相似度?

我从 Suman Kunwar 的这篇优秀文章中获取了这些函数,该文章已经在 J​​avaScript 中提供了它们:[0]

事实上,这篇文章描述(并给出了代码)4 个字符串比较函数。但由于上述原因,我只使用了 Jaro-Wrinkler 和 Text Cosine。结果证明它们对我来说效果很好——尽管不,它们并非万无一失。

最后一点,重要的是输入和所有可能的问题都是小写的,修剪并清除所有符号和数字。但不是停用词,这通常有助于定义句子的整体含义。

想和我的聊天机器人聊天吗?

你可以在这里试试我的聊天机器人:

http://lucianoabriata.altervista.org/chatbotallweb/chatbottest.html[0]

如果您提供 GPT3 API 密钥(您可以在这里免费获得),您可以使用机器人更高级的模块;但这仍在开发中(我会在它功能齐全时发表一篇文章)。[0]

Would you like to order a personalized chatbot? Or have a job for me about protein modeling, bioinformatics, protein design, molecular modeling, or protein biotechnology? Contact me here!www.lucianoabriata.com I write and photoshoot about everything that lies in my broad sphere of interests: nature, science, technology, programming, etc. Become a Medium member to access all its stories (affiliate links of the platform for which I get small revenues without cost to you) and subscribe to get my new stories by email. To consult about small jobs check my services page here. You can contact me here.

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2022年5月11日
下一篇 2022年5月11日

相关推荐