基于“机器学习”的智能聊天机器人---python实现(1)

本博文以自己课程设计为依托,介绍如何利用python语言编程实现基于“机器学习”的智能聊天机器人。由于本项目是自己首次接触python以及利用计算机编程实现小型项目,中途遇到诸多问题,自己也在其中收获很多,故想写一篇博文记录一下自己课程设计的心路历程。


前言

近年来,随着人工智能的快速发展,以人工智能技术为内核的多智能体技术快速发展,同时也有诸多产品相继落地,例如,苹果手机的siri,百度的小度等等。本博文以自己的课程设计为依托,借助于机器学习相关知识,使用python语言编程,实现简易的智能聊天机器人。
随着人工智能技术,物联网技术的快速发展,机器人已经深入至人们生产生活的方方面面。针对于机器人,如何与人类进行智能交互以及根据现实情况或人类指令完成特定任务是机器人设计和制作中非常重要的部分。本博文依托于自己课程设计,重点阐释如何设计机器人与人类进行智能交互以及如何根据人类指令完成特定的任务。

一、智能聊天机器人的框架

在这里插入图片描述

项目设计的智能聊天机器人主体依托于“模糊匹配”技术, 同时采用自行构建或网络爬虫的方式构建数据库,借助于tf-idf技术、jieba分词技术处理用户输入,最终调用百度智能语音处理模块或图形化用户交互界面实现智能聊天机器人输出。
为丰富项目功能,项目机器人设计双功能---(1)娱乐聊天(2)高校查询功能,同时提供双输出方式---(1)语音输出(2)图形化用户交互界面,最大程度上减少用户操作的难度,使用户与机器人之间的智能交互更加友好。

二、关键技术分析及代码实现

1.模糊匹配

(1)模糊匹配技术简介:
在计算机科学中,字符串模糊匹配( fuzzy string matching)是一种近似地(而不是精确地)查找与模式匹配的字符串的技术。换句话说,字符串模糊匹配是一种搜索,即使用户拼错单词或只输入部分单词进行搜索,也能够找到匹配项。因此,模糊匹配也被称为字符串近似匹配。
本项目主体实现主要依据于“模糊匹配”。用户的输入经过一系列格式化处理转换为可以应用的格式后,与事先构建的数据库问题进行匹配,返回匹配程度高的问题对应的答案作为程序输出,同时经过一系列的格式化处理,转换为语音进行文字播报或者输出至图形化用户交互界面中进行文字输出。
(2)模糊匹配代码实现
本实验中采用python的“Fuzzywuzzy模糊字符串匹配工具包”进行问题的匹配,返回二者之间的相似程度,同时设立阈值返回最佳的匹配结果。 代码编写:
#模糊匹配功能实现
def get_greeting(input_questions,question,answer):
    '''
    :param input_questions:处理后的用户输入 
    :param question: 数据库问题
    :param answer: 数据库问题对应的答案
    :return: 匹配程度最高问题所对应的答案
    '''
    text = {}
    for key, value in enumerate(question):               # enumerate函数将question张成“类字典”形式
        similarity = fuzz.ratio(input_questions, value)  # fuzz.ratio模糊匹配返回输入问题与各个数据库问题间的相似程度
        if similarity > 20:
            text[key] = similarity
    #text中存储的为匹配程度较高(大于20)的问题以及相应的键值(key)
    if len(text) > 0:
        train = sorted(text.items(), key=lambda d: d[1], reverse=True)
        #按照字典键值(value = 匹配值)进行排序
        answer3 = answer[train[0][0]]
        #取出匹配程度最高的问题对应索引
    else:
        answer3 = None # 假设问题匹配程度均低于20,则不返回结果None
    return  answer3

2.tf-idf技术

