责编 | 刘静
出品 | CSDN(ID:CSDNnews)
本日我们将利用分词处理以及搜索引擎搭建一个智能问答系统,详细的效果如下所示:
下面大略理解下智能问答系统和自然措辞处理的观点,智能问答系统是自然措辞处理的一个主要分支。现在普遍认为智能问答能够独立办理很多问题,但是必须要承认现在技能所处的低级阶段的性子。也便是说,智能问答系统在现阶段最大的代价在于为客服职员附能,而并非独立于人自行办理浩瀚目前还有巨大缺点率和不愿定性的问题。一旦具有这样的思想根本——通过智能问答系统为客服职员附能,那么将智能问答系统做成一个工具和产品的根本就有了,只有通过产品化、工具化的办法,才能够实现这个预期。
自然措辞处理是打算机科学领域与人工智能领域中的一个主要方向。它研究能实现人与打算机之间用自然措辞进行有效通信的各种理论和方法。自然措辞处理是一门融措辞学、打算机科学、数学于一体的科学。因此,这一领域的研究将涉及自然措辞,即人们日常利用的措辞,以是它与措辞学的研究有着密切的联系,但又有主要的差异。自然措辞处理并不是一样平常地研究自然措辞,而在于研制能有效地实现自然措辞通信的打算机系统,特殊是个中的软件系统。因而它是打算机科学的一部分。
下面开始搭建我们的智能问答系统,首先我们须要 导入的库:
import requestsfrom lxml import etreeimport jiebaimport reimport sys,timeimport 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.flushtime.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.closeelif 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 +=segprocess=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_statusurl.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+=iif result=='小智:':print(\公众小智:对不起,我不知道\"大众)else:f = open(\"大众1.txt\"大众, \公众r\公众)s=f.readif s==\"大众1\"大众:print_one_by_one(result)else:print(result)
然后循环实行问答系统即可:
while(True):if os.path.exists('1.txt'):chulielse:f = open(\"大众1.txt\"大众, \公众w\"大众)f.write(\"大众1\公众)f.closechuli
如下图所示,提问的语句可以任意,不须要固定格式,这样才具有智能性不是吗?
那么让我们再接着理解自然措辞处理的发展进程吧,最先的语义解读各个方面的研究是自然措辞。1949年,非裔威弗首先明确提出了自然措辞方案。20世纪60八十年代,外国对自然措辞曾有大规模的研究,花费了巨额开销,但人们以前彷佛是高估了语义的繁芜度,语法处置的学说和新技能皆不成冷,以是成果并不大。紧张的作法是储存两种语法的单字、单词相同译名的辞典,翻译成时双射,新技能上只是变更语法的同条次序。但现实生活中的语法的翻译成近不是如此非常大略,很多时候还要参照某句话前后的意即。
约90八十年代开始,语义处置各个领域再次发生了极大的变动。这种变动的两个显著的特点是:
(1)系统对输出,谢绝研发的语义处置该系统能处置大规模的现实文档,而不是如现在的学术性该系统那样,不能处置极少的词典和类似于字词。只有这样,研发的该系统才有确实的实用性。
(2)系统对的输入,鉴于现实地解读语义是难于的,系统对非常谢绝能对语义文档展开深层的解读,但要能借此提取大略的数据。例如,对语义文档展开系统会地萃取目录词语,过滤器,索引,系统会萃取最主要数据,展开系统会概要等等。
同时,由于特殊强调了\"大众大规模\"大众,特殊强调了\公众现实语料\公众,上面两各个方面的开拓性管理事情也得到了推崇和强化。
(1)大规模现实语料的研发。大规模的经由有所不同深度加工的现实文档的语料,是研究事情语义统计资料物理性子的根基。没它们,统计资料办法不能是无源之水。
(2)大规模、数据非常丰富的字典的体例事情。数量为几万,十几万,乃至几十万词语,所含非常丰富的数据(如包括词语的配上数据)的打算机系统能用字典对语义处置的必要性是很显著的
作者简介:李秋键,CSDN 博客专家,CSDN达人课作者。
声明:本文为作者原创投稿,未经许可请勿转载。
【END】