Python人工智能实战之对话机器人的实现

目录
  • 背景
  • 用到的技术
  • 主要流程
  • 代码模块
  • Joke对象
  • 爬虫抓取笑话
  • 代码实现
  • 保存到sqlite数据库
  • 抓取笑话并保存到数据库

背景

当我慢慢的开在高速公路上,宽敞的马路非常的拥挤!这时候我喜欢让百度导航的小度给我讲笑话,但她有点弱,每次只能讲一个。

百度号称要发力人工智能,成为国内人工智能的领军企业。但从小度的智商和理解能力上,我对此非常怀疑。

所以我们干脆用Python来开发一个可以讲笑话的机器人,可以自由定制功能,想讲几个笑话就讲几个笑话。

用到的技术

本文用到以下技术:

爬虫 - 抓取笑话

数据库 - 用sqlite保存笑话

面向对象 - 封装joke对象

模块 - 代码分模块放在多个文件中

语音识别 - 识别用户输入的语音,把笑话转换成语音

GUI - 开发简单的用户界面

打包 - 把程序打包成可执行文件

主要流程

代码模块

为了代码结构清晰,方便维护,我们把代码放到了多个py文件中,每个文件各司其职。

本程序共包括一下几个代码模块:

joke.py - 笑话对象,被多个模块共用

joke_crawler.py - 笑话爬虫

joke_db.py - 处理数据库相关,保存笑话,查询笑话等

joke_ui.py - 用户界面模块

joke_audio.py - 处理和语音相关的任务 和2个非代码结构:

joke_audio - 存放语音文件的文件夹

jokeDB.db - sqlite3数据库文件

现在开始写代码,请先创建一个文件夹,建议取名为myjoke。后面所有的代码都在这个文件夹中。

Joke对象

我们使用面向对象的编程思想,创建一个叫做Joke的类,来表示一个笑话。

用了Joke类,代码更清晰,数据传输也更方便。Joke类会被所有其他的模块用到。

创建一个名为joke.py的文件

代码如下:

class Joke:
    '''
    表示一个笑话。
    其中title是笑话标题,detail是笑话内容
    url是笑话的采集网址,通过url判定笑话是否重复,防止保存重复笑话
    id是数据库生成的唯一标识符,刚刚采集下来的笑话是没有id的,所以id可以为空
    '''
    def __init__(self, title, detail, url, id=None):
        self.title = title
        self.detail = detail
        self.url = url
        self.id = id

    def __str__(self):
        '''
        有了这个方法,print(joke)会把笑话打印成下面格式的字符串,否则只会打印对象的内存地址
        '''
        return f'{id}-{title}\n{detail}\n{url}'

这个类中只有两个魔术方法,一个是构造函数__init__,一个是__str__。

爬虫抓取笑话

分析网页结构

我们要抓取的网址是这个:http://xiaohua.zol.com.cn/detail1/1.html我们要抓的数据点有三个:

在谷歌浏览器中,右键点击检查,就可以在下面看到网页的代码结构:

1.用鼠标点击1的按钮

2.然后把鼠标移到2的地方

3.就可以看到成功这两个字在网页中的结构。

通过分析这个结构,我们可以得出:成功这两个字是在一个h1结构内,这个h1的class是article-title,因为可以使用这个特征提取其中的内容(示例代码):

title = html.select_one('h1.article-title').getText()

用同样的方法可以分析出笑话内容和下一页URL的特征。

分析网页结构需要基本的HTML和CSS的知识,如果完全不懂,可以先直接模仿我的代码,然后再慢慢理解相关知识。

代码实现

现在来看完整的代码。

新建一个名为joke_crawler.py的文件。

import requests
import bs4
import time
import random
#先注释掉数据库相关的代码,后面需要反注释回来
#import joke_db
from joke import Joke

#起始URL
url = 'http://xiaohua.zol.com.cn/detail1/1.html'  

#网站的域名地址,用来拼接完整地址
host = 'http://xiaohua.zol.com.cn'

def craw_joke(url):
    '''
    抓取指定的URL,返回一个Joke对象,和下一个要抓取的URL
    如果抓取失败,返回None, None
    必须设置User-Agent header,否则容易被封
    '''
    print(f'正在抓取:{url}')
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
    }
    html = requests.get(url, headers=headers).text
    soup = bs4.BeautifulSoup(html, 'lxml')
    try:
        #分别使用css选择器提取title, detail和next_url
        title = soup.select_one('h1.article-title').getText()
        detail = soup.select_one('div.article-text').getText().strip()
        next_url = soup.select_one('span.next > a')['href']
        return Joke(title, detail, url), next_url
    except Exception as e:
        print('出错了:', e)
        print(html)
        return None, None 

