手把手教你用Python搭建一个AI智能问答系统
導讀:智能問答系統(tǒng)是自然語言處理的一個重要分支。今天我們將利用分詞處理以及搜索引擎搭建一個智能問答系統(tǒng)。
本文經(jīng)授權(quán)轉(zhuǎn)自公眾號CSDN(ID:CSDNnews)
作者:李秋鍵
具體的效果如下所示:
下面簡單了解下智能問答系統(tǒng)和自然語言處理的概念,智能問答系統(tǒng)是自然語言處理的一個重要分支。現(xiàn)在普遍認為智能問答能夠獨立解決很多問題,但是必須要承認現(xiàn)在技術(shù)所處的初級階段的性質(zhì)。也就是說,智能問答系統(tǒng)在現(xiàn)階段最大的價值在于為客服人員賦能,而并非獨立于人自行解決眾多目前還有巨大錯誤率和不確定性的問題。
一旦具有這樣的思想基礎(chǔ)——通過智能問答系統(tǒng)為客服人員附能,那么將智能問答系統(tǒng)做成一個工具和產(chǎn)品的基礎(chǔ)就有了,只有通過產(chǎn)品化、工具化的方式,才能夠?qū)崿F(xiàn)這個預期。
自然語言處理是計算機科學領(lǐng)域與人工智能領(lǐng)域中的一個重要方向。它研究能實現(xiàn)人與計算機之間用自然語言進行有效通信的各種理論和方法。自然語言處理是一門融語言學、計算機科學、數(shù)學于一體的科學。
因此,這一領(lǐng)域的研究將涉及自然語言,即人們?nèi)粘J褂玫恼Z言,所以它與語言學的研究有著密切的聯(lián)系,但又有重要的區(qū)別。自然語言處理并不是一般地研究自然語言,而在于研制能有效地實現(xiàn)自然語言通信的計算機系統(tǒng),特別是其中的軟件系統(tǒng)。因而它是計算機科學的一部分。
下面開始搭建我們的智能問答系統(tǒng),首先我們需要導入的庫:
import?requests from?lxml?import?etree import?jieba import?re import?sys,time import?os其中requests庫用來向搜索引擎搜索答案,lxml用來獲取答案,jieba庫用來提取問題以及做出問題分析,re是處理語言的正則匹配庫,sys以及time庫用來調(diào)試輸出效果,os模塊用來寫入文件以搭建模式選擇。
我們知道一個真正的語言回答應該是逐字回答的才符合人的回答習慣,下面為了達到語言對話的效果,我們定義一個函數(shù):
def?print_one_by_one(text):sys.stdout.write("\r?"?+?"?"?*?60?+?"\r")?#?/r?光標回到行首sys.stdout.flush()?#把緩沖區(qū)全部輸出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()?]開始執(zhí)行的判斷輸出一下,以及使用者的輸入:
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?+=segprocess=final此時process是僅僅最簡單語言的處理結(jié)果,為了適應更多語言習慣,使用正則表達式匹配另一種語言習慣,一個“問”時的處理:
#匹配問后面全部內(nèi)容 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這樣輸出的效果就可以適應多種語言習慣,為了區(qū)分問答句和模式選擇句加入判斷語句:
print("問題:"+process) if?process=='':print("小智:OK")在else中使用搜索引擎獲取答案,首先使用請求頭,百度百科網(wǎng)址:
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)為了防止中文亂碼問題,使用編碼如下:
#為了防止中文亂碼,編碼使用原網(wǎng)頁編碼url.raise_for_status()url.encoding?=?url.apparent_encoding下面使用匹配獲取內(nèi)容:
bject=etree.HTML(url.text)print(object) #正則匹配搜索出來答案的所有網(wǎng)址 #獲取詞條 head?=object.xpath('/html/head//meta[@name="description"]/@content') #詳細內(nèi)容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.read()if?s=="1":print_one_by_one(result)else:print(result)然后循環(huán)執(zhí)行問答系統(tǒng)即可:
while(True):if?os.path.exists('1.txt'):chuli()else:f?=?open("1.txt",?"w")f.write("1")f.close()chuli()如下圖所示,提問的語句可以任意,不需要固定格式,這樣才具有智能性不是嗎?
關(guān)于作者:李秋鍵,CSDN 博客專家,CSDN達人課作者。
有話要說👇 Q:智能問答系統(tǒng)可以解決哪些問題? 歡迎留言與大家分享 猜你想看👇更多精彩👇在公眾號對話框輸入以下關(guān)鍵詞查看更多優(yōu)質(zhì)內(nèi)容!PPT|?報告|?讀書|?書單|?干貨?大數(shù)據(jù)|?揭秘|?Python|?可視化AI|?人工智能|?5G|?中臺機器學習|?深度學習|?神經(jīng)網(wǎng)絡合伙人?|?1024|?段子|?數(shù)學總結(jié)
以上是生活随笔為你收集整理的手把手教你用Python搭建一个AI智能问答系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 推给我的广告都跟我最近看的内容有关系,怎
- 下一篇: 手把手教你获取、编译和调试Flink的源