Eric,基於多搜索引擎的自動問答機器人
Eric(https://github.com/SnakeHacker/QA-Snake)是一個採用Python編寫的基於多搜索引擎和AIML技術的問答機器人,英文名的意思是多才多藝的(這也是我想賦予他的)。目前支持的功能有:閑聊,通用問答等。本文主要講述我在寫Eric的過程中對於問答系統的一些思考與想法,在文末會介紹Eric的使用和展示。
最初接到導師給的研究題目(自動問答)是在2017年4月上旬,然後就在看大牛們寫論文(文末給地址),找相關資料以及研究市場上各種現有的商業自動問答產品(中國版的聊天機器人地圖 Chatbots Landscape - 知乎專欄)中度過了一個月,這個過程中少不了狂和機器人聊天,測試不同產品對同類問題的反應。
現代的自動問答是將自然語言處理、統計機器學習深度學習相結合的產物。自從1950年代圖靈測試而誕生至今,自動問答系統的發展已經有幾十年的歷史。但真正在產業界得到大家的廣泛關注,則得益於2011年Siri和Watson的成功。這一方面歸功於機器學習與自然語言處理技術的快速進步,另一方面得益於維基百科等大規模知識庫以及海量網路信息,也就是大數據的飛速發展。
然而,現有的自動問答系統還不夠完美,部分還是基於關鍵字模版匹配(包括一些商業產品),無法真正做到語義理解的程度。在通用領域實現一個不被大多數人噴的問答系統更是難上加難。事實上,無論是業界應用還是學術研究,問句的真實意圖分析、問句與答案之間的匹配關係判別仍然是制約自動問答系統性能的兩個關鍵難題。
幾乎所有的問答系統的流程可以歸結為以下幾部分:
目前的研究工作大多集中於上圖的兩個虛線框中的內容,有用傳統的規則搞的,也有用統計方法搞的,也有用深度學習方法搞的。中文的問答系統,還需要進行分詞等工作。問答系統又不同於聊天機器人(小冰等),它是要解決實際問題的。比如客服問答機器人,阿里和京東的都做得非常不錯,這不僅是基於他們強大的研發團隊,足夠的數據支撐模型訓練也是重要的因素之一。
然而,我就想做個簡單的問答機器人,然後順利畢業啊。沒有那麼多公開的中文數據,怎麼破?學術界的大多方法還不能很好地運用到工業界。看完論文和大多商業產品後,我開始思考Eric的定位,由於目前中文的問答訓練集非常少,並且沒有通用的問答訓練集,這對於一開始想採用統計機器學習、深度學習訓練一個問答模型的我造成了非常大的困難,這個問題足足困擾了我一周。在不斷查找資料的過程中我發現了AIML,非常棒的人工智慧標記語言。Alice是一個基於AIML實現關鍵詞匹配和簡單的推理的聊天機器人,它的語料庫非常之大,不過是英語的((╯﹏╰))。
但不管怎麼樣這是一種實現問答機器人的方式,於是我先跑通了基於AIML的問答機器人。但是他僅僅是基於關鍵詞匹配和簡單的推理,缺少語義理解的能力,雖然它的可擴展性非常強,但是如果只做到這步的話,我想我是沒辦法順利畢業了。
在研究AIML的過程中,我發現了互聯網上有許多半結構化數據。比如維基百科,百度百科等。我嘗試使用AIML把問句轉換成一種結構化的Query,然後再百度百科中找到對應屬性的屬性值。比如「王思聰的父親是誰?」這個問題,AIML根據規則會抽取出「王思聰」,「父親」。抽取出來的實體和屬性是很容易在百度百科中搜索到的。但問題又來了,如果問「王思聰的老爹是?」這類問題,Eric就找不到答案了。為了解決這個問題,我引入了哈工大的同義詞詞林進行關鍵詞擴展。
做到這步,基本上百度百科上有的答案我都能搜出來了。這還遠遠不夠,對於百度百科沒有的答案怎麼辦呢?有些問題的答案其實已經在搜索引擎的前幾十條答案中有,人很容易找出這些答案,但機器怎麼找答案呢?
知識圖譜是我原本想模仿百度百科做的一個本地知識庫,後來發現,要構建這樣的通用知識庫太麻煩了,工作量非常之大。那麼既然百度有了知識圖譜,我為何不去嘗試用它,而要重複造輪子呢?同樣的道理,本地其實不需要太多的知識,所有的知識搜索引擎幾乎都能找到,為何還要耗時費力的去構建本地的知識庫呢,我的知識庫就是整個互聯網啊。百度沒有搜到的東西,Bing有吧,Google有吧?
做到這步Eric的定位就比較清晰了,自動問答的問題也就變成了根據問句從互聯網中抽取答案。我還想做閑聊,但是也沒訓練集。我嘗試讓兩個產品的機器人互聊,藉此收集語料,結果他們聊死了。最後在網上找到一個質量一般的聊天對話語料庫,暫時湊合著先用。後面有時間再來聊優化閑聊的部分。
我採用BeautifulSoup對百度知道、百度百科、百度搜索、Bing搜索這四個信息源進行了規則解析。這裡要提一下百度知道(包括類似的問答社區),在線搜索解析的成本真的比寫爬蟲把數據抓取並存儲成結構化知識要省力得多,現成的知識庫要靈活運用起來。
下面是Eric的問句效果,我拿楊尚川老師的「測試人機問答系統智能性的3760個問題」以及自己收集的問題進行了測試,結果還湊合。下面是結果,用Django寫了個站進行展示:
Github上放出來的代碼提供了支持命令行的問答模塊以及基於Socket通信的server端,代碼很亂,後續會做進一步改進。
總結:
目前的Eric還很稚嫩,還存在包括但不僅限以下問題:
1.多輪對話能力為零
2.沒有情感3.對於搜索引擎都找不到的答案,沒有自己的「思維」抽象能力。4.問答的結果如何評估?目前都是人在看,對於中文的問答有沒有比較好的評估標準和方式?5.語義相同問法不同的問句返回的答案會不一致,還是沒做到語義理解。
希望各位大佬給些意見,求噴求指教。1. 將CNN問句分類用於Eric,為後續對不同類別的問句做針對性回答策略做鋪墊。(目前遇到的問題還是訓練集不夠,模型用Tensorflow已經搭好了。)
2. 嘗試解決語義理解。3. 問句收集模塊的設計與實現。4. 對於多個候選答案進行打分排序,提出一個打分策略並驗證可行性。
作者:Snake
Blog:http://Snakehacker.me
2018年碩士畢業,找一份可以在今年9-10月份到崗的實習(工作地點:上海,崗位:自然語言處理、Java開發,其他崗位也可以嘗試下)
參考:
看過的自動問答相關論文:鏈接:https://pan.baidu.com/s/1gfKf4Lt 密碼:allj
楊尚川老師的3760個問題:測試人機問答系統智能性的3760個問題 - 楊尚川的個人頁面 - 開源
推薦閱讀:
TAG:自然语言处理 | 问答系统 | 深度学习DeepLearning |