(1)tf-idf技术简介:
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
TF-IDF是Term Frequency - Inverse Document Frequency的缩写,即“词频-逆文本频率”,它由两部分组成,TF和IDF。词频 (TF) 指的是某一个给定的词语在该文件中出现的次数。这个数字通常会被归一化(一般是词频除以文章总词数), 以防止它偏向长的文件。
TFw=在某一类中词条w出现的次数/该类中所有的词条数目(1)
逆向文件频率 ( IDF) 的主要思想是:如果包含词条t的文档越少, IDF越大,则说明词条具有很好的类别区分能力。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。
IDF=log(语料库的文档总数/(包含词条w的文档数+1))(2)
某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。
TF−IDF=TF∗IDF(3)
(2)tf-idf代码实现
Tf-idf可以不借助至python的任何第三方库自行构建,但由于代码量过于庞大,调用python的sklearn模块进行tf-idf的运算往往是更优的选择。
本实验在用CountVectorizer类向量化之后再调用TfidfTransformer类进行预处理。
首先引入两个库:
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
然后引用两个库:
vectorizer = CountVectorizer()
transformer = TfidfTransformer()
最后获得训练样本的tf-idf矩阵:
tfidf = transformer.fit_transform(vectorizer.fit_transform())
代码实现:
#tf-idf数学处理
def tf_idf(text_train,text_test):
    '''
    :param text_train:训练样本处理 
    :param text_test: 预测样本处理
    :return: train_array:处理后训练样本 test_array:处理后预测样本
    '''
    vectorizer = CountVectorizer(min_df=1,max_features= 6)
    transformer = TfidfTransformer()
    tfidf_train = transformer.fit_transform(vectorizer.fit_transform(text_train))
    tfidf_test = transformer.fit_transform(vectorizer.transform(text_test))
    #训练样本和预测样本在相同模型处理,保证维度一致

    train_array = tfidf_train.toarray()
    test_array = tfidf_test.toarray()
    #稀疏矩阵转换为稠密矩阵,保证维度一致

    return [train_array,test_array]
在本项目中引入tf-idf技术的目的在于为后续的朴素贝叶斯分类器服务,朴素贝叶斯无论是训练抑或是预测时,均要求输入必须是数学形式,才能输入至分类器中进行训练和预测,tf-idf的作用便在此体现。
使用python提供的sk-learn模块实现tf-idf算法较为简单,但为解决训练和预测时维度不同的问题,需要针对于程序中两处做简单的改进。
(1)对于训练和预测样本的tf-idf处理均放置在一个函数中完成,可以保证数学矩阵输出时的维度一致性 (2)使用 toarry 函数将tf-idf算法处理得到的稀疏矩阵转换为稠密矩阵,保证维度一致,方便后续进行进一步处理。

3.结巴分词

(1)结巴分词技术分析:
Jiaba分词是当前应用最广泛的第三方中文分词库,中文文本通过分词获得单个词语,jjieba分词的原理利用一个中文词库,确定汉字之间的关联概率,汉字间概率大的组成词组,形成分词结果,除了分词,用户还可以添加自定义的词组。
Jiaba分词提供三种中文分词模式:
(1)精确分词:把文本精确的切分开,不存在冗余单词
(2)全模式:把文本中所有可能的词语都扫描出来,有冗余
(2)搜索引擎模式:在精确模式基础上,对长词再次进行切分
(2)结巴分词代码实现:
结巴分词代码实现步骤:
首先引入中文分词库:import jieba
然后利用精确分词模式:jieba.cut(s) 代码实现:
#样本格式化处理:(空格分隔,字符串转换,去除停用词)
def jieba_text(text):
    '''
    :param text:待处理文本 
    :return: text_list:分隔后文本 text_apply:分隔处理,去除停用词操作
    '''
    text_jieba = jieba.cut(text)
    text_str = ""
    for word in text_jieba:
        text_str +=word+" "
    text_list = text_str.split('\n')#空格分隔,换行符添加
    text_apply = []
    for file in text_list:
        for word in file:
            if word in stpwrd_content:
                file = file.replace(word,'')#停用词替换
            else:
                continue
        text_apply.append(file)
    return [text_list,text_apply]

在jieba分词处理模块,不仅仅只有分词的处理,同时也包含格式处理,停用词去除等等操作。
jieba中文分词的目的在于为tf-idf的处理做准备,tf-idf算法的计算主要涉及词频的计算,因此在该种情况下,算法要求输入必须为一个个词组成的词频矩阵,因此,必须讲过jieba中文分词处理才能输入至tf-idf模型中进行计算。
而去除停用词的操作则是为样本数据质量的增强,无论是训练数据抑或是用户输入语句均会存在诸多例如“你”“我”“啊”“呀”类似无关紧要的语句语句中的助词,这些词语的存在不但毫无意义,还会增加训练时间在,增加训练成本,因此必须在数据处理的阶段的处理掉。

