当前位置: 首页 > 科技观察

使用Python创建一个简单的基于规则的聊天机器人

时间:2023-03-16 02:02:10 科技观察

还记得这段价值1亿的AI核心代码吗?whileTrue:AI=input('I:')print(AI.replace("Doyou","").replace('?','!').replace('?','!'))以上代码是我们今天的话题,基于规则的聊天机器人聊天机器人本身就是一种机器或者软件,它通过文本或者句子来模仿人类的交互。简而言之,可以使用类似于与人交谈的软件来进行聊天。为什么要尝试创建聊天机器人?也许您对一个新项目感兴趣,或者您的公司需要一个项目,或者想招商引资。无论动机如何,本文都将尝试解释如何创建一个简单的基于规则的聊天机器人。基于规则的聊天机器人什么是基于规则的聊天机器人?它是一个聊天机器人,可以根据特定规则回答人类给出的文本。由于它是基于强加的规则,因此该聊天机器人生成的响应几乎是准确的;但是,如果我们收到不符合规则的查询,聊天机器人将不会回答。它的另一个版本是基于模型的聊天机器人,它使用机器学习模型来回答给定的查询。(两者的区别是rule-based需要我们指定每条规则,而model-based会通过训练模型自动生成规则。还记得我们之前的文章《机器学习导论》,《机器学习为系统提供了无需要阐明对其进行编程以根据经验自动学习和改进的能力。”)基于规则的聊天机器人可能基于人类给出的规则,但这并不意味着我们不使用数据集。聊天机器人的主要目标仍然是将人类提出的问题自动化,所以我们仍然需要数据来制定特定的规则。在本文中,我们将使用余弦相似度距离作为基础开发一个基于规则的聊天机器人。余弦相似度是向量(尤其是内积空间中的非零向量)之间的相似度度量,常用于衡量两个文本之间的相似度。我们将使用余弦相似度来创建一个聊天机器人,通过比较查询和我们开发的语料库之间的相似度来回答查询提出的问题。这就是为什么我们首先需要开发我们的语料库。创建语料库对于这个聊天机器人示例,我想创建一个可以回答所有关于猫的问题的聊天机器人。为了收集关于猫的数据,我将从网上抓取它。importbs4asbsimporturllib.request#Openthecatwebdatapagecat_data=urllib.request.urlopen('https://simple.wikipedia.org/wiki/Cat').read()#Findalltheparagraphhtmlfromthewebpagecat_data_paragraphs=bs.BeautifulSoup(cat_data,'lxml').find_all('p')#Creatingthecorpusofallthewebpageparagraphscat_text=''#Creatinglowertextcorpusofcatparagraphsforpincat_data_paragraphs:cat_text+=p.text.lower()print(cat_text)使用上面的代码,您将从维基百科页面中获取段落集合。接下来,需要清理文本以删除无用的文本,例如括号数字和空格。importrecat_text=re.sub(r'\s+','',re.sub(r'\[[0-9]*\]','',cat_text))上面的代码将从语料库中删除括号。我故意省略了这些符号和标点符号,因为在与聊天机器人对话时听起来很自然。最后,我将从之前创建的语料库中创建一个句子列表。importnltkcat_sentences=nltk.sent_tokenize(cat_text)我们的规则很简单:测量聊天机器人的查询文本与句子列表中的每个文本之间的余弦相似度,其结果产生最接近的相似度(最高余弦相似度)然后它是回答我们的聊天机器人。创建一个Chatbot我们上面的语料库仍然是文本形式,余弦相似度不接受文本数据;所以语料库需要转换成数字向量。通常的做法是将文本转换为词袋(字数)或使用TF-IDF方法(频率概率)。在我们的例子中,我们将使用TF-IDF。我将创建一个函数,该函数接受查询文本并在下面的代码中根据余弦相似度给出输出。让我们看一下代码。fromsklearn.metrics.pairwiseimportcosine_similarityfromsklearn.feature_extraction.textimportTfidfVectorizerdefchatbot_answer(user_query):#Appendthequerytothesentenceslistcat_sentences.append(user_query)#Createthesentencesvectorbasedonthelistvectorizer=TfidfVectorizer()sentences_vectors=vectorizer.fit_transform(cat_sentences)#Measurethecosinesimilarityandtakethesecondclosestindexbecausethefirstindexistheuserqueryvector_values=cosine_similarity(sentences_vectors[-1],sentences_vectors)answer=cat_sentences[vector_values.argsort()[0][-2]]#Finalchecktomakesurethereareresultpresent.Ifalltheresultare0,meansthetextinputbyusarenotcapturedinthecorpusinput_check=vector_values.flatten()input_check.sort()ifinput_check[-2]==0:return"Pleasewry:我们可以把上面的函数使用下面的流程图表示:最后,使用以下代码创建一个简单的回答交互。print("Hello,IamtheCatChatbot.Whatisyourmeowquestions?:")while(True):query=input().lower()ifquerynotin['bye','goodbye','takecare']:print("CatChatbot:",end="")print(chatbot_answer(query))cat_sentences.remove(query)else:print("SeeYouAgain")break上面的脚本将接收查询并通过我们之前开发的聊天机器人处理它们。从上图可以看出,结果还是可以接受的,但是也有一些奇怪的反应。但是我们要考虑到目前只有一个数据源得到的结果,并没有做任何优化。如果我们用额外的数据集和规则改进它,它肯定会更好地回答问题。总结聊天机器人项目是一个令人兴奋的数据科学项目,因为它可以在许多领域提供帮助。在这篇文章中,我们利用网页获取的数据,利用余弦相似度和TF-IDF,用Python创建一个简单的聊天机器人项目,真正落地我们的亿项目。其实这里还有很多改进:在向量化的选择上,除了TF-IDF,还可以使用word2vec,甚至可以使用预训练的bert来提取词向量。答案链接其实就是通过特定的算法或者规则,从我们的语料库中搜索出最匹配的答案。本文使用的相似度TOP1方法其实是最简单的greedsearch-like方法。答案结果的优化仍然可以使用类似beamsearch的算法来提取与答案的匹配。在端到端深度学习兴起之前,很多聊天机器人都是按照规则运行的,落地案例也很多。如果你想快速做一个POC演示,这种基于规则的方法还是很有用的。