# 抓取笑话,以学习为目的,建议不要抓取太多,本例子只抓取了10个
count = 0
for i in range(0, 10):
    joke, next_url = craw_joke(url)
    if joke:
        #先注释掉数据库相关的代码,后面需要反注释回来
        #joke_db.save(joke)
        print(joke)
        url = host + next_url
    print('歇一会儿再抓!')
    time.sleep(random.randint(1, 5))
print('抓完收工!')

代码中已经添加了一些注释,有基础的应该可以看懂。

有两个点要注意:

1.在craw_joke函数中,必须添加User-Agent的header,否则会很快被封锁。

2.代码中注释掉了和数据库相关的代码,现在只是把笑话打印出来。写好了数据库模块,要把相关代码反注释回来。

3.抓取的中间有随机1到5秒的停顿,一个防止被封锁,二是出于文明礼貌,不要给服务器带来太大压力。

保存到sqlite数据库

抓来的笑话可以保存到文件中,但是用文件存储不方便检索,也不方便判断笑话是否重复等。

所以更好的方法是把笑话保存到数据库,这里选择sqlite做数据库。原因如下:

1.sqlite是文件数据库,不需要安装额外的数据库服务器

2.python默认支持sqlite数据库,不需要任何额外的安装和配置

但如果你想把世界上所有的笑话都抓下来,数据量很大,那建议使用更正式的数据库,比如MySQL.

新建一个名为joke_db.py的文件

代码如下:

import sqlite3
from joke import Joke 

def setup():
    '''
    创建数据库和创建表,如果已经存在了不会重复创建
    '''
    con = sqlite3.connect('jokeDB.db')
    with con:
        con.execute('''CREATE TABLE IF NOT EXISTS jokes
                    (id INTEGER PRIMARY KEY,
                    title varchar(256) NOT NULL,
                    detail varchar(1024) NOT NULL,
                    url varchar(1024) NOT NULL)''')

def save(joke):
    '''
    把笑话保存到数据库
    根据url判断是否已经有这个笑话了,如果有了就不再保存
    '''
    con = sqlite3.connect('jokeDB.db')
    with con:
        cur = con.cursor()
        cur.execute(
            'SELECT * FROM jokes WHERE (url = ?)', [(joke.url)])
        has_joke = cur.fetchone()
        if has_joke:
            print('重复了,不再插入')
        else:
            con.execute('INSERT INTO jokes(title, detail, url) VALUES (?,?,?)', (joke.title, joke.detail, joke.url))
            print('笑话保存成功')

def get_jokes():
    '''
    返回所有的笑话列表
    '''
    print('loading jokes...')
    con = sqlite3.connect('jokeDB.db')
    jokes = []
    with con:
        for row in con.execute('SELECT * FROM jokes'):
            joke = Joke(row[1], row[2], row[3], row[0])
            jokes.append(joke)
    return jokes

# 调用最上面的代码
setup()

# 测试代码,本模块被别的模块引入的时候,不会执行下面的代码
if __name__ == '__main__':
    save(Joke('笑话Test', '笑话内容test', 'https://www.joke.com/1.html'))
    save(Joke('笑话Test2', '笑话内容test', 'https://www.joke.com/2.html'))
    print('========打印一下所有的笑话======')
    for joke in get_jokes():
        print(joke)
        print()

代码已经添加了比较多的注释,请先看代码。这里额外的补充:

1.要使用sqlite,需要引入sqlite3模块

2.使用sqlite要先用connect()方法获得链接,然后调用execute()方法执行SQL语句。

运行上面的代码,就可以发现文件夹下多了一个名为jokeDB.db的文件,这是程序自动创建的数据库文件,笑话就保存在里面。下面里面只有两个测试的笑话:

> python joke_db.py
笑话保存成功
笑话保存成功
========打印一下所有的笑话======
loading jokes...
1-笑话Test
笑话内容test
https://www.joke.com/1.html

2-笑话Test2
笑话内容test
https://www.joke.com/2.html

这一部分需要一定的数据库知识,不过你也可以比这葫芦画瓢,先把功能做出来,再加强相关知识。

抓取笑话并保存到数据库

现在回到joke_crawler.py中,去掉关于joke_db的注释代码

第1处在文件开头:

#先注释掉数据库相关的代码,后面需要反注释回来
#import joke_db

第2处在文件的最下面:

