手把手教你用Python搭建一个AI智能问答系统

640?wx_fmt=gif

导读:智能问答系统是自然语言处理的一个重要分支。今天我们将利用分词处理以及搜索引擎搭建一个智能问答系统。


本文经授权转自公众号CSDN(ID:CSDNnews)

作者:李秋键

具体的效果如下所示:

640?wx_fmt=png

下面简单了解下智能问答系统和自然语言处理的概念,智能问答系统是自然语言处理的一个重要分支。现在普遍认为智能问答能够独立解决很多问题,但是必须要承认现在技术所处的初级阶段的性质。也就是说,智能问答系统在现阶段最大的价值在于为客服人员赋能,而并非独立于人自行解决众多目前还有巨大错误率和不确定性的问题。

一旦具有这样的思想基础——通过智能问答系统为客服人员附能,那么将智能问答系统做成一个工具和产品的基础就有了,只有通过产品化、工具化的方式,才能够实现这个预期。

自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机科学、数学于一体的科学。

因此,这一领域的研究将涉及自然语言,即人们日常使用的语言,所以它与语言学的研究有着密切的联系,但又有重要的区别。自然语言处理并不是一般地研究自然语言,而在于研制能有效地实现自然语言通信的计算机系统,特别是其中的软件系统。因而它是计算机科学的一部分。

640?wx_fmt=jpeg

下面开始搭建我们的智能问答系统,首先我们需要导入的库:

import requests
from lxml import etree
import jieba
import re
import sys,time
import os

其中requests库用来向搜索引擎搜索答案,lxml用来获取答案,jieba库用来提取问题以及做出问题分析,re是处理语言的正则匹配库,sys以及time库用来调试输出效果,os模块用来写入文件以搭建模式选择。

我们知道一个真正的语言回答应该是逐字回答的才符合人的回答习惯,下面为了达到语言对话的效果,我们定义一个函数:

def print_one_by_one(text):
    sys.stdout.write("\r " + " " * 60 + "\r") # /r 光标回到行首
    sys.stdout.flush() #把缓冲区全部输出
    for c in text:
        sys.stdout.write(c)
        sys.stdout.flush()
        time.sleep(0.1)

就是用来逐字输出的效果。

下面是真正搭建的部分,为了对语言进行处理,首先我们要加载停用词,去除掉语言中无意义的词,比如“了”,“啊”等等:

stop = [line.strip() for line in open('stopwords.txt',encoding='utf-8').readlines() ]

开始执行的判断输出一下,以及使用者的输入:

print("小智:您好,请问您需要问什么呢(对话(快,慢),可控制输出速度)")
input_word=input("我:")

#默认为慢速
print(input_word)
if input_word == "快":
        f = open("1.txt", "w")
        f.write("0")
        f.close()
elif input_word =='慢':
        f = open("1.txt", "w")
        f.write("1")
        f.close()

下面用Jieba分词,去除掉无用的停用词:

sd=jieba.cut(input_word,cut_all=False)
final=''
for seg in sd:
    #去停用词
        print(seg)
        if seg not in stop :
            final +=seg
 process=final

此时process是仅仅最简单语言的处理结果,为了适应更多语言习惯,使用正则表达式匹配另一种语言习惯,一个“问”时的处理:

#匹配问后面全部内容
pat=re.compile(r'(.*?)问(.*)')
#一个“问”时的处理
try:
        rel=pat.findall(final)
        process=rel[0][1]
except:
        pass

另外再添加语言习惯,两个“问”的处理:

#两个问时的处理
try:
        rel=pat.findall(final)
        rel0=rel[0][1]
        print(rel0)
        rel1=pat.findall(rel0)
        process=rel1[0][1]
except:
        pass

这样输出的效果就可以适应多种语言习惯,为了区分问答句和模式选择句加入判断语句:

print("问题:"+process)
if process=='':
        print("小智:OK")

在else中使用搜索引擎获取答案,首先使用请求头,百度百科网址:

header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
        url=requests.get("https://baike.baidu.com/search/word?word="+process,headers=header)

为了防止中文乱码问题,使用编码如下:

#为了防止中文乱码,编码使用原网页编码
        url.raise_for_status()
        url.encoding = url.apparent_encoding

下面使用匹配获取内容:

bject=etree.HTML(url.text)
        print(object)
#正则匹配搜索出来答案的所有网址
#获取词条
head =object.xpath('/html/head//meta[@name="description"]/@content')
#详细内容
        para=object.xpath('/html/body//div[@class="para"]/text()')

然后为了判断提问者提出的问题是否可行,以及模式匹配的选择,加入判断:

result='小智:'
        for i in para:
            result+=i
        if result=='小智:':
            print("小智:对不起,我不知道")
        else:
            f = open("1.txt", "r")
            s=f.read()
            if s=="1":
                print_one_by_one(result)
            else:
                print(result)

然后循环执行问答系统即可:

while(True):
    if os.path.exists('1.txt'):
        chuli()
    else:
        f = open("1.txt", "w")
        f.write("1")
        f.close()
        chuli()

如下图所示,提问的语句可以任意,不需要固定格式,这样才具有智能性不是吗?

640?wx_fmt=png

关于作者:李秋键,CSDN 博客专家,CSDN达人课作者。

640?

有话要说👇

Q:   智能问答系统可以解决哪些问题?
欢迎留言与大家分享

猜你想看👇

更多精彩👇

在公众号对话框 输入以下 关键词
查看更多优质内容!

PPT  |  报告  |  读书  |  书单  |  干货  
大数据  |  揭秘  |  Python  |  可视化
AI  |  人工智能  |  5G  |  中台
机器学习  |  深度学习  |  神经网络
合伙人  1024  |  段子  |  数学

【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于知识图谱的心理咨询智能问答系统python源码+项目说明+数据.zip #### 知识图谱实体类型 | 实体类型 | 中文含义 | 举例 | | :---------------- | :------: | :------------------------------------- | | disease | 疾病名称 | 广泛性焦虑障碍 | | alternate_name | 疾病别称 | 泛化性焦虑症, 广泛焦虑障碍, 广泛焦虑症 | | pathogenic_site | 病发部位 | 全身 | | department | 科室 | 精神病科, 心理咨询科 | | symptom | 症状 | 心烦、头痛、坐立不安、惊恐伤肾阳痿... | | check | 检查项目 | 心理咨询 | | susceptible_crowd | 易感人群 | 成年人 | #### 知识图谱实体关系类型 | 实体关系类型 | 中文含义 | 举例 | | :---------------------- | :----------: | :--------------------------------- | | disease_alternate_name | 疾病别名 | <广泛性焦虑障碍,别称,泛化性焦虑症> | | disease_pathogenic_site | 疾病感染部位 | <广泛性焦虑障碍,感染部位,全身> | | disease_symptom | 疾病症状 | <广泛性焦虑障碍,症状,惊恐伤肾阳痿> | | disease_check | 疾病所需检查 | <广泛性焦虑障碍,检查,心理咨询> | | disease_department | 疾病所属科室 | <广泛性焦虑障碍,科室,心理咨询科> | | disease_complication | 并发症 | <广泛性焦虑障碍,并发症,强迫症> | | disease_confusable | 易混淆病症 | <广泛性焦虑障碍,易混淆病症,抑郁症> | | disease_crowd | 疾病易感人群 | <广泛性焦虑障碍,易感人群,成年人> | #### 知识图谱属性类型 | 属性类型 | 中文含义 | 举例 | | :------------ | :------: | :---------------------------------------------------------: | | expert_remind | 专家建议 | 患者忌吃带有刺激性的食物和烟酒,多吃些海产品、豆类、牛奶... | | infectivity | 传染性 | 该病不具有传染性 | | heredity | 遗传性 | 不遗传 | .......
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值