广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python人工智能实战之对话机器人的实现
  • 759
分享到

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

2024-04-02 19:04:59 759人浏览 独家记忆

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对话机器人内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python人工智能实战之对话机器人的实现

本文链接: https://www.lsjlt.com/news/138554.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python人工智能实战之对话机器人的实现
    目录背景用到的技术主要流程代码模块Joke对象爬虫抓取笑话代码实现保存到sqlite数据库抓取笑话并保存到数据库背景 当我慢慢的开在高速公路上,宽敞的马路非常的拥挤!这时候我喜欢让...
    99+
    2022-11-13
  • AI人工智能 Python实现人机对话
    在人工智能进展的如火如荼的今天,我们如果不尝试去接触新鲜事物,马上就要被世界淘汰啦~ 本文拟使用Python开发语言实现类似于WIndows平台的“小娜”,或者是IOS下的“Siri”。最终达到人机对话的效...
    99+
    2022-06-04
    人工智能 人机 AI
  • Python人工智能实战之以图搜图的实现
    目录前言一、实验要求二、环境配置三、代码文件1、vgg.py2、index.py3、test.py四、演示1、项目文件夹2、相似度排序输出3、保存结果五、尾声前言 基于vgg网络和K...
    99+
    2022-11-13
  • Python人工智能实战之以图搜图怎么实现
    本篇内容介绍了“Python人工智能实战之以图搜图怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、实验要求给出一张图像后,在整个数...
    99+
    2023-06-30
  • Python实现五子棋人机对战 和人人对战
    目录人人对战动态演示源码分享人人对战.py人机对战动态演示前言: 过完520,咱们来玩玩五子棋陶冶情操。快拿这个和你女朋友去对线。多的不说直接进入正题 人人对战 游戏规则:p1为黑子...
    99+
    2022-11-11
  • Python如何实现五子棋人机对战和人人对战
    这篇文章主要介绍“Python如何实现五子棋人机对战和人人对战”,在日常操作中,相信很多人在Python如何实现五子棋人机对战和人人对战问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python如何实现五子棋...
    99+
    2023-06-30
  • 人机交互程序 python实现人机对话
    自己随便写了一个人机交互的程序。不存在任何智能,只是可以识别姓名,可以记录对话内容,并保存等到下一次交互时加载。 (推荐面向对象版本) # hello.py # 这是老早写的。不过今天加入了Pickl...
    99+
    2022-06-04
    人机 程序 python
  • python人工智能算法之随机森林怎么实现
    这篇文章主要介绍了python人工智能算法之随机森林怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python人工智能算法之随机森林怎么实现文章都会有所收获,下面我们一起来看看吧。随机森林(Random...
    99+
    2023-07-06
  • 人工智能-Python实现岭回归
    1 概述 1.1 线性回归 对于一般地线性回归问题,参数的求解采用的是最小二乘法,其目标函数如下: 1.2 岭回归  岭回归(ridge regression) 是一种...
    99+
    2022-11-12
  • 人工智能实战项目(python)+多领域实战练手项目
    人工智能实战项目 大家好,我是微学AI,本项目将围绕人工智能实战项目进行展开,紧密贴近生活,实战项目设计多个领域包括:金融、教育、医疗、地理、生物、人文、自然语言处理等;帮助各位读者结合机器学习与深度学习构建智能而且实用的人工智能简单系统,...
    99+
    2023-09-08
    人工智能 深度学习 计算机视觉 知识图谱
  • 人工智能—Python实现线性回归
    1、概述 (1)人工智能学习           (2)机器学习  (3)有监督学习  (4)线...
    99+
    2022-11-12
  • 人脸检测实战终极之OpenCV+Python实现人脸对齐
    目录前言实现面部矫正器导入必要的包对齐人脸展示结果前言 这篇博文的目的是演示如何使用 OpenCV、Python 和面部标志对齐人脸。 给定一组面部标志(输入坐标),我们的目标是将图...
    99+
    2022-11-12
  • Python 实现简单智能聊天机器人
    简要说明: 最近两天需要做一个python的小程序, 就是实现人与智能机器人(智能对话接口)的对话功能,目前刚刚测试了一下可以实现, 就是能够实现个人与机器的智能对话(语音交流)。 ...
    99+
    2022-11-11
  • python实战之百度智能云使人像动漫化
    目录一、目标二、准备工作三、操作流程3.1 阅读官方文档3.2 开始实现鉴权3.3 人像动漫化实现四、完整代码如下五、还能这么玩?一、目标 之前无意中看到有某位博主写过人像动漫化这样...
    99+
    2022-11-12
  • Python实战整活之聊天机器人
    目录一、前言二、效果演示三、完整代码一、前言 刚刚学了一些python文件读写的内容,先跑过来整活了。顺便复习一下之前学的东西。 import time doc_local='...
    99+
    2022-11-12
  • 怎么用python实现人工智能算法
    要使用Python实现人工智能算法,你可以按照以下步骤进行操作:1. 确定算法类型:首先,你需要确定你想要实现的人工智能算法类型,比...
    99+
    2023-10-11
    python 人工智能
  • 人工智能-Python实现多项式回归
    目录1、概述1.1 有监督学习1.2 多项式回归2 概念3 案例实现——方法1 3.1 案例分析3.2 代码实现 3.3 结果 ...
    99+
    2022-11-12
  • python人工智能算法之线性回归实例
    目录线性回归使用场景分析:总结:线性回归 是一种常见的机器学习算法,也是人工智能中常用的算法。它是一种用于预测数值型输出变量与一个或多个自变量之间线性关系的方法。例如,你可以使用线...
    99+
    2023-03-21
    python 线性回归算法 python 人工智能
  • python实现人人对战的五子棋游戏
    python五子棋之人人对战,供大家参考,具体内容如下 checkerboard.py from collections import namedtuple Chessman = ...
    99+
    2022-11-10
  • 怎么使用Python对接OpenAi API实现智能QQ机器人
    这篇文章主要介绍“怎么使用Python对接OpenAi API实现智能QQ机器人”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Python对接OpenAi API实现智能...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作