for i in range(0, 10):
    joke, next_url = craw_joke(url)
    if joke:
        #先注释掉数据库相关的代码,后面需要反注释回来
        #joke_db.save(joke)
        print(joke)
        url = host + next_url
    print('歇一会儿再抓!')
    time.sleep(random.randint(1, 5))
print('抓完收工!')

去掉注释后,再次运行joke_crawler.py,就会把笑话保存在数据库中。

为了验证是否保存成功了,可以去运行joke_db.py,因为这个文件最后会打印出所有的笑话:

========打印一下所有的笑话======
loading jokes...
1-笑话Test
笑话内容test
https://www.joke.com/1.html

2-笑话Test2
笑话内容test
https://www.joke.com/2.html

3-成功
她:“因为别人都不同情你,我才做你的妻子。”他:“你总算成功了。现在每个人都因此同情我。”
http://xiaohua.zol.com.cn/detail1/1.html

4-结婚以后
女:“为什么从前你对我百依百顺,可结婚才三天,你就跟我吵了两天的架?”男:“因为我的忍耐是有限度的。”
http://xiaohua.zol.com.cn/detail1/2.html

5-我们的
燕尔新婚,新娘对新郎说:“今后咱们不兴说‘我的'了,要说‘我们的'。”新郎去洗澡,良久不出,新娘问:“你在干什么哪?”“亲爱的,我在刮我们的胡子呢。”
http://xiaohua.zol.com.cn/detail1/3.html

6-杞人忧天
妻子患了重病,医生宣告回天乏术。妻子即对丈夫说:“我现在希望你能够发誓。”“发什么誓。”“如果你再婚,不准把我的衣服给你的新妻子穿。”丈夫恍然大悟道:“这个我可以发誓。说实话,你根本不必操心,因为我再也不想找像你这样胖的太太了。”
http://xiaohua.zol.com.cn/detail1/5.html

7-理由充分
法官:“离婚理由是什么?”新娘:“他打呼噜。”法官:“结婚多长时间了?”新娘:“三天。”法官:“离婚理由充分,结婚三天还不是打呼噜的时候。”
http://xiaohua.zol.com.cn/detail1/6.html

8-聪明丈夫
某夫妇当街而过,一只鸽子飞过天空,一泡鸽粪不偏不倚正巧落在太太肩上,太太急了,忙叫丈夫拿纸。丈夫抬头,见鸽子不讲卫生,到处拉屎,却不知妻子叫他拿纸干嘛,说:“叫我有啥办法,追上前去给它擦屁股呀! ”
http://xiaohua.zol.com.cn/detail1/8.html

9-事故与灾难
一位夫人问她的丈夫:“亲爱的,你能告诉我‘事故'与‘灾难'这两个词之间有什么区别吗?”“这很简单。”丈夫认真地回答说,“譬如你失足落水,这就叫‘事故';如果人家又把你当鱼钓上来,这就是‘灾难'了。”
http://xiaohua.zol.com.cn/detail1/13.html

10-吵架的结果
夫妻吵架了。当丈夫下班回到家里,他发现妻子不在家。只在桌上留了一个条子,上面写道:“午饭在《烹调大全》第215页;晚饭在317页。”
http://xiaohua.zol.com.cn/detail1/14.html

11-保险之险
太太不懂保险的道理,认为缴保险费是浪费,先生连忙解释说:“保险是为了你和孩子,万一我死了;你们也有个保障呀! ”太太反驳说:“要是你不死呢?”
http://xiaohua.zol.com.cn/detail1/16.html

12-补不足
妻:“我晓得,你与我结婚,是因为我有钱。”夫:“不是,是因为我没有钱。”
http://xiaohua.zol.com.cn/detail1/17.html

