




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
Python文本與語音應用設計
聊天機器人自然語言理解10.2實戰(zhàn)案例-天氣查詢機器人10.3聊天機器人0Elasticsearch10.4聊天機器人的分類10.110.5實戰(zhàn)案例-法務咨詢機器人知識目標掌握問答型機器人的流程;了解自然語言理解;掌握UNIT平臺搭建對話型機器人的流程。技能目標能夠調(diào)用外部接口實現(xiàn)聊天機器人10.1聊天機器人的分類10.1.1檢索式問答型機器人10.110.1.1檢索式問答型機器人這種機器人一般應用于問答系統(tǒng)中,智能客服是最核心的用戶場景,基本上來說,就是用戶使用智能客服系統(tǒng),提問了一個業(yè)務知識的問題,系統(tǒng)需要在知識庫里找到最合適的那一個答案,且一般來說,知識庫都是人工事先編輯好的。10.1.2多輪對話型機器人10.110.1.2多輪對話型機器人多輪對話也稱為基于上下文關(guān)系的對話。10.2自然語言理解10.2.1自然語言理解的概念10.210.2.1自然語言理解的概念自然語言理解(NaturalLanguageUnderstanding,NLU)是NLP的一部分,簡單來說就是希望計算機可以理解自然語言,例如理解語言、文本等,從中提取出有用的信息。10.2.2自然語言理解的兩要素10.210.2.2自然語言理解的兩要素NLU的出現(xiàn)讓很多團隊都掌握了一組關(guān)鍵技能----意圖識別和實體提取。這意味著可以讓機器從各種自然語言的表達中,區(qū)分出來,哪些話歸屬于這個意圖,哪些表達不是歸于這一類的,而不再依賴那么死板的關(guān)鍵詞。10.3實戰(zhàn)案例-天氣查詢機器人10.3.1案例目標10.310.3.1案例目標本案例我們通過百度的unit平臺以request請求的方式來搭建一個天氣查詢機器人。10.3.2案例分析10.310.3.2案例分析百度的unit平臺提供融合組合語義推導、語義匹配的對話理解技術(shù),預置涵蓋生活娛樂、設備控制等領(lǐng)域的可干預對話能力及50+場景的詞典和技能,包括聊天,新聞,天氣,音樂,寫詩,笑話,垃圾分類等等。本案例我們以天氣場景為例,來講述具體的使用方法。天氣場景意圖:查天氣實體(詞槽):哪里,什么時候整個流程如下:(1)根據(jù)api_key,secret_key獲取access_token;(2)構(gòu)造請求體,請求接口,接收返回的數(shù)據(jù);(3)解析數(shù)據(jù)。10.3.3案例實施10.3.3案例實施首先導入用到的庫。10.3importrequestsimportdatetimeimportuuidimportjson10.3.3案例實施獲取access_token。api_key,secret_key的獲取方式如下:10.3(1)注冊并登錄百度智能云平臺;(2)點開控制臺,在左側(cè)“>”箭頭處找到“人工智能”下的“智能對話”,點擊新建應用,填寫相關(guān)信息后即可看到api_key,secret_key。下面利用api_key,secret_key來生成唯一的token:defget_token(api_key,secret_key):URL='/oauth/2.0/token'params={'grant_type':'client_credentials','client_id':api_key,'client_secret':secret_key}
r=requests.get(URL,params=params)10.3.3案例實施10.3
try:r.raise_for_status()token=r.json()['access_token']returntokenexceptrequests.exceptions.HTTPError:return''10.3.3案例實施10.3請求接口,返回請求數(shù)據(jù)。query:用戶的指令字符串,service_id:UNIT的技能id,技能id的獲取方式:(1)打開網(wǎng)址/unit/home,進入UNIT;(2)點擊“我的技能”,在預置技能下點擊獲取技能,在彈出的對話框中選擇要獲取的技能,然后點擊獲取該技能,如圖10-1所示。圖10-1選擇預置技能10.3.3案例實施10.3(3)關(guān)閉對話框,即可看到該技能的id。api_key:UNITapi_key;secret_key:UNITsecret_key;returns:UNIT解析結(jié)果。如果解析失敗,返回None。session_id=''defgetUnit(query,service_id,api_key,secret_key,session_id):access_token=get_token(api_key,secret_key)
url='/rpc/2.0/unit/bot/chat?access_token='+
access_tokenrequest={"query":query,10.3.3案例實施10.3
"user_id":"888888",}body={"log_id":str(uuid.uuid1()),"bot_id":service_id,"bot_session":json.dumps({"session_id":session_id}),"request":request}try:headers={'Content-Type':'application/x-www-form-urlencoded'}response=requests.post(url,json=body,headers=headers)10.3.3案例實施10.3#print(response.text)returnjson.loads(response.text)exceptException:returnNone獲取session_id:當前請求中的bot_session.session_id與保留中的某個會話相同時,當前會話將繼承歷史會話的意圖和詞槽信息以及對話狀態(tài),來實現(xiàn)多輪對話。defgetSession(parsed):ifparsedisnotNoneand'result'inparsed:returnjson.loads(parsed["result"]['bot_session'])["session_id"]else:return''10.3.3案例實施解析機器人回復的內(nèi)容:10.3defgetSay(parsed,intent=''):
ifparsedisnotNone:returnparsed['result']['response']['action_list'][0]['say']else:return''10.3.3案例實施主函數(shù):10.3if__name__=='__main__':whileTrue:text=input()parsed=getUnit(text,"1099336",'YezaxM7yKMqECGnlKbh9KhFr','4FWRffUmFkqdPxre2kiK5srSWGXYlqjF',session_id)session_id=getSession(parsed)say=getSay(parsed)print(say)10.3.3案例實施運行上述程序,輸出結(jié)果如圖10-2所示。10.3圖10-2運行效果截圖10.3.3案例實施值得一提的是,該技能除了能查天氣外,還能查詢紫外線強度,穿衣指數(shù),是否適合洗車等,如圖10-3所示。10.3圖10-3運行效果截圖10.4Elasticsearch10.4.1Elasticsearch的安裝10.410.4.1
Elasticsearch安裝由于Elasticsearch是用Java編寫的,所以安裝之前確保JavaJDK已安裝以及配置了正確的環(huán)境變量。打開網(wǎng)址/downloads/elasticsearch/elasticsearch-6.5.4.zip,下載并解壓,運行bin目錄下的elasticsearch.bat文件,即可啟動Elasticsearch服務,如圖10-4所示。圖10-4es啟動文件圖10.4.2
ik插件10.410.4.2
ik插件ik是ES的一個分詞插件,安裝ik分詞器,訪問/medcl/elasticsearch-analysis-ik找releases找到對應的es版本,在es的安裝目錄的plugins文件夾下新建ik文件夾,將下載的壓縮包解壓到該文件夾下,如圖10-5所示。圖10-5ik插件安裝示意圖10.4.3Python操作Elasticsearch10.410.4.3Python操作ElasticsearchPython運行ES的話,需要先安裝依賴包,通過pipinstallelasticsearch安裝即可。接下來學習ES的用法。整個流程如下:(1)連接ES;(2)創(chuàng)建索引;(3)插入數(shù)據(jù)。10.410.4.3Python操作Elasticsearch首先導入需要的庫:importtimeimportjsonfromelasticsearchimportElasticsearchfromelasticsearch.helpersimportbulkimportplatformimportos10.410.4.3Python操作Elasticsearch把整個流程封裝成了一個類ProcessIntoES。classProcessIntoES:def__init__(self):self._index="crime_data"self.es=Elasticsearch([{"host":"","port":9200}],max_retries=3,retry_on_timeout=True)self.doc_type="crime"if(platform.system()=="Linux"):cur='/'.join(os.path.abspath(__file__).split('/')[:-1])self.music_file=os.path.join(cur,'data/qa_corpus.json')10.410.4.3Python操作Elasticsearchelif(platform.system()=='Windows'):cur=os.getcwd()+"\\"self.music_file=os.path.join(cur,'data\\qa_corpus.json')else:raise"系統(tǒng)不是Windows也不是Linux"print("初始化ProcessIntoES類完成")10.410.4.3Python操作Elasticsearch'''創(chuàng)建ES索引,確定分詞類型'''defcreate_mapping(self):print("開始創(chuàng)建ES索引")node_mappings={"mappings":{self.doc_type:{#type"properties":{"question":{#field:問題"type":"text","analyzer":"ik_max_word","search_analyzer":"ik_smart",10.410.4.3Python操作Elasticsearch"index":"true"},"answers":{#field:答案"type":"text","analyzer":"ik_max_word","search_analyzer":"ik_smart","index":"true"},}}}}10.410.4.3Python操作Elasticsearchifnotself.es.indices.exists(index=self._index):self.es.indices.create(index=self._index,body=node_mappings)print("Create{}mappingsuccessfully.".format(self._index))else:print("index({})alreadyexists.".format(self._index))print("創(chuàng)建ES索引結(jié)束")'''批量插入數(shù)據(jù)'''definsert_data_bulk(self,action_list):print("開始插入數(shù)據(jù)")success,_=bulk(self.es,action_list,index=self._index,raise_on_error=True)print("Performed{0}actions._:{1}".format(success,_))10.410.4.3Python操作Elasticsearch__init__方法中連接上了ES,默認端口號是9200,并指定了_index和doc_type,其作用相當于在創(chuàng)建數(shù)據(jù)庫的時候指定數(shù)據(jù)庫的名字和表的名字。create_mapping方法用來創(chuàng)建索引。analyzer字段的作用:(1)插入文檔時,將text類型字段做分詞,然后插入倒排索引;(2)在查詢時,先對text類型輸入做分詞,再去倒排索引搜索。如果想要“索引”和“查詢”,使用不同的分詞器,那么只需要在字段上使用search_analyzer。這樣,索引只看analyzer,查詢就看search_analyzer。ik_max_word:會對文本做最細力度的拆分;ik_smart:會對文本做最粗粒度的拆分。insert_data_bulk方法用來批量插入數(shù)據(jù)。action_list就是每批次要插入的數(shù)據(jù)。10.410.4.3Python操作Elasticsearch每個action的格式如下:action={"_index":pie._index,"_type":pie.doc_type,"_source":{"question":item['question'],"answers":'\n'.join(item['answers']),}}10.410.4.3Python操作Elasticsearchinit_ES函數(shù)是程序的主函數(shù),新建ProcessIntoES對象,創(chuàng)建索引,并插入數(shù)據(jù)。definit_ES():pie=ProcessIntoES()#創(chuàng)建ES的indexpie.create_mapping()start_time=time.time()index=0count=0action_list=[]BULK_COUNT=1000#每BULK_COUNT個句子一起插入到ES中10.410.4.3Python操作Elasticsearchforlineinopen(pie.music_file,encoding='utf-8'):ifnotline:continueitem=json.loads(line)print('\n'.join(item['answers']))index+=1
action={#'_op_type':'insert',"_index":pie._index,"_type":pie.doc_type,"_source":{"question":item['question'],"answers":'\n'.join(item['answers']),}}10.410.4.3Python操作Elasticsearchforlineinopen(pie.music_file,encoding='utf-8'):ifnotline:continueitem=json.loads(line)print('\n'.join(item['answers']))index+=1
action={#'_op_type':'insert',"_index":pie._index,"_type":pie.doc_type,"_source":{10.410.4.3Python操作Elasticsearch"question":item['question'],"answers":'\n'.join(item['answers']),}}action_list.append(action)ifindex>BULK_COUNT:pie.insert_data_bulk(action_list=action_list)index=0count+=1print(count)action_list=[]end_time=time.time()10.410.4.3Python操作Elasticsearchprint("TimeCost:{0}".format(end_time-start_time))if__name__=="__main__":#將數(shù)據(jù)插入到Elasticsearch當中init_ES()10.5實戰(zhàn)案例——法務咨詢機器人10.5.1案例目標10.510.5.1案例目標本案例我們通過法務問答集構(gòu)建一個法務咨詢機器人,問答集是json格式,總共20萬條數(shù)據(jù),每條數(shù)據(jù)包含問題,答案以及該條數(shù)據(jù)所屬的類別。10.5.2
案例分析10.510.5.2
案例分析整個案例的流程圖如圖10-6所示,具體流程如下:(1)用戶輸入想要咨詢的問題,首先通過Elasticsearch查找得到相似的問題列表;(2)加載詞向量,通過分詞,得到問題的句向量表示;(3)遍歷問題列表,將問題列表中的每個問題同樣用句向量表示,并依次與用戶輸入問題的句向量做文本相似度比較,二次篩選;(4)以es的命中問題分值和相似度分值做均值運算,得到最終的分值,取得分最高的那個問題的答案。10.510.5.2
案例分析圖10-6案例流程圖10.5.3
案例實施10.510.5.3
案例實施在上一節(jié)中已經(jīng)把數(shù)據(jù)導入到了ES中。首先導入需要的庫文件:fromelasticsearchimportElasticsearchimportnumpyasnpimportjieba.possegaspsegimportplatformimportos10.510.5.3
案例實施同樣的,把整個流程封裝成一個類CrimeQA中:classCrimeQA:def__init__(self):if(platform.system()=="Linux"):self._index="crime_data"self.es=Elasticsearch([{"host":"","port":9200}])self.doc_type="crime"cur='/'.join(os.path.abspath(__file__).split('/')[:-1])self.embedding_path=os.path.join(cur,'embedding/word_vec_300.bin')10.510.5.3
案例實施self.embdding_dict=self.load_embedding(self.embedding_path)self.embedding_size=300self.min_score=0.4self.min_sim=0.8elif(platform.system()=='Windows'):self._index="crime_data"self.es=Elasticsearch([{"host":"","port":9200}])self.doc_type="crime"cur=os.getcwd()+"\\"self.embedding_path=os.path.join(cur,'embedding\\word_vec_300.bin')10.510.5.3
案例實施self.embdding_dict=self.load_embedding(self.embedding_path)self.embedding_size=300self.min_score=0.4self.min_sim=0.8else:raise"系統(tǒng)不是Linux也不是Windows"10.510.5.3
案例實施'''根據(jù)question進行事件的匹配查詢'''defsearch_specific(self,value,key="question"):query_body={"query":{"match":{key:value,}}}searched=self.es.search(index=self._index,doc_type=self.doc_type,body=query_body,size=20)10.510.5.3
案例實施#輸出查詢到的結(jié)果print(searched)print('-------------')print(searched["hits"]["hits"])returnsearched["hits"]["hits"]'''基于ES的問題查詢'''defsearch_es(self,question):answers=[]res=self.search_specific(question)forhitinres:10.510.5.3
案例實施answer_dict={}answer_dict['score']=hit['_score']answer_dict['sim_question']=hit['_source']['question']answer_dict['answers']=hit['_source']['answers'].split('\n')answers.append(answer_dict)returnanswers'''加載詞向量'''defload_embedding(self,embedding_path):embedding_dict={}count=0forlineinopen(embedding_path,encoding='utf-8'):10.510.5.3
案例實施iflen(line)<300:continuewd=line[0]vector=np.array([float(i)foriinline[1:]])embedding_dict[wd]=vectorcount+=1ifcount%10000==0:print(count,'loaded')print('loaded%swordembedding,finished'%count,)returnembedding_dict10.510.5.3
案例實施'''對文本進行分詞處理'''defseg_sent(self,s):wds=[i.wordforiinpseg.cut(s)ifi.flag[0]notin['x','u','c','p','m','t']]returnwds'''基于wordvector,通過lookuptable的方式找到句子的wordvector的表示'''defrep_sentencevector(self,sentence,flag='seg'):ifflag=='seg':word_list=[iforiinsentence.split('')ifi]10.510.5.3
案例實施else:word_list=self.seg_sent(sentence)embedding=np.zeros(self.embedding_size)sent_len=0forindex,wdinenumerate(word_list):ifwdinself.embdding_dict:embedding+=self.embdding_dict.get(wd)sent_len+=1else:continuereturnembedding/sent_len10.510.5.3
案例實施'''計算問句與庫中問句的相似度,對候選結(jié)果加以二次篩選'''defsimilarity_cosine(self,vector1,vector2):cos1=np.sum(vector1*vector2)cos21=np.sqrt(sum(vector1**2))cos22=np.sqrt(sum(vector2**2))similarity=cos1/float(cos21*cos22)ifsimilarity=='nan':return0else:returnsimilarity10.510.5.3
案例實施'''問答主函數(shù)'''defsearch_main(self,question):candi_answers=self.search_es(question)print(candi_answers)question_vector=self.rep_sentencevector(question,flag='noseg')answer_dict={}forindx,candiinenumerate(candi_answers):candi_question=candi['sim_question']score=candi['score']/100candi_vector=self.rep_sentencevector(cand
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新疆維吾爾自治區(qū)和田地區(qū)2025屆高二物理第二學期期末質(zhì)量檢測試題含解析
- 天津市部分區(qū)2025年化學高二第二學期期末教學質(zhì)量檢測試題含解析
- 肇慶市重點中學2025屆生物高二第二學期期末監(jiān)測模擬試題含解析
- 云南省鹽津縣第三中學2024-2025學年高二下生物期末經(jīng)典試題含解析
- 車用尿素產(chǎn)品進出口運輸與保險合同
- 企業(yè)總部辦公場所租賃服務合同
- 餐飲店股東間資產(chǎn)重組與權(quán)益調(diào)整合同
- 餐飲業(yè)廚師職業(yè)成長與發(fā)展勞動合同
- 草牧場承包及綜合利用開發(fā)合同
- 智能家居產(chǎn)品區(qū)域代理權(quán)授權(quán)合同
- 2025年Web應用安全試題及答案解析
- 上海市同濟大學第二附屬中學2024-2025學年八年級下冊期末物理試卷
- 2025年液壓馬達開發(fā)行業(yè)深度研究報告
- 樹木移栽施工協(xié)議書
- 手術(shù)前抗凝藥停用時間
- 2025湖北水發(fā)集團園招聘40人筆試參考題庫附帶答案詳解
- 2025年武漢鐵路局招聘筆試參考題庫含答案解析
- (正式版)HGT 6313-2024 化工園區(qū)智慧化評價導則
- 二級公立醫(yī)院績效考核三級手術(shù)目錄(2020版)
- 燒烤店菜單模板
- 楚辭英譯:屈原《九歌_山鬼》漢譯英
評論
0/150
提交評論