4.朴素贝叶斯

(1)朴素贝叶斯技术分析:
贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。
朴素贝叶斯分类(NBC)是以贝叶斯定理为基础并且假设特征条件之间相互独立的方法,先通过已给定的训练集,以特征词之间独立作为前提假设,学习从输入到输出的联合概率分布,再基于学习到的模型,输入X求出使得后验概率最大的输出Y。
贝叶斯公式: 𝒑(𝒉|𝒅)=𝒑(𝒅|𝒉)∗𝒑(𝒉)/𝒑(𝒅)
贝叶斯公式中元素解析:
𝒑(𝒉|𝒅)是因子h基于数据d的假设概率,叫做后验概率
𝒑(𝒅|𝒉)是假设h为真条件下的数据d的概率
𝒑(𝒉)是假设条件h为真的时候的概率(和数据无关),它叫做h的先验概率 𝒑(𝒅)数据d的概率,和先验条件无关
在应用贝叶斯公式进行分类判断时,比较的是样本d属于各类𝒉𝒊的后验概率,最终样本d归属于后验概率最大的类别。
(2)朴素贝叶斯代码实现:
python中scikit-learn根据不同场景提供了三种常用的朴素贝叶斯算法:
如果样本特征的分布大部分是连续值,使用GaussianNB会比较好。如果样本特征的分大部分是多元离散值,使用MultinomialNB比较合适。如果样本特征是二元离散值或者很稀疏的多元离散值,应该使用BernoulliNB。

本实验根据数据的特点,选择MultinomialNB算法进行分类。
Python应用sklearn实现贝叶斯分类代码实现步骤:
首先应引入sklearn库from sklearn.naive_bayes import MultinomialNB
然后根据数据集和标签训练模型:model = MultinomialNB();model.fit(dataset, label)
最后使用分类器预测结果:model.predict()

代码实现:

#贝叶斯模型训练
def bayes_model(dataset,label):
    '''
    :param dataset:训练样本 
    :param label: 样本标签
    :return: 训练好的model样本
    '''
    model = MultinomialNB()
    model.fit(dataset, label)
    return model
贝叶斯分类器在本项目中主要应用于对于用户输入进行划分;由于项目机器人提供两种功能:(1)娱乐聊天(2)高校查询,在本项目中实现的方式是分别设计两个数据库,所以需要使用贝叶斯分类器对于用户输入进行分类,以便于匹配不同的数据库已完成更加精准的输出。

5.网络爬虫

(1)网络爬虫技术分析:
爬虫指的是:向网站发起请求,获取资源后分析并提取有用数据的程序;从技术层面来说就是通过程序模拟浏览器请求站点的行为,把站点返回的HTML代码/JSON数据/二进制数据(图片、视频) 爬到本地,进而提取自己需要的数据,存放起来使用。
网络爬虫实现流程:
(1)发起请求: 使用http库向目标站点发起请求,即发送一个request。Request一般包含请求头,请求体
(2)获取相应内容: 如果服务器可以正常响应,则会得到一个response,response包含html,json,图片,视频等等
(3)解析内容: 解析html数据:正则表达式(re模块),第三方的解析库如beautifulsoup,pyquery 解析json数据:json模块 解析二进制数据:以wb的方式写入文件
(4)保存数据: 数据库(mysql,mongdb,redis) 文件



Beautiful Soup提供一些简单的、Python式的函数来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
Beautifulsoup提供简单的抓取网页内容技巧:
(1)find_all()方法中单独的标签名,如a,会提取网页中所有的a标签,这里要确保是我们所需要的链接a,一般都不是,需要加上条件(就是标签的属性,加上限制筛选),如果这一及标签没有属性,最好往上一级找。
(2)select()方法可以按标签逐层查找到我们需要的内容,方便与内容定位,避免了单一的标签无法定位到我们所需要的内容元素。
(2)网络爬虫代码实现:
首先引入爬虫相关库:import requests , from bs4 import beautifulsoup
进而设置爬虫网页,获得reponse,同时设置beautifulsoup对象
最终利用find_all命令查找目标内容,并提取目标信息存储至文件中,完成数据库的构建