到此这篇关于Python人工智能实战之对话机器人的实现的文章就介绍到这了,更多相关Python对话机器人内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python3从零开始搭建一个语音对话机器人的实现

    01-初心缘由 最近在研究语音识别方向,看了很多的语音识别的资料和文章,了解了一下语音识别的前世今生,其中包含了很多算法的演变,目前来说最流行的语音识别算法主要是依赖于深度学习的神经网络算法,其中RNN扮演了非常重要的作用,深度学习的应用真正让语音识别达到了商用级别.然后我想动手自己做一个语音识别系统,从GitHub上下载了两个流行的开源项目MASR和ASRT来进行复现,发现语音识别的效果没有写的那么好,其中如果要从零来训练自己的语言模型势必会非常耗时. 因此,就有了一个新的想法,借助一些开源的

  • 教你使用python搭建一个QQ机器人实现叫起床服务

    目录 前言 具体实现 1.定时发送信息 2.让机器人陪女朋友聊天 3.调用一些有趣的接口 前言 上一篇文章介绍了怎么配置机器人框架,并且实现了一些简单的功能. (发送私聊或者群聊信息.接收上报的事件.简单的自动回复等等) 这次为了让QQ机器人更加智能,调用了一些实用的接口. 通过自己搭建的机器人实现定时叫女朋友起床.和女朋友聊天等功能. 如上图所示,我的机器人每天都会准时叫女朋友起床:并且在我忙的时候然而女朋友无聊的时候可以陪她聊一会天. 具体实现 以下实现的功能都需要机器人已经配置完成,并且已

  • Python制作微信机器人教程详解

    目录 一.环境配置 二.登录 三. 第一个简单的消息发送监控 四.指定某个微信好友发送消息 五.所有微信群监控 六.公众号监听 七.定时发送消息 八.微信智能聊天机器人 一.环境配置 大多数人无法登录网页版,所以饶过它模拟电脑登录,这个模块一定记得安装: pip install itchat-uos pip install itchat 二.登录 #码登录个人微信账号 import itchat itchat.auto_login(hotReload=True)#hotReload= True可

  • python实现AI聊天机器人详解流程

    前言 开始几天,我是使用很原始的方法,自己去获取天气预报截图,再手动发送给小姐姐.连续几天之后我一想:不对呀,我怎么说也是一个程序猿,怎么能用这么 low 的方式呢. 联想起之前看到的一个开源 python 库-- wxpy,一个非常强大的微信 api 调用类库,正好满足我当前的需要,那话不多说,开干. 任务分解 调用微信 api 发送简单消息 获取当日天气预报截图信息 设置定时任务 调用微信 api 发送简单消息 本程序主要是通过 wxpy 库使用的,参考其官网文档,我们需要做如下准备工作:

  • Python调用两个机器人聊天的实战

    目录 机器人api接口 调用接口封装机器人 实现两个机器人聊天 聊天文字转语音 总结 众所周知,现在网上有很多非常智能bushi(智障)的AI机器人接口,利用这些接口,我们可以实现一个机器人,可以和它对话聊天,为了增加机器人聊天内容的趣味性,今天我决定要搞两个机器人,看它俩聊天,看看会不会发生什么有趣的事情,搞起!!! 机器人api接口 经过一通百度,找到几个推荐比较多的机器人接口,如下: 天行机器人: 天行机器人, 验证邮箱之后每天可以有100次的免费调用次数,测试用的话够了,不想用自己的邮箱

  • Python实战整活之聊天机器人

    一.前言 刚刚学了一些python文件读写的内容,先跑过来整活了.顺便复习一下之前学的东西. import time doc_local='D:\learning_folder\interaction.txt' def iRead(): fr = open(doc_local, 'r') message=fr.read() return message def iWrite(message): fw = open(doc_local, 'w') fw.write(message) fw.clos

  • Python人工智能实战之对话机器人的实现

    目录 背景 用到的技术 主要流程 代码模块 Joke对象 爬虫抓取笑话 代码实现 保存到sqlite数据库 抓取笑话并保存到数据库 背景 当我慢慢的开在高速公路上,宽敞的马路非常的拥挤!这时候我喜欢让百度导航的小度给我讲笑话,但她有点弱,每次只能讲一个. 百度号称要发力人工智能,成为国内人工智能的领军企业.但从小度的智商和理解能力上,我对此非常怀疑. 所以我们干脆用Python来开发一个可以讲笑话的机器人,可以自由定制功能,想讲几个笑话就讲几个笑话. 用到的技术 本文用到以下技术: 爬虫 - 抓

  • Python人工智能实战之以图搜图的实现

    目录 前言 一.实验要求 二.环境配置 三.代码文件 1.vgg.py 2.index.py 3.test.py 四.演示 1.项目文件夹 2.相似度排序输出 3.保存结果 五.尾声 前言 基于vgg网络和Keras深度学习框架的以图搜图功能实现. 一.实验要求 给出一张图像后,在整个数据集中(至少100个样本)找到与这张图像相似的图像(至少5张),并把图像有顺序的展示. 二.环境配置 解释器:python3.10 编译器:Pycharm 必用配置包: numpy.h5py.matplotlib

  • Python人工智能构建简单聊天机器人示例详解

    目录 引言 什么是聊天机器人? 准备工作 创建聊天机器人 导入必要的库 定义响应集合 创建聊天机器人 运行聊天机器人 完整代码 结论 展望 引言 人工智能是计算机科学中一个非常热门的领域,近年来得到了越来越多的关注.它通过模拟人类思考过程和智能行为来实现对复杂任务的自主处理和学习,已经被广泛应用于许多领域,包括语音识别.自然语言处理.机器人技术.图像识别和推荐系统等. 本文将介绍如何使用Python构建一个简单的聊天机器人,以展示人工智能的基本原理和应用.我们将使用Python语言和自然语言处理

  • Python 实现简单智能聊天机器人

    简要说明: 最近两天需要做一个python的小程序, 就是实现人与智能机器人(智能对话接口)的对话功能,目前刚刚测试了一下可以实现, 就是能够实现个人与机器的智能对话(语音交流). 总体的思路: 大家可以设想一下, 如果要实现人与机器的智能对话, 肯定要有以下几个步骤: 计算机接收用户的语音输入 将用户输入的语音输入转化为文本信息 调用智能对话接口, 发送请求文本信息, 获取接口返回的智能回答文本信息 将回答文本信息转化为语音格式输出 这里可以安装很多现成的库函数, 辅助我们系统的实现. 需要准

  • 不到20行代码用Python做一个智能聊天机器人

    伴随着自然语言技术和机器学习技术的发展,越来越多的有意思的自然语言小项目呈现在大家的眼前,聊天机器人就是其中最典型的应用,今天小编就带领大家用不到20行代码,运用两种方式搭建属于自己的聊天机器人. 1.神器wxpy库 首先,小编先向大家介绍一下本次运用到的python库,本次项目主要运用到的库有wxpy和chatterbot. wxpy是在 itchat库 的基础上,通过大量接口优化,让模块变得简单易用,并进行了功能上的扩展.什么是接口优化呢,简单来说就是用户直接调用函数,并输入几个参数,就可以

  • Python+Opencv实战之人脸追踪详解

    目录 前言 人脸追踪技术简介 使用基于 dlib DCF 的跟踪器进行人脸跟踪 使用基于 dlib DCF 的跟踪器进行对象跟踪 小结 前言 人脸处理是人工智能中的一个热门话题,人脸处理可以使用计算机视觉算法从人脸中自动提取大量信息,例如身份.意图和情感:而目标跟踪试图估计目标在整个视频序列中的轨迹,其中只有目标的初始位置是已知的,将这两者进行结合将产生许多有趣的应用.由于外观变化.遮挡.快速运动.运动模糊和比例变化等多种因素,人脸追踪非常具有挑战性. 人脸追踪技术简介 基于判别相关滤波器 (d

  • Python OpenCV实战之与机器学习的碰撞

    目录 0. 前言 1. 机器学习简介 1.1 监督学习 1.2 无监督学习 1.3 半监督学习 2. K均值 (K-Means) 聚类 2.1 K-Means 聚类示例 3. K最近邻 3.1 K最近邻示例 4. 支持向量机 4.1 支持向量机示例 小结 0. 前言 机器学习是人工智能的子集,它为计算机以及其它具有计算能力的系统提供自动预测或决策的能力,诸如虚拟助理.车牌识别系统.智能推荐系统等机器学习应用程序给我们的日常生活带来了便捷的体验.机器学习的蓬勃发展,得益于以下三个关键因素:1) 海

  • Python+Pygame实战之疯狂吃水果游戏的实现

    目录 导语 一.准备中 1)游戏玩法 2)环境安装 3)素材准备 二.代码展示 三.效果展示 导语 嘿嘿!木木子今日闪现——已经给大家写了很多内容啦~ 涉及的人工智能.初学者.爬虫.数据分析(这方面的一般不过审核)游戏........ PS: 吃豆人我写过了哈 Python+Pygame实战之吃豆豆游戏的实现 切水果我写过了哈 Python Pygame实战之水果忍者游戏的实现 今天二者集合,做出一款新游戏,哈哈哈,名字叫做<疯狂

  • python人工智能使用RepVgg实现图像分类示例详解

    目录 摘要 安装包 安装timm 数据增强Cutout和Mixup EMA 项目结构 计算mean和std 生成数据集 摘要 RepVgg通过结构重参数化让VGG再次伟大. 所谓“VGG式”指的是: 没有任何分支结构.即通常所说的plain或feed-forward架构. 仅使用3x3卷积. 仅使用ReLU作为激活函数. RepVGG的更深版本达到了84.16%正确率!反超若干transformer! RepVgg是如何到的呢?简单地说就是: 首先, 训练一个多分支模型 然后,将多分支模型等价转

随机推荐