你知道该如何搭建 AI 智能问答系统吗?

2019 年 11 月 7 日 CSDN

作者 | 李秋键
责编 | 刘静
出品 | CSDN(ID:CSDNnews)

今天我们将利用分词处理以及搜索引擎搭建一个智能问答系统,具体的效果如下所示:

下面简单了解下智能问答系统和自然语言处理的概念,智能问答系统是自然语言处理的一个重要分支。现在普遍认为智能问答能够独立解决很多问题,但是必须要承认现在技术所处的初级阶段的性质。也就是说,智能问答系统在现阶段最大的价值在于为客服人员附能,而并非独立于人自行解决众多目前还有巨大错误率和不确定性的问题。一旦具有这样的思想基础——通过智能问答系统为客服人员附能,那么将智能问答系统做成一个工具和产品的基础就有了,只有通过产品化、工具化的方式,才能够实现这个预期。

自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机科学、数学于一体的科学。因此,这一领域的研究将涉及自然语言,即人们日常使用的语言,所以它与语言学的研究有着密切的联系,但又有重要的区别。自然语言处理并不是一般地研究自然语言,而在于研制能有效地实现自然语言通信的计算机系统,特别是其中的软件系统。因而它是计算机科学的一部分。

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

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()
如下图所示,提问的语句可以任意,不需要固定格式,这样才具有智能性不是吗?

那么让我们再接着了解自然语言处理的发展历程吧,最先的语义解读各个方面的研究是自然语言。1949年,非裔威弗首先明确提出了自然语言方案。20世纪60八十年代,外国对自然语言曾有大规模的研究,花费了巨额开销,但人们以前似乎是高估了语义的复杂度,语法处置的学说和新技术皆不成冷,所以成果并不大。主要的作法是储存两种语法的单字、单词相同译名的辞典,翻译成时双射,新技术上只是变更语法的同条次序。但现实生活中的语法的翻译成近不是如此非常简单,很多时候还要参照某句话前后的意即。

约90八十年代开始,语义处置各个领域再次发生了极大的变动。这种变动的两个显著的特点是:

(1)系统对输出,拒绝研发的语义处置该系统能处置大规模的现实文档,而不是如现在的学术性该系统那样,不能处置极少的词典和类似于字词。只有这样,研发的该系统才有确实的实用性。

(2)系统对的输入,鉴于现实地解读语义是难于的,系统对非常拒绝能对语义文档展开深层的解读,但要能借此提取简单的数据。例如,对语义文档展开系统会地萃取目录词语,过滤器,索引,系统会萃取最重要数据,展开系统会概要等等。

同时,由于特别强调了"大规模",特别强调了"现实语料",上面两各个方面的开拓性管理工作也获得了推崇和强化。

(1)大规模现实语料的研发。大规模的经过有所不同深度加工的现实文档的语料,是研究工作语义统计资料物理性质的根基。没它们,统计资料方式不能是无源之水。

(2)大规模、数据非常丰富的字典的编制工作。数量为几万,十几万,甚至几十万词语,所含非常丰富的数据(如包括词语的配上数据)的计算机系统能用字典对语义处置的必要性是很显著的

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

声明:本文为作者原创投稿,未经允许请勿转载。

【END】

 热 文 推 荐 


腾讯 Github 全球贡献前十;三星可折叠手机售价 1.6 万;OpenTitan 正式开源|极客头条
程序员平均年薪 70 万、40 岁后收入下滑?尽在 2019 程序员薪资报告
羡慕!微软成功尝试:员工周休三天、待遇不变,工作效率却提高 40%!

微软全面拥抱 AI!

备战双 11!蚂蚁金服万级规模 K8s 集群管理系统如何设计?

这款“狗屁不通”文章生成器火了,效果确实比GPT 2差太远

CSDN应邀赴微软IT大会,揭开微软重磅推出的秘密武器——Azure区块链代币平台的神秘面纱!

点击阅读原文参与开发者大调查,好礼送不停!
你点的每个“在看”,我都认真当成了喜欢
登录查看更多
3