代码实现:
import requests
from bs4 import BeautifulSoup
from lxml import etree
import csv

header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36 Edg/91.0.864.41"}
#设置网站代理,反爬虫操作

f = open('C:\pycharm\chatting_Robot(python_class_design)\dataset.csv','w',encoding = "utf-8",newline = ''"")
#内容写入,避免空格出现
csv_writer = csv.writer(f)
csv_writer.writerow(["名称","网址"])

for i in range(1,108):
    url_1 = 'http://college.gaokao.com/schlist/p'
    url = url_1 + str(i) + '/'#更新网站,实现翻页操作
    response = requests.get(url,headers = header)
    soup = BeautifulSoup(response.text, 'lxml')

    grid = soup.find_all(name="strong", attrs={"class": "blue"})
    for word in grid:
        lst = word.find(name="a")#解析网页信息,查询定位信息
        csv_writer.writerow([lst.string,lst['href']])
        print(lst.string)
        print(lst['href'])
上文中有提到,本项目两种不同的功能分别匹配不同的数据库,针对于娱乐聊天的数据库,由于网络上并无较为完善、完美的数据库可供使用,因此娱乐聊天的数据库采用自行构建的方式;但由于高校查询板块数据要求精准度较高,因此采用网络爬虫的方式获取网络数据,存储至数据库中构建高校查询板块的数据库。

总结

今天的这篇博文先写到这里吧,由于课设内容较多,剩余内容将在另外博文中展示---
博文链接:https://blog.csdn.net/DALEONE/article/details/118655157
项目完整代码即附件已上传至GitHub;
GitHub项目地址:https://github.com/booue/chatting-robot-python
  • 8
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
基于循环神经网络(RNN)的智能聊天机器人系统可以使用Python编程语言实现。RNN是一种适合处理序列数据的机器学习模型,对于自然语言处理任务特别有用。下面将简要介绍实现智能聊天机器人系统的主要步骤: 1. 数据处理:首先,需要准备用于训练聊天机器人的数据集。可以使用开源的对话语料库或者自己收集一些对话数据。然后,进行数据清洗和预处理,比如去除特殊字符、标记化文本等。 2. 构建词汇表:创建一个词汇表将训练数据中的单词映射到唯一的整数索引。可以使用Python中的库,如NLTK或者spaCy来帮助处理文本和构建词汇表。 3. 序列填充与分批:由于RNN模型需要固定长度输入,在训练之前需要对句子进行填充或截断,使其长度保持一致。然后,将数据集划分为小批次来进行训练。 4. RNN模型构建:使用Python中的深度学习库,如TensorFlow、Keras或PyTorch构建RNN模型。常用的RNN类型有LSTM(长短期记忆)和GRU(门控循环单元)。模型的输入是一个独热编码的词向量,通过层叠RNN单元以及全连接层进行训练和预测。 5. 模型训练:将准备好的数据输入到RNN模型中进行训练。使用适当的损失函数(如交叉熵)和优化算法(如Adam),通过反向传播算法不断调整模型的参数。可以定义合适的停止准则或者使用验证集来评估模型的性能,并保存训练好的模型。 6. 智能回答生成:训练好的RNN模型可以用于生成智能回答。通过传入用户的输入,将其转换为词向量后输入到模型中得到预测结果。根据模型输出的概率分布,选择最高概率的单词作为回答的一部分,再将生成的单词添加到输入序列中,重复该过程直到生成完整的回答。 7. 用户交互界面:为了提供友好的用户体验,可以使用Python的GUI库,如Tkinter或PyQt,构建一个简单的聊天界面。用户可以通过界面与机器人进行对话,输入问题并查看机器人的回答。 综上所述,使用Python实现基于循环神经网络的智能聊天机器人系统需要进行数据处理、构建词汇表、RNN模型构建、模型训练、智能回答生成以及用户交互界面搭建等步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值