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

文章目录

  • 前言
  • 一、智能聊天机器人的框架
  • 二、关键技术分析及代码实现
    • 1.模糊匹配
      • (1)模糊匹配技术简介:
      • (2)模糊匹配代码实现
    • 2.tf-idf技术
      • (1)tf-idf技术简介:
      • (2)tf-idf代码实现
    • 3.结巴分词
      • (1)结巴分词技术分析:
      • (2)结巴分词代码实现:
    • 4.朴素贝叶斯
      • (1)朴素贝叶斯技术分析:
      • (2)朴素贝叶斯代码实现:
    • 5.网络爬虫
      • (1)网络爬虫技术分析:
      • (2)网络爬虫代码实现:
  • 总结

前言

近年来,随着人工智能的快速发展,以人工智能技术为内核的多智能体技术快速发展,同时也有诸多产品相继落地,例如,苹果手机的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,则不返回结果Nonereturn  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:continuetext_apply.append(file)return [text_list,text_apply]

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

4.朴素贝叶斯

(1)朴素贝叶斯技术分析:

贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。
朴素贝叶斯分类(NBC)是以贝叶斯定理为基础并且假设特征条件之间相互独立的方法,先通过已给定的训练集,以特征词之间独立作为前提假设,学习从输入到输出的联合概率分布,再基于学习到的模型,输入X求出使得后验概率最大的输出Y。
贝叶斯公式:

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

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

    本博文上接上一篇博文"基于"机器学习"智能聊天机器人---python实现(1)" 博文链接:https://blog.csdn.net/DALEONE/art ...

  2. Python基于AIML智能聊天机器人实战视频教程-张子良-专题视频课程

    Python基于AIML智能聊天机器人实战视频教程-244人已学习 课程介绍         Python基于AIML的智能聊天机器人开发实战课程,包括典型案例.基础理论.功能拓展.源码框架解读四个方 ...

  3. Python基于AIML智能聊天机器人实战(4)- 机器人自学习能力集成

    一.前言 本文是<Python基于AIML智能聊天机器人实战>第四篇:AIML自学习能力集成: AIML是智能对话机器人具有里程碑意义的开源项目,曾斩获多项国际大奖,是基于检索技术的闲聊式 ...

  4. python微信集成_Python微信公众号后台开发005:集成智能聊天机器人​

    ​给公众号集成一个智能聊天机器人 一.前述 ChatterBot是一个基于机器学习的聊天机器人引擎,构建在python上,主要特点是可以自可以从已有的对话中进行学(jiyi)习(pipei). 二.具 ...

  5. 机器人编程python代码_自己动手开发智能聊天机器人完全指南(附python完整源码)...

    一.前言 人工智能时代,开发一款自己的智能问答机器人,一方面提升自己的AI能力,另一方面作为转型AI的实战练习.在此把学习过程记录下来,算是自己的笔记. 二.正文 2.1 下载pyaiml 下载pya ...

  6. python web微信应用(三) 微信智能聊天机器人

    文章目录 前言 一.webwx 模块介绍 二.微信智能聊天 前言 本篇文章作为系列第三篇文章,将实现一个微信智能聊天机器人: 系列其它文章请参考: python web微信应用(一) 微信协议分析 p ...

  7. 基于STM32简易DIY智能聊天机器人

    前言 大二忙里偷闲,花了一个月左右自己利用了Python+ESP8266 DIY 了一个智能聊天机器人,调用的是图灵机器人的体验API,现在把DIY过程记录下来,希望能分享给别的对这方面有兴趣的人. ...

  8. linux智能聊天机器人,基于bluemix智能聊天机器人开发过程(一)

    基于bluemix智能聊天机器人开发过程(一)--入门及地址部署 前期准备工作: 创建bluemix账号 GIT(可选) node.js cf(cloud foundry) bluemix Cli t ...

  9. 使用 Python 实现一个简单的智能聊天机器人

    使用 Python 实现一个简单的智能聊天机器人 文章目录 使用 Python 实现一个简单的智能聊天机器人 简要说明 总体的思路 需要准备的环境 接收用户的语音输入, 并将其存为音频文件 调用百度A ...

最新文章

  1. 常用的图像增强处理办法
  2. MySQL 到底是怎么解决幻读的?
  3. C#中巧用Lambda进行数据的筛选查询等处理
  4. c iostream.源码_通达信《牛气冲天》指标,共振主升浪冲涨停,牛散经常用(附源码...
  5. Jedis使用测试——连接本地及远程的Redis
  6. Java破碎重组_Java代码重组
  7. 将html代码部署到阿里云服务器,并进行域名解析,以及在部署过程中遇到的问题和解决方法
  8. 阶段性总结、反思、计划
  9. Spring Boot详情
  10. 手把手教你学dsp_大咖问答第13期:如何掌握DSP设计?顾卫钢博士在线为你解答...
  11. charset参数 sqluldr2_sqluldr2 oracle直接导出数据为文本的小工具使用
  12. 微信翻译小程序在哪里,如何使用
  13. 深蓝学院-多传感器融合定位-第4章作业
  14. 华为 服务器 驱动 linux,华为服务器SAS控制器驱动问题
  15. Ubuntu 18.04 2080ti 安装显卡驱动
  16. 我把几个理论糅合了一下
  17. 腾讯云数据库开源再突破:TDSQL PG版查询性能提升百倍
  18. 为什么角膜塑形镜的价格比隐形眼镜贵这么多?
  19. HTML视频学习教程,让你实战入门前端
  20. 669-Server端如何感知客户端的状态

热门文章

  1. 聊聊互联网广告前世今生,你想不想要流量?反正我想!
  2. 小程序报错修改Expecting 'STRING','NUMBER'
  3. 基于Java毕业设计车辆调度管理系统源码+系统+mysql+lw文档+部署软件
  4. 量化分析入门7:获取多支股票的收盘价
  5. 100本《架构师》迷你书——限时免费领取
  6. 功放限幅保护_更改限幅电路的功放清单
  7. Facebook使用虚拟信用卡养广告账户扣费跑广告实用技巧
  8. JAVA测试题-定义一个运动员(Sportsman)类,包含姓名(name)、跳高(highJump)
  9. 如何通过BIOS设置自动开机
  10. MATLAB读视频报错 Unable to initialize the video obtain properties (videoreader in Matlab)