相关内容

自动问答(Question Answering, QA)是指利用计算机自动回答用户所提出的问题以满足用户知识需求的任务。不同于现有搜索引擎,问答系统是信息服务的一种高级形式,系统返回用户的不再是基于关键词匹配排序的文档列表,而是精准的自然语言答案。近年来,随着人工智能的飞速发展,自动问答已经成为倍受关注且发展前景广泛的研究方向。

知识荟萃

精品入门和进阶教程、论文和代码整理等

更多

查看相关VIP内容、论文、资讯等
【Facebook AI】低资源机器翻译,74页ppt
专知会员服务
29+阅读 · 2020年4月8日
【ACL2020-Allen AI】预训练语言模型中的无监督域聚类
专知会员服务
23+阅读 · 2020年4月7日
【斯坦福&Google】面向机器人的机器学习,63页PPT
专知会员服务
23+阅读 · 2019年11月19日
刘升平 | 基于知识图谱的人机对话系统
开放知识图谱
11+阅读 · 2018年10月24日
如何从零开始搭建知识图谱?
AI前线
23+阅读 · 2018年7月2日
肖仰华 | 知识图谱与认知智能
开放知识图谱
14+阅读 · 2018年4月5日
手把手丨用TensorFlow开发问答系统
大数据文摘
21+阅读 · 2017年11月29日
用TensorFlow开发问答系统
机器学习研究会
7+阅读 · 2017年11月27日
Python NLP入门教程
计算机与网络安全
8+阅读 · 2017年11月21日
Python NLP 入门教程
开源中国
14+阅读 · 2017年10月1日
论文动态 | 基于知识图谱的问答系统关键技术研究 #01
开放知识图谱
16+阅读 · 2017年8月3日
如何用Python做舆情时间序列可视化?
CocoaChina
10+阅读 · 2017年7月21日
Meta-Learning to Cluster
Arxiv
17+阅读 · 2019年10月30日
Arxiv
5+阅读 · 2019年8月22日
How to Fine-Tune BERT for Text Classification?
Arxiv
13+阅读 · 2019年5月14日
Arxiv
21+阅读 · 2019年3月25日
Arxiv
6+阅读 · 2018年11月1日
VIP会员
相关VIP内容
【Facebook AI】低资源机器翻译,74页ppt
专知会员服务
29+阅读 · 2020年4月8日
【ACL2020-Allen AI】预训练语言模型中的无监督域聚类
专知会员服务
23+阅读 · 2020年4月7日
【斯坦福&Google】面向机器人的机器学习,63页PPT
专知会员服务
23+阅读 · 2019年11月19日
相关资讯
刘升平 | 基于知识图谱的人机对话系统
开放知识图谱
11+阅读 · 2018年10月24日
如何从零开始搭建知识图谱?
AI前线
23+阅读 · 2018年7月2日
肖仰华 | 知识图谱与认知智能
开放知识图谱
14+阅读 · 2018年4月5日
手把手丨用TensorFlow开发问答系统
大数据文摘
21+阅读 · 2017年11月29日
用TensorFlow开发问答系统
机器学习研究会
7+阅读 · 2017年11月27日
Python NLP入门教程
计算机与网络安全
8+阅读 · 2017年11月21日
Python NLP 入门教程
开源中国
14+阅读 · 2017年10月1日
论文动态 | 基于知识图谱的问答系统关键技术研究 #01
开放知识图谱
16+阅读 · 2017年8月3日
如何用Python做舆情时间序列可视化?
CocoaChina
10+阅读 · 2017年7月21日
相关论文
Meta-Learning to Cluster
Arxiv
17+阅读 · 2019年10月30日
Arxiv
5+阅读 · 2019年8月22日
How to Fine-Tune BERT for Text Classification?
Arxiv
13+阅读 · 2019年5月14日
Arxiv
21+阅读 · 2019年3月25日
Arxiv
6+阅读 · 2018年11月1日
Top
微信扫码咨询专知VIP会员