




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
目錄前言 3第一章 緒論 41.1 研究背景及現(xiàn)狀 41.2 對話知識庫構(gòu)建方法概述 41.3 本文的主要工作及創(chuàng)新點(diǎn) 51.4 本文的組織結(jié)構(gòu) 5第二章 對話知識庫構(gòu)建方法 72.1 理論基礎(chǔ) 72.1.1 方法的形成 72.1.2 方法思路 82.1.3 方法可行性分析 82.2 語句模板生成 92.2.1 詞性標(biāo)注集簡介 92.2.2 語句特征選取 102.3 提取問題與答案關(guān)聯(lián)特征 112.4 生成對話知識庫 122.4.1 知識庫存儲(chǔ)方式 122.4.2 知識庫存儲(chǔ)結(jié)構(gòu) 132.4.3. 知識庫生成過程 142.4.4 知識庫更新過程 152.5 本章小結(jié) 15第三章 知識庫構(gòu)建系統(tǒng) 173.1 系統(tǒng)需求分析 173.2 系統(tǒng)可行性分析 173.3 系統(tǒng)結(jié)構(gòu) 183.4 使用工具介紹 193.5 系統(tǒng)編碼實(shí)現(xiàn) 203.5.1 詞性標(biāo)注模塊 203.5.2 知識庫生成模塊 233.5.3 知識庫檢索模塊 273.5.4 人機(jī)交互模塊 293.6 本章小結(jié) 30第四章 實(shí)驗(yàn)結(jié)果分析 314.1 實(shí)驗(yàn)結(jié)果展示 314.1.1 對話過程展示 314.1.2 知識庫構(gòu)建結(jié)果展示 354.2 實(shí)驗(yàn)結(jié)果分析 36第五章 總結(jié)與展望 37參考文獻(xiàn) 38致謝 39摘要本文提出了一種基于模板自動(dòng)生成的面向機(jī)器人學(xué)習(xí)的對話知識庫構(gòu)建方法,并且實(shí)現(xiàn)了一個(gè)基于這種知識庫構(gòu)建方法的對話系統(tǒng)。該構(gòu)建方法的核心思想是利用句子中的詞性,根據(jù)句子中有意義實(shí)詞的詞性來完成模板的生成。知識庫構(gòu)建系統(tǒng)對首次被問及的某一個(gè)問題,會(huì)請求用戶告知這個(gè)問題該如何回答。此后,系統(tǒng)會(huì)根據(jù)用戶輸入的問題和答案嘗試學(xué)習(xí)同類問題和答案的表達(dá)方式并建模。并且采用一定策略,從問題和答案中嘗試提取出該問題和對應(yīng)答案相關(guān)聯(lián)的細(xì)節(jié)特征。然后在語料庫中匹配滿足答案表達(dá)方式的語句,利用這些語句來建立和該問題同屬一類問題的答案知識庫。當(dāng)再次被問及這一類問題時(shí),系統(tǒng)就會(huì)先將問題建模,找到此類問題對應(yīng)的知識庫,然后利用前面學(xué)到的此類問題和答案關(guān)聯(lián)特征,嘗試在知識庫中找到這個(gè)問題的答案。該構(gòu)建方法可以用來實(shí)現(xiàn)簡單的對話機(jī)器人系統(tǒng),同時(shí)也可以為剛投入使用的復(fù)雜對話機(jī)器人系統(tǒng)快速構(gòu)建常規(guī)問題的對話知識庫。實(shí)驗(yàn)結(jié)果表明,本文提出的模板自動(dòng)生成知識庫構(gòu)建方法是有效的,基于模板生成的對話知識庫構(gòu)建方法能夠利用用戶提供的[問題,答案]快速建立這一類問題的答案知識庫。關(guān)鍵詞:知識庫構(gòu)建;機(jī)器人學(xué)習(xí);模板生成;對話機(jī)器人AbstractInthispaper,weproposeamethod,basedonautomaticallygeneratingpatterns,toconstructdialogueknowledgebaseorientedonrobotlearning.Wealsoimplementadialoguesystembasedonthisknowledgebaseconstructionmethod.Thecoreideaoftheconstructionmethodistousethepart-of-speechofwords,whichcompletestheformationofpatternsbyusingthepart-of-speechofmeaningfulwordsinthesentence.Theknowledgebasebuildingsystemaskstheuserhowtoansweraquestionthatwasfirstasked.Afterthat,thesystemwilltrytolearntheexpressionsandmodelsofsimilarquestionsandanswersbasedonuserinputquestionandanswer.Anditalsoadoptsacertainstrategytotrytoextractcorrespondingfeaturebetweenquestionandanswer.Thenitpicksoutthetargetsentenceswhichfitthatanswermodelinthecorpus,andusesthesesentencestosetupknowledgebasewhichcanbeusedtoanswerquestionsthathavesametypewithquestioninputtingbyuser.Whenaskedaboutthiskindofproblemagain,thesystemwillgeneratepatternwithinputtingproblemfirst,andthenitfindthecorrespondingknowledgebasewhichareestablishedwiththisquestionpattern.Next,itusethefeatureslearnedintheearlysteptofindexactanswerofthisquestionintheknowledgebase.Thisconstructionmethodcanbeusedtorealizeasimpledialoguerobotsystem,anditcanalsoquicklybuildaconversationknowledgebaseofconventionalquestionsforthecomplexdialoguerobotsystemthathasjustbeenputintouse.Theexperimentalresultsshowthatthemethodproposedinthispaperiseffective,andthemethodofbuildingadialogueknowledgebasebasedonpatterngenerationcanmakeuseofthe[question,answer]providedbyuserstoquicklyestablishtheanswerknowledgebasetothiskindofproblems.Keywords:KnowledgeBaseConstruction;RobotLearning;PatternGeneration;ConversationalRobot前言隨著信息化時(shí)代的到來,日常生活中會(huì)產(chǎn)生大量的數(shù)據(jù),而且每天產(chǎn)生的數(shù)據(jù)量正在以指數(shù)式增長。這些數(shù)據(jù)中記錄了各種各樣的信息,涵蓋了日常生活中的方方面面,其中含有許多簡單、事實(shí)性問題的直觀答案。常規(guī)的搜索引擎能完成信息的檢索,即搜索引擎根據(jù)關(guān)鍵字進(jìn)行檢索,它返回出現(xiàn)了給定關(guān)鍵字的文檔。這些含有問題答案的文檔集合為問答系統(tǒng)的答案抽取提供了基礎(chǔ)。目前,已經(jīng)有多種方法用來從文本信息中抽取答案,比較典型方法有基于模板匹配算法、基于信息檢索和信息抽取算法、基于統(tǒng)計(jì)學(xué)習(xí)的算法、基于自然語言處理的算法[1],能利用這些技術(shù),能夠從含有答案的文檔中提取出準(zhǔn)確答案完成對話,如周博通等實(shí)現(xiàn)的InsunKBQA:一個(gè)基于知識庫的問答系統(tǒng)[2]。但是,這些技術(shù)只是對針對一個(gè)具體的問題完成了答案的提取,無法抽取同屬一類問題的所有問題的答案。面對海量的問題,如果對每一個(gè)問題都采用只針對本問題的答案抽取方式,那么構(gòu)建一個(gè)對話知識庫就要完全依賴人工手動(dòng)輸入每一個(gè)問題,然后知識庫構(gòu)建系統(tǒng)再依據(jù)具體的問題建立對話內(nèi)容,這顯示是費(fèi)力不可行的。對于海量的問題,我們渴望對問題進(jìn)行分類,然后從“類”的角度入手,找到一種通用的方式來建立這一類問題的答案知識庫。本文從詞性的角度對句子進(jìn)行分類,根據(jù)用戶提供的[問題,答案],嘗試自動(dòng)生成該問題和答案的詞性模板,并利用答案語句的詞性模板在語料庫中搜索滿足該模板的語句,然后再根據(jù)這些語句來構(gòu)建這一類問題的答案知識庫。當(dāng)下次輸入的問題符合特定的[問題,答案]中“問題”模板時(shí),就可以嘗試從這個(gè)“答案”模板生成的知識庫中尋找正確答案。緒論本章首先介紹了對話知識庫構(gòu)建方法的研究背景和研究現(xiàn)狀,其次概述了本文構(gòu)建對話知識庫所用的方法,并說明了本文所做的主要工作及創(chuàng)新點(diǎn)。最后介紹了本篇文章的組織結(jié)構(gòu)。研究背景及現(xiàn)狀隨著人工智能時(shí)代的到來,人們希望機(jī)器人能像人一樣用自然語言來完成對話。目前市面上也已經(jīng)有了很多能用自然語言來對話的機(jī)器人,代表作品有微軟公司的娛樂聊天機(jī)器人小冰、蘋果的語音助手Siri、京東客服機(jī)器人JIMI等。對話系統(tǒng)可以根據(jù)應(yīng)用場景的不同分為開放域(open-domain)問題和封閉域(closed-domain)問題2種類型[3]。.就機(jī)器人回答內(nèi)容的來源上劃分,可以將聊天機(jī)器人分為檢索式聊天機(jī)器人和生成式聊天機(jī)器人。檢索式對話機(jī)器人根據(jù)用戶的輸入和上下文內(nèi)容,使用預(yù)先存儲(chǔ)好的知識庫來完成對話;生成式對話機(jī)器人則更加復(fù)雜,它不依賴于事先定義好的內(nèi)容,自動(dòng)生成新的回答內(nèi)容。目前的對話機(jī)器人主要還是以檢索式為主,因此構(gòu)建知識庫是完成檢索式對話機(jī)器人的關(guān)鍵內(nèi)容。當(dāng)前關(guān)于構(gòu)建對話知識庫的主要方法分為三種,分別為手工編輯、基于本體的知識庫構(gòu)建方法、半自動(dòng)或自動(dòng)知識提取構(gòu)建方法[4]。手工編輯主要表現(xiàn)形式為直接手動(dòng)編輯和互聯(lián)網(wǎng)眾包機(jī)制,通過人們手動(dòng)將知識結(jié)構(gòu)化寫入計(jì)算機(jī)的方法來得到對話知識庫。起源于哲學(xué)的本體論近年來在信息領(lǐng)域也得到了廣泛的應(yīng)用,特別是W3C國際標(biāo)準(zhǔn)本體描述語言O(shè)WL(ontologyWeblanguage)[5]使本體論方法在構(gòu)建知識庫方面成為現(xiàn)實(shí)。半自動(dòng)或自動(dòng)知識提取則是事先設(shè)計(jì)好自動(dòng)或半自動(dòng)提取算法,然后讓計(jì)算機(jī)利用該算法去語料庫中抽取知識。對話知識庫構(gòu)建方法概述本文所提出的對話知識庫構(gòu)建方法是面向機(jī)器人學(xué)習(xí)的自動(dòng)知識庫構(gòu)建方法,即不需要提供大量的訓(xùn)練數(shù)據(jù),基于用戶提供的一例[問題,答案],嘗試學(xué)習(xí)同類問題和答案的表達(dá)方式并建模,借以從自由文本或知識庫中搜集大量同質(zhì)異構(gòu)的問答對子,形成知識庫并輔助問題的高效檢索。該構(gòu)建方法的核心思想是同一類問題雖然有很多不同的具體問題,但是就問題中實(shí)詞的詞性而言,屬于同一類的問題,它們的詞性是相同的。比如“張明昨天去哪兒了?”,這一具體的問題,其中實(shí)詞的詞性向量為[張明_人名,昨天_時(shí)間,去_動(dòng)詞,哪兒_代詞],因此這一類問題的共詞性同模板向量就是[人名,時(shí)間,動(dòng)詞,代詞]。對于這個(gè)具體的問題,一個(gè)正確答案可能是“張明昨天去北京了?!保磉@個(gè)答案的詞性向量依次為[張明_人名,昨天_時(shí)間,去_動(dòng)詞,北京_地名],我們可以得到這類問題的答案語句模板向量為[人名,時(shí)間,動(dòng)詞,地名]。因而,我們可以用這個(gè)答案模板去語料庫中檢索,符合這個(gè)模板的句子,它可能就是這類問題中某個(gè)具體問題的答案。基于這樣的假設(shè),我們將這些句子用來建立這類問題的答案知識庫。當(dāng)下次有符合[人名,時(shí)間,動(dòng)詞,代詞]模板的問題,就嘗試從這個(gè)答案知識庫中去尋找答案。本文的主要工作及創(chuàng)新點(diǎn)本文以各種知識庫構(gòu)建方法為基礎(chǔ),參考了各種構(gòu)建方法的核心思想,提出了一種基于模板生成的自動(dòng)知識庫構(gòu)建方法。先在理論上探索了利用該方法構(gòu)建對話知識庫的可行性,然后在windows平臺上編碼實(shí)現(xiàn)了一個(gè)利用該構(gòu)建方法的對話知識庫構(gòu)建系統(tǒng),通過在一定量的語料庫上,實(shí)際地驗(yàn)證了該構(gòu)建方法的實(shí)際效果。本文提出的知識庫構(gòu)建方法創(chuàng)新點(diǎn)主要體現(xiàn)在不僅是對具體的某個(gè)問題創(chuàng)建該問題的答案知識庫,而是嘗試將用戶提供的[問題,答案]實(shí)例抽象到“類”的層次。從人的認(rèn)識事物的角度出發(fā),將某個(gè)具體的[問題,答案]進(jìn)行抽象,拋去表層具體的詞項(xiàng),提煉出該[問題,答案]的詞性模式[問題模板,答案模板,問題--答案的關(guān)聯(lián)特征],利用這個(gè)詞性模板建立一個(gè)屬于這一類[問題,答案]的答案知識庫,實(shí)現(xiàn)由一個(gè)[問題,答案]例子,嘗試學(xué)會(huì)回答這一類問題,從而達(dá)到機(jī)器人自學(xué)習(xí)的效果。本文的組織結(jié)構(gòu)全文共分為五章,每個(gè)章節(jié)的內(nèi)容安排如下:第一章:緒論。本章首先介紹了對話知識庫構(gòu)建方法的研究背景和研究現(xiàn)狀,其次概述了本文構(gòu)建對話知識庫所用的方法,并說明了本文所做的主要工作及創(chuàng)新點(diǎn)。最后介紹了本篇文章的組織結(jié)構(gòu)。第二章:本文所使用的知識庫構(gòu)建方法詳細(xì)描述。闡述該構(gòu)建方法的理論基礎(chǔ)及實(shí)現(xiàn)原理。第三章:詳述一個(gè)基于該構(gòu)建方法實(shí)現(xiàn)的對話知識庫構(gòu)建系統(tǒng)。第四章:實(shí)驗(yàn)結(jié)果展示及對基于本方法的知識庫構(gòu)建系統(tǒng)的評估。第五章:總結(jié)全文,提出進(jìn)一步的工作設(shè)想與展望。對話知識庫構(gòu)建方法本章將詳細(xì)地介紹本文提出的對話知識庫構(gòu)建方法,主要從基本原理、句子模板生成、具體問題和對應(yīng)答案關(guān)聯(lián)特征提取、利用生成的模板構(gòu)建知識庫和如何利用構(gòu)建的知識庫完成對話幾個(gè)方面詳細(xì)介紹。理論基礎(chǔ)本節(jié)介紹了本文提出的構(gòu)建方法是如何產(chǎn)生以及構(gòu)建方法的詳細(xì)思路。方法的形成對話知識庫中的知識和具體問題是存在強(qiáng)關(guān)聯(lián)的,通常是知識庫中的每一條知識對應(yīng)一個(gè)特定的問題。傳統(tǒng)的手工構(gòu)建知識庫方法就是人們利用自己已經(jīng)學(xué)到問題--答案知識,將每一個(gè)問題對應(yīng)的答案按一定的格式手動(dòng)輸入計(jì)算機(jī),所有這類格式的答案集合形成了一個(gè)對話知識庫。受手工知識庫構(gòu)建方法的啟示,半自動(dòng)或自動(dòng)對話知識庫構(gòu)建方法事先對可能要問的每一類問題設(shè)計(jì)一種具體的模板或算法。然后利用這些模板去語料庫搜尋符合這些模板的語料信息,最后利用這些匹配到的語料信息來建立對話知識庫。半自動(dòng)或自動(dòng)對話知識庫構(gòu)建方法有一個(gè)比較明顯的弊端,那就是對于每一類問題都要事先人工給出模板,然后計(jì)算機(jī)才能依靠這個(gè)模板去建立知識庫。從這個(gè)弊端入手,我們希望能找出一種方法,讓計(jì)算機(jī)自己嘗試找出問題和答案的模板,然后再利用這個(gè)計(jì)算機(jī)自己找出的答案模板嘗試生成這類問題的答案知識庫。當(dāng)下次再遇到這類問題時(shí),計(jì)算機(jī)能用同樣的策略識別這類問題,并且嘗試從已經(jīng)構(gòu)建的對應(yīng)答案知識庫中找到這個(gè)問題的答案?,F(xiàn)在核心任務(wù)就是計(jì)算機(jī)要嘗試學(xué)會(huì)自動(dòng)建立不同問題和答案的模板。圍繞著核心問題,我們考慮從人們認(rèn)識事物的角度去尋找方法。人們認(rèn)識某一類事物,總是從某一個(gè)具體的事物開始,然后把這個(gè)具體的事物進(jìn)行抽象,提取這個(gè)事物的本質(zhì)特征。最后用這些特征去匹配新出現(xiàn)的事物,當(dāng)這個(gè)新事物符合這些特征時(shí),我們就認(rèn)為它們同屬于一類事物?;谌藗冋J(rèn)識同類事物的方式,我們考慮是否將這種過程用到對話知識庫的構(gòu)建上。方法思路結(jié)合對話知識庫特點(diǎn)和人們學(xué)習(xí)新事物過程,我們不難發(fā)現(xiàn)這種學(xué)習(xí)過程可以運(yùn)用到對話知識庫的構(gòu)建上。因?yàn)椋瑢υ掃^程中的被問及的問題也是存在這種由具體問題抽象到某類問題的現(xiàn)象;由某個(gè)具體問題的回答方式抽象到某類問題的回答方式。這種抽象可以是一種建立在句子詞性相同的基礎(chǔ)上。方法可行性分析要計(jì)算機(jī)利用語句的詞性嘗試自動(dòng)完成模板生成和利用生成的模板構(gòu)建知識庫,有以下四個(gè)核心任務(wù)要處理。要自動(dòng)對輸入的問題、答案,語料庫中的語句進(jìn)行詞性標(biāo)注。要從已經(jīng)進(jìn)行詞性標(biāo)注的給定問題和答案中提取出問題和答案的一般特征,進(jìn)而形成類的概念。在提取一般特征的同時(shí),還必須找出這個(gè)給定的問題和答案具體是如何關(guān)聯(lián)在一起的,即為什么這個(gè)答案對應(yīng)這個(gè)問題,這樣才能對這一類問題中每個(gè)具體的問題找到對應(yīng)的具體答案。要利用生成的答案模板在語料庫中匹配所有符合這個(gè)模板的語句,并將符合答案模板的這些語句段截取出來。最后還要考慮如何組織第三點(diǎn)中提取出來的語句段,以便下次針對同類問題,在其中檢索答案。針對以上四點(diǎn)核心任務(wù),可以采取以下措施完成。就詞性標(biāo)注而言,目前詞性標(biāo)注在自然語言處理中已經(jīng)得到了很好的解決,有很多開源的工具可以直接使用,并且這些開源工具在詞性標(biāo)注方面準(zhǔn)確率幾乎都在95%以上。利用這些分詞工具可以完成詞性標(biāo)注任務(wù)。針對給定問題和答案中特征提取,特征太少時(shí)無法準(zhǔn)確描述這類問題和答案的共性,特征提取的太多,又失去了對它們的一般性概括。從一般的問題入手,我們可以發(fā)現(xiàn)同類問題它們語句包含的關(guān)鍵詞的詞性是相同的,比如問地點(diǎn)的問題“小明剛才去哪兒了?”,其中的關(guān)鍵詞應(yīng)該是[小明,剛才,去,哪兒]它們的詞性為[人名,時(shí)間,動(dòng)詞,代詞]。同屬這一類問地點(diǎn)的所有問題,其中的具體成分可以被更換,但詞性幾乎不會(huì)改變。至于輔助詞“了”和標(biāo)點(diǎn)符號“?”這些成分可以被更換或省略。因此我們可以忽略句子中的虛詞,采用句子中實(shí)詞的詞性作為模板的成分。而具體的問題和答案關(guān)聯(lián)則可采用問題和答案中相同成分作為特征的策略。從已經(jīng)進(jìn)行標(biāo)注的語料庫中選取符合答案模板的語句并截取出來,這個(gè)任務(wù)可以通過將答案模板和語料庫中語句的詞性模板視為串,然后采用串匹配策略完成檢索與截取。最后,我們對符合答案模板語句的整體組織可以采用XML格式。XML這種標(biāo)簽語言帶有很強(qiáng)的描述性,可以使得生成的對話知識庫結(jié)構(gòu)化。同時(shí)XML格式的數(shù)據(jù)可以在不同的平臺間傳輸,做到知識庫一次生成,跨平臺多次使用的效果;另一方面,也是因?yàn)榛赪3C標(biāo)準(zhǔn)的XPath文檔查詢語言可以快速地選出需要的節(jié)點(diǎn),避免了對整個(gè)文檔的檢索,縮短了在知識庫檢索目標(biāo)答案時(shí)間。從以上幾個(gè)方面分析,我們可以得出基于模板生成的面向機(jī)器人學(xué)習(xí)的對話知識庫構(gòu)建方法在理論上是可行的。語句模板生成要計(jì)算機(jī)嘗試完成問題和答案模板的自動(dòng)生成,首先要考慮如何對問題和答案進(jìn)行抽象。不管是問題還是答案,它們都是語句。既然是句子,那么句子中每個(gè)詞都一定的詞性,我們可以從詞性出發(fā),利用每個(gè)詞的詞性來對這句話進(jìn)行抽象。詞性標(biāo)注集簡介詞性標(biāo)注就是給每個(gè)詞一個(gè)類別信息,它是對詞本身的一種抽象描述。要對漢語進(jìn)行分詞,首先要制定一套標(biāo)準(zhǔn)的詞性標(biāo)注集。漢語詞性標(biāo)簽集不僅可以用于漢語分詞,也是進(jìn)行詞法分析、句法分析和漢英機(jī)器翻譯系統(tǒng)的重要元素。不同的分詞工具采用詞性標(biāo)注集略有差異,當(dāng)前分詞系統(tǒng)主要用的詞性標(biāo)注集有ICTCLAS2008漢語詞性標(biāo)注集[6],以及該標(biāo)注集的擴(kuò)充版本ANSJ詞性標(biāo)注集,其余詞性標(biāo)注集還包括中文樹庫(ChineseTreeBank)標(biāo)注集、863詞性標(biāo)注集。具體采用哪一個(gè)標(biāo)準(zhǔn)的詞性標(biāo)注集并不影響具體的句子模板生成,本文中后續(xù)系統(tǒng)的實(shí)現(xiàn)采用了LTP((LanguageTechnologyPlatform)平臺[7]的分詞功能,因此,詞性標(biāo)注集選用863詞性標(biāo)注集。表2.1是LTP平臺采用的863詞性標(biāo)注集符號的詳細(xì)說明。采用了一定標(biāo)準(zhǔn)的詞性標(biāo)注集對句子中每個(gè)詞進(jìn)行標(biāo)注后,下一步我們就可以利用這些詞性標(biāo)注信息形成模板來描述句子的特征。語句特征選取特征提取的好壞決定了歸納的問題類是否能夠包含該類所有的問題,同時(shí)也決定了答案模板能否在語料庫中找到所有這類問題的答案。對給定問題和答案進(jìn)行特征提取,特征太少時(shí)無法準(zhǔn)確描述這類問題和答案的共性,這可能導(dǎo)致將不是同類的問題也歸納到這一類問題中;特征提取的太多,又失去了對它們的一般性概括,從而會(huì)導(dǎo)致生成的模板規(guī)則太強(qiáng),在語料庫中匹配不到有用的語句。為了選取有效的特征,從一般的問題入手,我們可以發(fā)現(xiàn)同類問題它們語句包含的關(guān)鍵詞的詞性是相同的,比如問地點(diǎn)的問題“張明剛才去哪兒了?”,其中的關(guān)鍵詞應(yīng)該是[張明,剛才,去,哪兒]這幾個(gè)有意義的實(shí)詞,它們對應(yīng)表1.1中的詞性標(biāo)注符號生成的模板向量為[nh,nt,v,r]。同屬這一類問地點(diǎn)的所有問題,其中的關(guān)鍵詞的具體成分可以被更換,比如關(guān)鍵詞換為[李剛,上個(gè)月,去,哪里]。這些關(guān)鍵詞構(gòu)成的問題可能為“李剛上個(gè)月去哪里啦?”,不難發(fā)現(xiàn)這兩個(gè)問題是屬于同一類問地點(diǎn)的問題。第二個(gè)問題中包含的關(guān)鍵詞詞性沒有改變,至于無意義的輔助詞“了”和標(biāo)點(diǎn)符號“?”這些成分可以被更換或省略,如上面第二個(gè)問地點(diǎn)的問題中,可以將“了”換成“啦”或者不用這種語氣助詞。這種助詞在問句中并沒有提供實(shí)際的意義,只是起到使語句通順的效果,因此他們不能成為特征。由上述我們可以得出結(jié)論,模板中的特征應(yīng)該選用句子有意義的實(shí)詞詞性標(biāo)簽,我們將這種有意義的實(shí)詞定義為該句中的關(guān)鍵詞,同時(shí)要忽略句子中無意義的虛詞詞性標(biāo)簽。對于“張明剛才去哪兒了?”這個(gè)問題我們得到這類問地點(diǎn)的問題模板向量為[nh,nv,v,r]。我們假設(shè)表1.1中的詞性標(biāo)注集中所有的詞性標(biāo)簽為S,我們選擇集合I中詞性標(biāo)簽為要忽略的虛詞標(biāo)簽元素,則特征詞性標(biāo)注集F的中表記元素為S與I的差集。即: 公式(2-1)其中S為詞性標(biāo)注集中所有標(biāo)簽,I=(c,e,g,h,o,p,u,wp,x)。表2.1LTP詞性標(biāo)注集各標(biāo)簽含義標(biāo)簽符號描述例子標(biāo)簽符號描述例子a形容詞漂亮ni組織名稱紅十字基金會(huì)b其他名詞修飾符大型nl位置郊區(qū)c連詞和ns地名成都d副詞非常nt時(shí)間昨天e嘆詞唉nz其他專有名詞圖靈獎(jiǎng)g詞素甥o擬聲詞啪嘰h前綴阿p介詞在i習(xí)語百花齊放q量詞一個(gè)j縮寫詞公檢法r代詞我k后綴率u輔助詞的m數(shù)字100v動(dòng)詞去n一般名詞桃子wp標(biāo)點(diǎn)符號。,nd方位名詞左側(cè)ws外文詞GPAnh人名張三x非詞法符號萄提取問題與答案關(guān)聯(lián)特征上一節(jié)中,嘗試性給出了如何對給定的[問題,答案]實(shí)例進(jìn)行抽象,提取模板,進(jìn)而歸納出這一類問題的答案所共有的特征。但是對答案模板匹配到的語句,我們只知道這是用來回答某一類問題的語料信息,我們還不知道這個(gè)句子究竟是用來回答哪一個(gè)具體問題的。比如對于問地點(diǎn)的問題“張明昨天去哪兒了?”,語料庫含有許多回答地點(diǎn)的語句,“張明昨天去北京了”,“張明今天回學(xué)校了”,“李剛昨天去成都”等。我們必須采取一種策略判定出“張明昨天去北京了”這個(gè)句子是問題對應(yīng)的答案語料。我們知道對話知識庫每一個(gè)答案都是對應(yīng)一個(gè)問題的(不包括像“好啊”,“我不知道”等這種無效回答),并且這種問題和答案的對應(yīng)關(guān)系是一一強(qiáng)對應(yīng)的。觀察上面的問題“張明昨天去哪兒了”和對應(yīng)答案“張明昨天去北京了”,我不難發(fā)現(xiàn)在這個(gè)問題和答案中,他們的具體關(guān)聯(lián)表現(xiàn)在[nh,nt,v]模板向量對應(yīng)的具體詞相同。更一般的,我們能不能把這種問題和答案中的一致性作為問題和答案的關(guān)聯(lián)關(guān)系呢?事實(shí)上,對于基于事實(shí)、非推理性的問題,這種關(guān)聯(lián)是可以的。因?yàn)椋谑聦?shí)的事件,包括時(shí)間、地點(diǎn)、人物、事件的內(nèi)容等一系列事件要素,對這些事件進(jìn)行提問時(shí),必須要指明事件中的一些或全部要素才能完全確定問題要問的對應(yīng)事件。基于以上理論我們可以采取將問題和答案中相同關(guān)鍵詞生成的向量作為具體問題和具體答案關(guān)聯(lián)的特征向量。例如對于上述問地點(diǎn)的問題,它的具體問題與答案的關(guān)聯(lián)特征向量為[nh,nt,v]。下次當(dāng)再次有這類問地點(diǎn)的問題時(shí),我們就可以根據(jù)這個(gè)關(guān)聯(lián)特征向量去嘗試性檢索這個(gè)問題的具體答案。生成對話知識庫到目前為止,我們已經(jīng)找到方法對語句進(jìn)行詞性標(biāo)簽,提取問題模板向量、答案模板向量、具體問題和答案關(guān)聯(lián)特征向量。接下來要解決的就是如何用這些得到的信息構(gòu)建得到對話知識庫。知識庫存儲(chǔ)方式基于我們構(gòu)建的對話知識庫是提供給對話機(jī)器人完成對話的目的,我們設(shè)計(jì)的對話知識庫首先應(yīng)該是結(jié)構(gòu)化、便于檢索的。同時(shí)知識庫還應(yīng)該是自描述、易擴(kuò)展的,即生成的知識庫可以脫離知識庫生成程序后進(jìn)行自解釋,當(dāng)生成好的知識庫遇到新的語料信息時(shí),可以依靠知識庫中的自我結(jié)構(gòu)描述信息進(jìn)行擴(kuò)充。根據(jù)以上的幾點(diǎn)對知識庫的要求,我們可以選擇XML這種擴(kuò)展標(biāo)簽語言。首先XML作為標(biāo)簽語言,它可以對文本中的信息添加一系列的標(biāo)簽從而使無結(jié)構(gòu)的數(shù)據(jù)成為半結(jié)構(gòu)化或結(jié)構(gòu)化的數(shù)據(jù)。其次XML標(biāo)簽語言給用戶提供很大的自由性,用戶可以自定義標(biāo)簽,為不同的信息添加不同的描述結(jié)點(diǎn),從而可以達(dá)到知識庫自描述的特點(diǎn)。再次,基于W3C標(biāo)準(zhǔn)的XPath文檔查詢語言可以快速地選出需要的節(jié)點(diǎn),避免了對整個(gè)文檔的檢索,縮短了在知識庫檢索目標(biāo)答案時(shí)間。最后,XML格式的數(shù)據(jù)可以在不同的平臺間傳輸,做到知識庫一次生成,跨平臺多次使用的效果。知識庫存儲(chǔ)結(jié)構(gòu)確定了如何結(jié)構(gòu)化的存儲(chǔ)知識庫后,接下來要做的就是設(shè)計(jì)一套XML節(jié)點(diǎn)標(biāo)簽,用來描述對話知識庫中,每條知識的想詳細(xì)信息。本文設(shè)計(jì)的XML節(jié)點(diǎn)標(biāo)簽有以下4種:knowledgeBase、knowledge、answerDetail和answer。它們各自描述信息如下:KnowledgeBase為根節(jié)點(diǎn),不帶有屬性;Knowledge為一類問題對應(yīng)的所有答案節(jié)點(diǎn),具有的以下五個(gè)屬性,分別為:questionPattern,questionFeature,answerPattern,answerFeature,exactAnswer。其中,questionPattern屬性值指出了這一類問題的模板向量;questionFeature屬性值為數(shù)字索引,它指出應(yīng)從questionPattern中選擇哪幾個(gè)位置的詞性標(biāo)注對應(yīng)的詞來區(qū)分屬于這類問題中不同的具體問題;answerPattern屬性值指明了這一類問題的答案語句在語料庫中應(yīng)該有的模式;answerFeature屬性值為數(shù)字索引,它指出answerPattern中哪些位置對應(yīng)的詞性標(biāo)注用來區(qū)分不同問題對應(yīng)的具體答案;exactAnswer屬性值為數(shù)字索引,它指出在答案模板中應(yīng)該抽取哪些位置詞性標(biāo)注對應(yīng)的詞作為問題的準(zhǔn)確答案。AnswerDetail為符合answerPattern的一條目標(biāo)語句信息結(jié)點(diǎn),它具有的屬性為answerFeature指出的詞性標(biāo)簽集合,屬性值為目標(biāo)語句對應(yīng)answerFeature指出的詞性位置上對應(yīng)的那個(gè)詞。同時(shí),answerDetail結(jié)點(diǎn)還具有子節(jié)點(diǎn)answer。answer結(jié)點(diǎn)標(biāo)簽每個(gè)問題對應(yīng)的具體答案,它的值來自于exactAnswer屬性值指出的具體詞。以上questionPattern和answerPattern屬性對應(yīng)的值分別來自于我們在2.2.2節(jié)中從問題和答案中抽取的模板。questionFeature和answerFeature則來自于2.3節(jié)中問題和答案關(guān)聯(lián)特征詞項(xiàng)在問題和答案中的索引集合。下面就對給定的[“張明剛才去哪兒了?”,“張明剛才去廁所了”]這個(gè)問題答案對進(jìn)行詳細(xì)說明各結(jié)點(diǎn)的含義。對于這個(gè)給定的實(shí)例,對應(yīng)生成的知識庫如下(生成過程見下節(jié))。<?xml
version="1.0"?>
<knowledgeBase>
<knowledge
questionPattern="nh
nt
v
r
"
questionFearture="0
1
2"
aswerPatern="nh
nt
v
n
"
answerFeature="0
1
2"
exactAnswerPosition="3">
<answerDetail
nh="張明"
nt="剛才"
v="去">
<answer>廁所</answer>
</answerDetail>
</knowledgeBase>
首先knowledgeBase結(jié)點(diǎn)表示這個(gè)知識庫的根結(jié)點(diǎn)。其下可以含有許多名為knowledge的子結(jié)點(diǎn)。Knowledge結(jié)點(diǎn)表示一類問題的對應(yīng)的知識庫。在[“張明剛才去哪兒了?”,“張明剛才去廁所了”]例子中,利用2.2.2節(jié)中模板生成方法,我們可以得到問題和答案模板向量為分別為[nh,nt,v,r],[nh,nt,v,n]。則questionPattern屬性的值為[nh,nt,v,r];answerPatter屬性值為[nh,nt,v,n]。利用2.3節(jié)中問題和答案關(guān)聯(lián)特征提取方法,我們可以得到這個(gè)問題和答案關(guān)聯(lián)模板向量為[nh,nt,v],他們在問題模板向量中的索引為[0,1,2],在答案模板向量中的索引也是[0,1,2]。因此,questionFeature屬性值為“0,1,2”,answerFeature屬性值“0,1,2”。對于exactAnswer屬性而言,它需要額外的信息,因?yàn)閺纳厦嬗脩艚o的例子中無法自動(dòng)學(xué)習(xí)出“廁所”就是準(zhǔn)確答案。這個(gè)額外信息的來源由系統(tǒng)向用戶發(fā)出請求,當(dāng)用戶手動(dòng)額外輸入“廁所”一詞時(shí),系統(tǒng)就將這個(gè)詞在答案中的位置提取出來,并進(jìn)一步的在答案模板中找到這個(gè)詞的位置。這里“廁所”答案模板[nh,nt,v,n]中對應(yīng)n代表的詞,故索引號為3。answerDetail結(jié)點(diǎn)對應(yīng)一條符合answerPattern模板的語句詳細(xì)信息,這里符合answerPattern的語句是“張明剛才去廁所了?!薄_@個(gè)結(jié)點(diǎn)的屬性來自于其父節(jié)點(diǎn)knowledge的answerFeature屬性值指出的詞性標(biāo)注。上面answerFeature屬性值“0,1,2”指出了要選用answerPattern中的[nh,nt,v]作為屬性,屬性值為[nh,nt,v]對應(yīng)的具體詞[張明,剛才,去]。知識庫生成過程上一節(jié)介紹了本文要使用的知識庫存儲(chǔ)結(jié)構(gòu),本節(jié)將介紹如何利用學(xué)到的模板信息和關(guān)聯(lián)特征信息來建立對話知識庫。建立對話知識庫的詳細(xì)過程如下:對用戶輸入的[問題,答案]分別生成模板向量Pquestion和Panswer。對用戶輸入的[問題,答案]和生成的模板向量[Pquestion,Panswer],并從中提取關(guān)聯(lián)特征索引向量Iquestion,Ianswer。系統(tǒng)向用戶發(fā)出請求,請求用戶輸入答案中的準(zhǔn)確詞項(xiàng),并將這些輸入詞項(xiàng)在答案模板中對應(yīng)的位置Iexact保存下來。建立knowledge結(jié)點(diǎn),利用1),2),3)中生成的信息填充knowledge結(jié)點(diǎn)。對語料庫中每一句話進(jìn)行詞性標(biāo)注,并生成該句的模板向量Pi。如果模板向量,則將Pi對應(yīng)Panswer部分的句子Si截取出來。這里符號是指Panswer對應(yīng)的串是Pi的一個(gè)子串。對句子Si建立一個(gè)answerDetail結(jié)點(diǎn),該結(jié)點(diǎn)的屬性用Panswer和Ianswer指出的詞性標(biāo)簽名填寫,屬性值這些詞性標(biāo)簽對應(yīng)的值填寫。根據(jù)Iexact和Panswer指出詞性標(biāo)簽對應(yīng)的詞添加answer子節(jié)點(diǎn)。將根據(jù)Si建立的answerDetail結(jié)點(diǎn)添加到4)中的knowledge結(jié)點(diǎn)下。知識庫更新過程對于已經(jīng)構(gòu)建完成的知識庫,在大部分的情況下我們只是對其進(jìn)行查詢操作,即從中找出我們需要的答案。但有時(shí)隨著語料庫的更新,我們也需要更新我們的知識庫。因?yàn)?.4.2節(jié)中定義的知識庫存儲(chǔ)結(jié)構(gòu)是自描述的,各結(jié)點(diǎn)信息中詳細(xì)的給出了每類問題對應(yīng)的答案所具有的模板和細(xì)節(jié)特征,利用這些信息可以很容易的對這個(gè)知識庫進(jìn)行更新。更新對話知識庫的過程如下:對新增加的語料庫,將語料庫中每一句話進(jìn)行詞性標(biāo)注,并生成該句子的模板向量Pi。遍歷知識庫中每個(gè)knowledge結(jié)點(diǎn),獲取到這個(gè)結(jié)點(diǎn)的答案模板向量Panswer,如果,則將Pi對應(yīng)Panswer部分的句子Si截取出來。這里符號同上一節(jié)的6)步驟中含義相同。對提取的句子Si建立一個(gè)answerDetail結(jié)點(diǎn),該結(jié)點(diǎn)的屬性用knowledge結(jié)點(diǎn)中的answerPattern和answerFeature屬性指出的詞性標(biāo)簽名填寫,屬性值用這些詞性標(biāo)簽對應(yīng)的值填寫。根據(jù)knowledge結(jié)點(diǎn)的exactAnswer屬性指出詞性標(biāo)簽對應(yīng)的詞添加answer子節(jié)點(diǎn)。將根據(jù)Si建立的answerDetail結(jié)點(diǎn)添加到這個(gè)knowledge結(jié)點(diǎn)下。本章小結(jié)本章完整介紹本文提出的對話知識庫構(gòu)建方法。首先講述了這個(gè)方法是如何產(chǎn)生的,其次分析了這個(gè)方法構(gòu)建對話庫的可行性,得出了利用該方法建立基于事實(shí)性對話知識庫的理論可行。接下來提出了句子模板生成、具體問題和對應(yīng)答案關(guān)聯(lián)特征提取的方法。最后詳細(xì)地描述了如何利用生成的模板和提取到的特征從語料庫中建立和更新對話知識庫。知識庫構(gòu)建系統(tǒng)本章將要描述一個(gè)面向機(jī)器人學(xué)習(xí)的對話知識庫構(gòu)建系統(tǒng)IdiotTalker。該系統(tǒng)基于第二章中提出的知識庫構(gòu)建方法,它能利用語料庫完成對話知識庫的構(gòu)建,并且利用構(gòu)建的對話知識庫進(jìn)行簡單對話。系統(tǒng)需求分析利用上面提出的對話知識庫構(gòu)建方法,我們希望能夠設(shè)計(jì)出一個(gè)系統(tǒng),該系統(tǒng)與人的交互過程如下:對用戶首次輸入的對話問題,系統(tǒng)給出“這個(gè)問題我不懂,你能教我嗎”響應(yīng),然后請求用戶給出該對話問題的回答答案。用戶給出這個(gè)問題的答案,并指出這個(gè)答案中包含的精確答案。系統(tǒng)利用用戶給的這個(gè)[問題,答案,精確答案],嘗試從中生成問題模板和答案模板,達(dá)到從一個(gè)具體的問題到該類問題的認(rèn)知效果。系統(tǒng)用學(xué)會(huì)到的答案模板在語料庫中去檢索所有符合這個(gè)模板的語句,并采用異步方式,將這些語句組織成這類問題的答案知識庫。這類問題的答案知識庫構(gòu)建完畢后,向用戶給出響應(yīng)信息“我懂了,謝謝”。當(dāng)下次再遇到這類問題時(shí),系統(tǒng)采用異步方式,嘗試從知識庫中檢索這類問題的答案,并將答案呈現(xiàn)給用戶。系統(tǒng)可行性分析在上一章2.1.3節(jié)中論述了構(gòu)建方法的理論可行性,從理論上證明了基于模板自動(dòng)生成的方法可以用來構(gòu)建基于事實(shí)的對話知識庫。下面將分析該方法構(gòu)建對話知識庫的實(shí)際可行性。如2.4節(jié)中給出的對話知識庫生成過程,我們可以得出完成基于模板生成的對話知識庫構(gòu)建系統(tǒng),主要內(nèi)容包括以下四個(gè)方面:收集含有事實(shí)性內(nèi)容的語料庫;完成語料庫中句子的詞性標(biāo)注;將生成好的對話知識庫以XML語言格式寫入磁盤;檢索和更新基于XML格式的知識庫。關(guān)于事實(shí)性內(nèi)容的語料庫可以通過多種方法獲取,可以手工從網(wǎng)上摘取一個(gè)小型的語料庫用來研究系統(tǒng)的效果,也可以直接利用別人已經(jīng)收集好的語料庫。本系統(tǒng)中為了驗(yàn)證前面的提出的方法的可行性,因此,自己手工在網(wǎng)上收集了一些事實(shí)性的語料。對于詞性標(biāo)注這一部分的工作,目前許多分詞工具可以完成對句子詞性的標(biāo)注。常用的有百度員工fxsjy的jieba分詞、哈工大社會(huì)計(jì)算與信息檢索研究中心的LTP、中科院的ICTCLAS、清華大學(xué)自然語言處理與社會(huì)人文計(jì)算實(shí)驗(yàn)室的THULAC、FudanNaturalLanguageProcessingGroup的FudanNLP和斯坦福的CoreNLP。綜合考慮以上各種工具的可獲得性和使用復(fù)雜程度,本系統(tǒng)決定采用哈工大社會(huì)計(jì)算與信息檢索研究中心的LTP為所有的句子進(jìn)行詞性標(biāo)注[7]。上面3)和4)任務(wù)的主要內(nèi)容都是操作XML文件,W3C制定了XML語言的格式規(guī)格,各種編程語言也都有對XML操作語言的支持,因此這兩項(xiàng)任務(wù)也能通過學(xué)習(xí)具體編程語言如何操作XML文件得到解決。綜合上述分析,基于模板生成的面向機(jī)器人學(xué)習(xí)的對話知識庫在實(shí)際上也是可行的。系統(tǒng)結(jié)構(gòu)由3.1節(jié)中得出的基于模板生成的面向機(jī)器人學(xué)習(xí)的對話知識庫構(gòu)建方法在實(shí)際編碼實(shí)現(xiàn)上可行,故可以設(shè)計(jì)一套系統(tǒng)來生成和利用對話知識庫。本文中設(shè)計(jì)一個(gè)名為IdiotTalker的系統(tǒng),IdoitTalker系統(tǒng)從整體上分為三層4大模塊,分別是最頂層的人機(jī)交互層,對話知識庫管理中間層和最底層的數(shù)據(jù)表示層。它的系統(tǒng)結(jié)構(gòu)如圖3.1所示。圖3.1中最頂層的人機(jī)交互層由具體的人機(jī)交互模塊完成,其主要功能就接收用戶的輸入信息和向用戶展示系統(tǒng)處理的結(jié)果信息。中間層的對話知識庫管理層由對話知識庫管理模塊完成,該模塊又進(jìn)一步分為3個(gè)子模塊,分別是圖3.1中間層中最左邊的對話知識庫生成子模塊,中間的詞性標(biāo)簽?zāi)K和最右邊的對話知識庫檢索模塊。各模塊的具體功能見后面系統(tǒng)具體編碼實(shí)現(xiàn)章節(jié)。IdiotTalker系統(tǒng)IdiotTalker系統(tǒng)人機(jī)交互模塊人機(jī)交互模塊語句模板生成模塊詞性標(biāo)注語句模板生成模塊詞性標(biāo)注模塊對話知識庫檢索模塊關(guān)聯(lián)特征提取模塊關(guān)聯(lián)特征提取模塊知識庫創(chuàng)建模塊知識庫創(chuàng)建模塊知識庫更新模塊知識庫更新模塊對話知識庫語料庫對話知識庫語料庫圖3.1IdiotTalker系統(tǒng)結(jié)構(gòu)使用工具介紹工欲善其事必先利其器。在具體的編碼開始前,必須要先決定在什么樣的平臺下開發(fā)和使用何種語言開發(fā)。雖然前面分別論證了基于模板生成的面向機(jī)器人學(xué)習(xí)的對話知識庫構(gòu)建方法在理論和實(shí)際上是可行的。但是具體采用什么樣的編程語言和使用何種平臺對開發(fā)的效率還是有很大影響。本系統(tǒng)中主要借助的外部工具為詞性標(biāo)注工具,綜合考察了各種詞性標(biāo)注工具,本系統(tǒng)決定采用哈工大社會(huì)計(jì)算與信息檢索研究中心的LTP為所有的句子進(jìn)行詞性標(biāo)注。因?yàn)長TP平臺提供的詞性標(biāo)注工具不需要自己配置環(huán)境,可直接通過http請求完成。這就使得后續(xù)的開發(fā)語言和開發(fā)平臺不受限制,只要是支持http協(xié)議的編程語言和平臺都可以選擇。因自己平時(shí)使用Windows平臺的情況多,對Windows平臺的操作更加熟悉,故本次系統(tǒng)的開發(fā)在Windows8.1下進(jìn)行。最后是編程語言的選擇,因?yàn)橄到y(tǒng)生成的對話知識庫是以XML格式存儲(chǔ)的,綜合比較了C++、java和C#三種編程語言,結(jié)合它們對XML數(shù)據(jù)操作的方便性和自己的熟悉情況,最終決定采用C#這門編程語言。Microsoft在正式場合把C#描述為一種簡單、現(xiàn)代、面向?qū)ο蟆㈩愋头浅0踩?、派生自C和C++的編程語言,C#非常類似于C++和Java[8]。C#對http網(wǎng)絡(luò)編程和XML文件處理提供了很好的支持,可以讓我們減少編碼量,從而能更集中精力于對構(gòu)建知識庫方法的實(shí)現(xiàn)。系統(tǒng)編碼實(shí)現(xiàn)選擇好編程語言、開發(fā)平臺和分詞工具后,下一步的任務(wù)就是按照基于3.2節(jié)中給出的系統(tǒng)結(jié)構(gòu),實(shí)現(xiàn)各模塊指定的功能。本系統(tǒng)要實(shí)現(xiàn)的主要功能是中間層對話知識庫管理模塊功能。最底層的數(shù)據(jù)表示,由于語料庫本身只提供語料信息,因此可以直接以文件夾的形式存儲(chǔ)即可。對話知識庫本身也只是結(jié)構(gòu)化地存儲(chǔ)對話內(nèi)容,對它的生成和檢索部分放在對話知識庫管理模塊中。因此,最底層的數(shù)據(jù)表示層不需要有編碼工作。詞性標(biāo)注模塊詞性標(biāo)注模塊是本系統(tǒng)的基礎(chǔ),本系統(tǒng)最主要的思想就是利用句子的詞性對問題和答案進(jìn)行模板生成,故在進(jìn)行詞性模板生成前必須完成詞性標(biāo)注模塊的功能。如3.3節(jié)中介紹,本系統(tǒng)采用LTP(語言云技術(shù)平臺)工具的詞性標(biāo)注。如語言技術(shù)平臺官方網(wǎng)站上介紹的,LTP對個(gè)人研究者及非盈利項(xiàng)目提供源代碼,可免費(fèi)試用該平臺提供的功能。同時(shí)LTP的使用方式也是非常簡單,只需要根據(jù)它提供的WebAPI構(gòu)造相應(yīng)的參數(shù)即可。不過在使用LTP前還得先在其官方網(wǎng)站上申請一個(gè)賬號,用于提供身份驗(yàn)證信息的APK_KEY。具體操作方法可以去LTP官方網(wǎng)站上了解,此處不詳細(xì)介紹。LTP的http接口的構(gòu)造參數(shù)如圖3.2所示。調(diào)用WebAPI接口的方式很多,但在本系統(tǒng)需要把這種調(diào)用封裝成一個(gè)模塊以便后面進(jìn)行復(fù)用,故對此建立一個(gè)名為Parse的類,Parse類的任務(wù)就是完成對句子的詞性標(biāo)注。Parse類的屬性對照圖3.2,分別為HttpUrl表示W(wǎng)ebAPI的地址;Userkey用于身份驗(yàn)證的唯一秘鑰;Pattern可選的分析模式,包括分詞(ws)、詞性標(biāo)注(pos)、命名實(shí)體識別(ner)、依存句法分析(dp)等;Format表示已何種形式返回分析后的結(jié)果。為了便于參數(shù)的填寫,根據(jù)圖3.2每個(gè)屬性的枚舉值,設(shè)置一個(gè)名為HttpParams的參數(shù)類,該類含有2個(gè)子參數(shù)類,分為名為Pattern,F(xiàn)ormat。它們含有一些字符串常量,它們對應(yīng)表中的具體枚舉值。Parse類中最重要的方法是一個(gè)名為Analyze的方法,該方法接收一個(gè)字符串,然后根據(jù)前面的屬性和LTP通信完成Pattern模式指定的分析。圖3.2LTPAPI調(diào)用參數(shù)說明Analyze函數(shù)原型為:publicstringAnalyze(stringtext)。傳入?yún)?shù)text代表要進(jìn)行詞性標(biāo)注的句子;返回值以字符串形式表示。本系統(tǒng)中為了處理的一致性,對Parse的Format參數(shù)采用的是xml,即以xml格式返回詞性標(biāo)注后的句子。Analyze的實(shí)現(xiàn)代碼下:public
string
Analyze(string
text)
{
string
results
=
"";
string
httpParameter
=string.Format("{0}?api_key={1}&text={2}&pattern={3}&format={4}",HttpUrl,UserKey,
text,Pattern,Format);
HttpWebRequest
request
=
WebRequest.Create(httpParameter)
as
HttpWebRequest;
try
{
request.AllowAutoRedirect
=
true;
request.Method
=
"GET";
reuest.ContentType
=
"application/x-www-form-urlencoded"HttpWebResponse
response
=
request.GetResponse()
as
HttpWebResponse;
StreamRaer
resultStream
=
new
StreamReader(response.GetResponseStream(),
Encoding.UTF8);
results=
resultStream.ReadToEnd();
}
catch(Exception
e)
{
Console.WriteLine("Http
Request
Error:
"+e.ToString());
}
return
results;
}下面將描述如何用C#編程語言完成WebAPI的調(diào)用。C#編程語言內(nèi)置了一個(gè)名為HttpWebRequest的類,它是.Net中對Http協(xié)議的具體實(shí)現(xiàn)。該類提供了一個(gè)靜態(tài)類方法Create,接受一個(gè)URL字符串參數(shù)。該方法返回一個(gè)用指定URL參數(shù)創(chuàng)建的HttPWebRequest實(shí)例。獲取到HttpWebRequest實(shí)例后就能用它的成員函數(shù)GetResponse,該方法從構(gòu)建HttpWebRequest中的URL指定的服務(wù)器獲取到分析結(jié)果。GetResponse方法返回值類型為HttpWebResponse,可從這個(gè)類型中將返回的具體分析結(jié)果以流的方式獲取到,然后將這種流用StreamReader包裝成文件流的形式,就可以像文件一樣操作返回的詞性標(biāo)注結(jié)果。下面的XML是調(diào)用LTP平臺進(jìn)行詞性標(biāo)注后的結(jié)果展示。<?xml
version="1.0"
encoding="utf-8"?>
<xml4nlp>
<note
sent="y"
word="y"
pos="y"
ne="n"
parser="n"
semparser="n"
lstmsemparser="n"
wsd="n"
srl="n"
/>
<doc>
<para
id="0">
<sent
id="0"
cont="張明剛才去哪兒了?">
<word
id="0"
cont="張明"
pos="nh"
/>
<word
id="1"
cont="剛才"
pos="nt"
/>
<word
id="2"
cont="去"
pos="v"
/>
<word
id="3"
cont="哪兒"
pos="r"
/>
<word
id="4"
cont="了"
pos="u"
/>
<word
id="5"
cont="?"
pos="wp"
/>
</sent>
</para>
</doc>
</xml4nlp>
LTP詞性標(biāo)注結(jié)果的格式中為每一段話創(chuàng)建一個(gè)para節(jié)點(diǎn),然后為para對應(yīng)段中每句話創(chuàng)建一個(gè)sent節(jié)點(diǎn),最后再為sent節(jié)點(diǎn)中每個(gè)詞用word標(biāo)簽標(biāo)簽,對應(yīng)的pos屬性為該詞的詞性標(biāo)簽,id屬性表明了這個(gè)詞在該句中的位置,cont屬性用于指示這個(gè)詞的內(nèi)容。更多具體的格式表示請參考LTP官方網(wǎng)站的結(jié)果表示詳細(xì)說明。知識庫生成模塊將詞性標(biāo)注部分封裝成模塊后,下一步就就可以利用該模塊對所有的目標(biāo)語句進(jìn)行詞性標(biāo)簽并根據(jù)詞性標(biāo)簽的結(jié)果生成模板。知識庫生成模塊主要包括兩大功能即從無到有生成一個(gè)知識庫和對已有的知識庫利用新語料進(jìn)行更新。這兩大模塊都要共用的功能是語句模板生成、問題和答案關(guān)聯(lián)特征提取、知識庫節(jié)點(diǎn)生成。為了更好的復(fù)用代碼故先實(shí)現(xiàn)這3個(gè)公共函數(shù)。語句模板生成函數(shù)負(fù)責(zé)的主要任務(wù)就是對利用前面2.2.2節(jié)語句特征選取策略完成該語句的的模板生成。由其提供的功能可以設(shè)計(jì)如下的函數(shù)原型:stringGetPattern(stringxmlSeg)。其中參數(shù)xmlSeg是以XML格式表示的句子詞性標(biāo)注結(jié)果,XML格式的詞性標(biāo)注結(jié)果見3.4.1節(jié)中XML結(jié)果表示。該函數(shù)返回結(jié)果為以字符串形式存儲(chǔ)的模板向量,每個(gè)向量分量之間用空格分割??紤]到在實(shí)際生成模板的過程中我們丟棄了很多沒有實(shí)際意義的虛詞,生成的模板向量中,每個(gè)詞性標(biāo)簽符號并不是與原句子中每個(gè)詞的位置一一對應(yīng),因此我們需要添加額外的位置信息,即返回的模板向量中每個(gè)詞性標(biāo)簽前面還有一個(gè)ID,表明了該詞性標(biāo)簽在原句子中對應(yīng)的位置,這個(gè)ID值來自于XML格式詞性標(biāo)注中的id屬性。根據(jù)上面方法的描述,具體的實(shí)現(xiàn)就是首先對XML格式的詞性標(biāo)注結(jié)果中,依次遍歷所有的word結(jié)點(diǎn),然后查看該word節(jié)點(diǎn)的pos屬性值是否在2.2.2節(jié)給出的忽略詞性集I中,如果不是,則將這個(gè)word節(jié)點(diǎn)的id屬性值和pos屬性值添加到返回結(jié)果串的末尾,id和pos之間用逗號分隔。GetPattern的具體實(shí)現(xiàn)代碼如下。
public
string
GetPattern(string
xmlSeg)
{
StringBuilder
sb
=
new
StringBuilder()
;
try
{
XDocument
xdoc
=
XDocument.Parse(xmlSeg);
foreach
(XElement
xele
in
xdoc.Descendants("word"))
{
if
(!_funcitonWord.Contains(xele.Attribute("pos").Value))
sb.AppendFormat("{0},{1}
",
xele.Attribute("id").Value,
xele.Attribute("pos").Value);
}
}
catch
{
StackTrace
st
=
new
StackTrace(new
StackFrame(true));
new
Exception(string.Format("Error
in
{0}
Load
xml
segment",st.ToString()));
}
return
sb.ToString();
}
調(diào)用詞性標(biāo)簽?zāi)K和模板生成函數(shù)后我們能夠得到問題、答案和語料庫中句子的模板向量。現(xiàn)在系統(tǒng)已經(jīng)能從具體的句子抽象到“類”的層次了,但是系統(tǒng)還不能將“類”的信息匹配具體的實(shí)例上。所以,下一步的任務(wù)就是具體的[問題,答案]關(guān)聯(lián)特征提取。利用2.3節(jié)中介紹的問題與答案關(guān)聯(lián)特征提取方法,采取的策略就是利用一個(gè)兩重循環(huán),外循環(huán)為問題模板向量中的詞性標(biāo)簽,內(nèi)循環(huán)為答案模板的詞性標(biāo)簽。當(dāng)答案模板中詞性標(biāo)簽和問題模板中的詞性標(biāo)簽相同時(shí),再查看他們對應(yīng)的詞是否也相同,如果相同,則將這個(gè)詞性標(biāo)簽的在問題模板向量和答案模板向量中的位置記錄下來。根據(jù)這個(gè)思路關(guān)聯(lián)特征提取函數(shù)的原型可以設(shè)計(jì)為:List<Tuple<string,string,int,int>>LearnFeatures(stringposQuestionXml,stringposAnswerXml)。參數(shù)posQuestionXml為經(jīng)過詞性標(biāo)注后的問題語句;posAnswerXml為經(jīng)過詞性標(biāo)注后的答案語句。返回值為四元組集合。其中四元組中各項(xiàng)的含義為:第一項(xiàng)為詞性標(biāo)簽,第二項(xiàng)為該詞性標(biāo)簽在句子對應(yīng)的具體詞,第三項(xiàng)為該詞性標(biāo)簽在問題語句中的索引,第四項(xiàng)為該詞性標(biāo)簽在答案語句中的索引。下一步就是利用學(xué)到的答案模板去語料中找符合該模板的語句,然后將符合模板的部分截取出來,再利用學(xué)到的問題和答案關(guān)聯(lián)特征去整理這些語句。這一步中的難點(diǎn)主要集中于在詞性標(biāo)注后的語句中找到和答案模板相匹配的部分并把他們截取出來。為了是問題簡單化,這里把詞性模板向量去掉ID部分,只保留詞性標(biāo)簽部分。這樣就可以利用串匹配方法在語句模板向量中檢索答案模板向量子串。當(dāng)查到句子模板向量中含有答案模板向量時(shí),我們再講句子中對應(yīng)答案模板向量中詞性標(biāo)簽的的這些位置提取出來,方便下一步處理這些位置的具體詞。函數(shù)原型如下:string[]LocateAnswerPattern(stringposSenXml,stringanswerPattern)。參數(shù)PosSenXml為語料庫中經(jīng)過詞性標(biāo)注后的一句話;answerPattern為消除ID屬性后的答案模板向量;返回值為字符串?dāng)?shù)組,每個(gè)字符串包含ID和詞性標(biāo)簽兩種信息,這兩種信息描述了該句中哪些位置的詞性標(biāo)簽對應(yīng)答案模板向量的詞項(xiàng)標(biāo)簽。最后一步就是整理這些符合答案模板向量的句子,然后將它們寫入知識庫。在寫入之前首先要將每條語句進(jìn)行整理,轉(zhuǎn)變?yōu)閄ML結(jié)點(diǎn)。FillDetailNode函數(shù)用來處理將整理好的句子轉(zhuǎn)變?yōu)閄ML結(jié)點(diǎn)。它將一條整理好后的語句轉(zhuǎn)變?yōu)橐粋€(gè)answerDetail節(jié)點(diǎn)。循環(huán)調(diào)用它,就可以對一類問題的所有語料信息轉(zhuǎn)變answerDetail結(jié)點(diǎn)。FillDetailNode函數(shù)原型如下:XmlElementFillDetailNode(XmlDocumentxdoc,List<Tuple<string,string>>attributes,stringexactAnswer)。參數(shù)xdoc是因?yàn)镃#要子節(jié)點(diǎn)和父節(jié)點(diǎn)必須出自相同的上下文,因此xdoc表示了知識庫的文檔節(jié)點(diǎn);attributes表示了answerDetail節(jié)點(diǎn)的所有屬性集合;exactAnswer是answerDetail子節(jié)點(diǎn)answer的具體內(nèi)容。Attributes集合中每個(gè)元組的第一項(xiàng)為屬性名,第二項(xiàng)為具體的詞,這些屬性值根據(jù)問題--答案關(guān)聯(lián)特征和語料庫中句子的具體詞得到。FillDetailNode函數(shù)已經(jīng)完成,現(xiàn)在只需要對每一類的問題,生成答案模板向量,然后利用模板向量去語料庫中抓取所有符合這個(gè)模板的語料,整理這些語料。下面用AddNewPattern函數(shù)來處理這些任務(wù)。AddNewPattern的任務(wù)就是調(diào)用前面已經(jīng)寫好的函數(shù),然后由新來的[問題,答案]利用語料庫生成這一類問題的對話知識庫庫。AddNewPattern函數(shù)主要代碼實(shí)現(xiàn)如下:public
int
AddNewPattern(FileInfo
file,
string
questionPOS,string
answerPOS,string
exactAnswerPOS)
{
XmlDocument
xdoc=new
XmlDocument();
xdoc.Load(_knowledgeBasePath);
//獲取模板并消除模板中的ID信息
string
questionPattern=EliminatePatternID(GetPattern(questionPOS));
string
answerPattern=EliminatePatternID(GetPattern(answerPOS));
string
exactAnswerPattern=EliminatePatternID(GetPattern(exactAnswerPOS));
//獲取問題和答案關(guān)聯(lián)特征
List<Tuple<string,
string,
int,
int>>
features
=
LearnFeatures(questionPOS,answerPOS);
StringBuilder
sb
=
new
StringBuilder();
//準(zhǔn)備knowledge節(jié)點(diǎn)的屬性信息
int[]
answerFeatureIndexes
=
new
int[features.Count];
for(int
i=0;i<features.Count;i++)
{
sb.Append(features[i].Item3.ToString()+"
");
answerFeatureIndexes[i]
=
features[i].Item4;
}
string
quesFeatureIndexes
=
sb.ToString();
int[]
exactAnswerIndexes
=
ExactAnswerPos(answerPOS,
exactAnswerPOS);
//填充knowledge節(jié)點(diǎn)屬性
XmlElement
xele
=
xdoc.CreateElement("knowledge");
xele.SetAttribute("questionPattern",questionPattern);
xele.SetAttribute("questionFearture",quesFeatureIndexes.Trim());
xele.SetAttribute("answerPattern",answerPattern);
xele.SetAttribute("answerFeature",strAswerFeaIndexes);
xele.SetAttribute("exactAnswerPosition",
strExactAnswerIndexes);
//獲取語料庫中所有符合答案模板的語句
List<string>
targetSents=
Extractor.ExtractSentence(file,answerPattern);
XmlElement
quesDetail;
//對符合答案模板的語料信息進(jìn)行整理并裝填為answerDetail結(jié)點(diǎn)
foreach
(string
sent
in
targetSents)
{
string[]
splitedPattern=
LocateAnswerPattern(sent,answerPattern);
List<Tuple<string,
string>>
exactAnswerTuple
=
ExtractFeature(sent,splitedPattern,exactAnswerIndexes);
quesDetail
=
FillDetailNode(xdoc,ExtractFeature(sent,splitedPattern,answerFeatureIndexes),sb.ToString());
xele.AppendChild(quesDetail);
}
xdoc.DocumentElement.AppendChild(xele);
xdoc.Save(_knowledgeBasePath);
return
targetSents;
}
AddNewPattern的參數(shù)依次為語料庫文件路徑,詞性標(biāo)注后的問題,詞性標(biāo)注后答案,詞性標(biāo)注的精確答案。它的主要邏輯過程如下:用C#的XDocument類加載已有的知識庫。將EliminatePatternID函數(shù)去除參數(shù)中詞性標(biāo)ID信息去掉以便進(jìn)行模板向量串匹配。用LearnFeatures函數(shù)提取關(guān)聯(lián)特征。從提取到的關(guān)聯(lián)特征中獲取它們的索引值。用ExactAnswer函數(shù)獲取精確答案的索引值。用XElement的SetAttribute方法填充knowledge節(jié)點(diǎn)屬性。用ExtracSentence方法提取出指定文件中所有符合答案模板的目標(biāo)語句。對提取來的每條目標(biāo)語句調(diào)用LocateAnswerPattern方法,獲取答案模板所在具體內(nèi)容;調(diào)用ExactFeature方法或關(guān)聯(lián)特征具體詞;調(diào)用FillDetailNode方法生成這天語句對用的answerDetail節(jié)點(diǎn),并將生成的節(jié)點(diǎn)添加到父節(jié)點(diǎn)中。保存新生成的知識庫。知識庫檢索模塊知識庫檢索模塊對生成的知識庫進(jìn)行檢索。因?yàn)橹R庫是結(jié)構(gòu)化的,且W3C指定了XPath標(biāo)準(zhǔn),故可以很方面的對知識庫進(jìn)行檢索。知識庫結(jié)點(diǎn)中帶有問題模板的描述信息,故對于給定的問題,按照2.2.2中指定的方法進(jìn)行問題模板生成,然后利用這個(gè)模板去知識庫中和每個(gè)knowledge結(jié)點(diǎn)的questionPattern匹配,如果匹配到了這這個(gè)結(jié)點(diǎn)對應(yīng)的內(nèi)容即為這個(gè)問題的的答案知識庫,然后利用問題和答案關(guān)聯(lián)特征,在這個(gè)知識庫中找到這個(gè)問題對應(yīng)的答案。檢索的結(jié)果由以下三種:這類問題還沒有學(xué)習(xí)過,即知識庫中不存在這類問題的模板。這類問題已經(jīng)有學(xué)習(xí)過,但缺乏這個(gè)問題的具體答案。這類問題已經(jīng)學(xué)習(xí)過,并且語料庫中也有這個(gè)問題的答案。用GetAnswer方法來進(jìn)行語料庫的檢索,GetAnswer方法的原型如下:stringGetAnswer(stringquestion)。參數(shù)為具體的問題,返回值為知識庫檢索結(jié)果。根據(jù)前面的分析,返回結(jié)果有三種,分別是空串、“語料信息不足,無法回答該問題”、知識庫中answer結(jié)點(diǎn)的內(nèi)容。這三種返回結(jié)果分別對應(yīng)了上面的三種情況。GetAnswer的關(guān)鍵部分實(shí)現(xiàn)代碼如下://加載知識庫
XDocument
knowledgeBase
=
XDocument.Load(_knowledgeBasePath);
//獲取問題模板向量
string
patternWithoutID
=
EliminatePatternID(questionPattern);
//獲取所有的knowledge節(jié)點(diǎn)
XElement
knowledge
=
knowledgeBase.Descendants("knowledge").Where(ele
=>ele.Attributes("questionPattern").Value
==patternWithoutID).FirstOrDefault();
bool
isRightNode
=
true;
if
(knowledge!=null)
{
//獲取區(qū)分不同問題的特征下標(biāo)
string
[]quesFeatureIndexes
=
knowledge.Attribute("questionFearture").Value.Split('
');
foreach(XElement
answerDetail
in
knowledge.Descendants("answerDetail"))
{
isRightNode
=
true;
foreach(var
str
in
quesFeatureIndexes)
{
string
quesCont
=
questionDoc.Descendants("word").Where(ele
=>ele.Attribute("id").Value
==
wordIDs[Convert.ToInt32(str)].ToString()).FirstOrDefault().Attribute("cont").Value;
string
knowledgeCont
=
answerDetail.Attribute([Convert.ToInt32(str)]).Value;
if
(quesCont
!=
knowledgeCont)
{
isRightNode
=
false;
break;
}
}
if
(isRightNode)
{
answer
=
answerDetail.Descendants("answer").FirstOrDefault().Value;
break;
}
}
if
(!isRightNode)
answer
=
"語料信息不足,無法回答該問題";
}
GetAnswer方法的主要邏輯過程如下:用C#XDocument類從磁盤上加載知識庫。用GetPattern方法獲取傳入問題的模板向量。用EliminatePatternID方法去除問題模板向量中的ID信息。從XML知識庫檢索是否有這個(gè)3)中問題模板向量對應(yīng)的knowledge節(jié)點(diǎn)。若沒有直接將返回值置空串并結(jié)束檢索。若知識庫中含有對應(yīng)的knowledge節(jié)點(diǎn)則轉(zhuǎn)5)。對這個(gè)knowledge節(jié)點(diǎn)下的所有answerDetail節(jié)點(diǎn)依次遍歷。若當(dāng)前遍歷的節(jié)點(diǎn)是對應(yīng)問題的答案節(jié)點(diǎn),將返回值置answerDetail子節(jié)點(diǎn)answer的文本值,并將是否檢索到正確答案的標(biāo)記isRightNode置true。根據(jù)isRightNode人機(jī)交互模塊本系統(tǒng)中人機(jī)交互模塊由C#的WPF圖形化界面完成。人機(jī)交互模塊整體上由四部分組成,從上到下分別是窗口標(biāo)題欄,對話內(nèi)容顯示面板,用戶輸入?yún)^(qū),消息按鈕欄。對話內(nèi)容顯示區(qū)和用戶消息輸入?yún)^(qū)。對話內(nèi)容顯示面板上有一些初始化的語句。界面中的按鈕分別綁定了對應(yīng)的事件,比如右上角的“X”按鈕綁定應(yīng)窗口關(guān)閉。本界面中最重要的按鈕是發(fā)送按鈕,當(dāng)發(fā)送按鈕按下后,對話內(nèi)容要顯示用戶輸入的內(nèi)容,同時(shí)要采用異步的方式對輸入問題進(jìn)行檢索,檢索過程中不允許用戶再次發(fā)送消息?;蛘吒鶕?jù)用戶輸入完畢的新問題類型嘗試構(gòu)建知識庫。發(fā)送按鈕事件綁定的主要代碼如下:private
void
button2_Click(object
sender,
RoutedEventArgs
e)
{
if
(textBox.Text
!=
string.Empty)
{
switch
(sessionState)
{
case
SessionState.WaitQuestion:
question
=
textBox.Text;
stackPanel.Children.Add(CreateLabel(textBox.Text,
true));
Task.Factory.StartNew(AsynRetrivalAnswer);
button2.IsEnabled
=
false;
button2.Background
=
new
SolidColorBrush(Color.FromRgb(109,
109,
109));
br
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 員工簽員工合同范本
- 倆兄弟合伙開店合同范本
- 與他人合伙經(jīng)營合同范本
- 共享汽車租車合同范本
- 冷鏈購銷合同范本
- 合伙出資金合同范本
- 員工協(xié)議簡易合同范本
- 合同范本水印有問題
- 共同建房合同范本
- 廠房質(zhì)押合同范本
- 2024年上饒職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫及答案1套
- 生物醫(yī)藥行業(yè)市場前景及投資研究報(bào)告:代謝相關(guān)脂肪肝炎(MASHNASH)無藥可治巨大市場需求
- 莫塔全科醫(yī)學(xué)安全診斷策略
- 保密法實(shí)施條例解讀培訓(xùn)
- (正式版)SHT 3225-2024 石油化工安全儀表系統(tǒng)安全完整性等級設(shè)計(jì)規(guī)范
- 第一單元《歡天喜地》第一課 《多彩的節(jié)日》(教案)三年級下冊《人文與社會(huì)》黑龍江地方課程
- (高清版)DZT 0291-2015 飾面石材礦產(chǎn)地質(zhì)勘查規(guī)范
- 2024全國職業(yè)院校技能大賽ZZ059安全保衛(wèi)賽項(xiàng)規(guī)程+賽題
- 超高分子量聚乙烯纖維發(fā)展前景分析
- 腦梗死伴發(fā)高血壓的護(hù)理
- 派出所開展小學(xué)安全教育講座
評論
0/150
提交評論