如何做一款聊天機器人
目錄
- 前言
- 什麼是我認為的對話機器人
- 語音助手
- 如何去做一個像上述提到的那樣的東西
- 解釋一下上述架構圖
- 如何将上述理論和實際結合呢?
- 結論
- 參考文獻(文章)
前言
以此開題,并不是一定要做一款對話機器人,隻是做事一定要以目标為驅動,目前所要研究的語義方向是一個太大的方向,是一個讓人完全摸不到頭腦的方向。是以,選取其中一個分支作為切入點,開始我的認知過程。在這個過程中,我會不斷更新我的認識,以聊天機器人開篇,結尾處也許會面目全非!
什麼是我認為的對話機器人
關于這個問題?相信大家都已經看過很多了。之前的小i、小白、圖靈機器人、微軟小冰、Cortana、HUBOT,google now,amazon echo 等。到底這些都是個什麼鬼?大家可以簡單了解下,更詳細的請自行google。上面的幾個機器人是我聽過的,應該具有一定的代表性。
在google完這幾個鬼之後,我發現我們需要的其實不僅僅是一款對話機器人,更确切的說,應該是個機器人助手。這個助手,應該能夠跟人交流,這個交流不僅僅是你問我答,還可能有你說我做,你困惑我解釋等。
給大家個直覺的印象,貼一個Amazon echo的連結(如果不能通路,請翻牆):
* https://www.youtube.com/watch?v=KkOCeAtKHIc 一個關于echo的視訊,雖然并沒有上下文語義,但是無論從立體聲效果和應答的情感都是相當完美的。
* https://www.youtube.com/watch?v=24Hz9qjTDfw Echo dot是echo的迷你版
* https://www.youtube.com/watch?v=nVEEbKzaZFQ Echo tap 帶有藍牙和wifi功能,可以利用語音控制裝置
總結下來,其實我們更需要的是一個語音助手。
語音助手
通過上面的得出的結論,對我們想要的東西,應該有個模糊的想象,我覺得就是那個樣子,沿着這個思路,繼續其明确我們的目标與實作途徑。
如何去做一個像上述提到的那樣的東西
簡單的流程大約如下:
使用者輸入一段話(不一定隻是單詞)->後端語義引擎對使用者輸入的語句進行語義解析->推斷使用者最可能的意圖->調用對應的知識庫、應用、計算引擎->傳回結果給使用者。
實作方式有下面這麼幾種:
* ### 最初級的實作方法:關鍵詞比對(個人覺得我們的第一版實作可以采用這種方式)
建一個關鍵詞詞庫,對使用者輸入的語句進行關鍵詞比對,然後調用對應的知識庫。
此種方式入門門檻很低,基本上是個程式員都能實作,例如現在微信公衆平台的智能回複、諸多網站的敏感詞過濾就是此類。
但此種方式存在諸多問題,例如:
1. 由于是關鍵詞比對,如果使用者輸入的語句中出現多個關鍵詞,此時由于涉及關鍵詞權重(與知識庫的關鍵詞對比)等等問題,此時關鍵詞比對的方法就不擅長了
2. 不存在對使用者輸入語句語義的了解,導緻會出現答非所問的現象。當然在産品上對回答不上的問題就采用賣萌的方式來規避掉。
3. 基本上無自學習能力,規則隻能完全由人工維護,且規則基本是固定死的。
4. 性能、擴充性較差。還是上面的一句話中包含多個關鍵詞的例子,采用普通程式語言來做關鍵詞比對,性能奇差。即便采用一些文本處理的算法來做(例如Double-array trie tree),也很難滿足大規模場景需求。
-
稍微進階點的實作方法:基于搜尋引擎、文本挖掘、自然語言處理(NLP)等技術來實作
相對于1的關鍵詞比對,此種實作方法要解決的核心的問題可以大緻了解為:根據一段短文本(例如使用者問的一句話)的語義,推測出使用者最可能的意圖,然後從海量知識庫内容中找出相似度最高的結果。
具體技術實作就不細說了。舉一個很粗糙的例子來簡單說一下此種實作方法處理的思路(不嚴謹,隻是為了說明思路)。
假如使用者問:北京後天的溫度是多少度?
如果采用純搜尋引擎的思路(基于文本挖掘、NLP的思路不盡相同,但可參考此思路),此時實際流程上分成幾步處理:
- 對輸入語句分詞,得到北京、後天、溫度3個關鍵詞。分詞時候利用了預先建好的行業詞庫,“北京”符合預先建好的城市庫、“後天”符合日期庫、“溫度”符合氣象庫
- 将上述分詞結果與規則庫按照一定算法做比對,得出比對度最高的規則。假定在規則庫中有一條天氣的規則:城市庫+日期庫+氣象庫,進而大緻可以推測使用者可能想問某個地方某天的天氣。
- 對語義做具體解析,知道城市是北京,日期是後天,要擷取的知識是天氣預報
- 調用第三方的天氣接口,例如中國天氣網-專業天氣預報、氣象服務門戶 的資料
- 将結果傳回給使用者
以上例子其實很粗糙,實際上還有諸多問題沒提到:語義上下文、語義規則的優先級等等。
例如使用者上一句問:北京後天的溫度是多少度?下一句問:後天的空氣品質呢?這裡實際上還涉及語義上下文、使用者曆史喜好資料等等諸多問題。
此種處理方法存在的最大問題:規則庫還主要依賴于人工的建立,雖然有一定的學習能力,但自我學習能力還是較弱。可以借助一些訓練算法來完善規則,但效果并不是很好。而這也是目前流行的深度挖掘技術所擅長的。
-
當下時髦且進階的玩法:基于深度挖掘、大資料技術來實作
這種做法,要基于的技術就比較多了,總結為以下架構(盜圖,來源已在參考文章中注明):
解釋一下上述架構圖
-
### 存儲層
對于這一層,個人認為就是網際網路上或是本地的一切能夠擷取到數字資源(網頁、視訊等等等等),對于一些受限的資源(如QQ聊天記錄等),也可以通過一定的方式擷取到。
-
數字聚合層
這一層的存在,其實是将網際網路上雜亂無章的資料,進行各簡單的分類,可能會用到一下三種方式:- 人工維護錄入資料(不做細說)
- 第三方開放平台接口資料
- 通俗的講,所有你在網上注冊的使用的,你以為是免費的東西,都能提供一種資料接入的方式,你的各種資訊都被平台擷取。當然,這隻是一種方式,其他還有很多方式,請自行google。
- 再舉個例子,現在我用的是搜狗輸入法,如果你真的是它想免費給你提供輸入法,那你就太天真了,too young, too naive
- 垂直爬蟲爬取資料
- 所謂垂直爬蟲,通俗的講,可以認為是針對某一領域或行業的爬蟲。網上的資料畢竟是錯綜複雜的,使用者所需擷取的資訊是需要有針對性的。比如,在垂直搜尋的索引建立之前,我們需要到垂直網站上抓取資源并做一定的處理。垂直搜尋與通用搜尋不同之處在于,通用搜尋不需要理會網站哪些資源是需要的,哪些是不需要的,一并抓取并将其文本部分做索引。而垂直搜尋裡,我們的目标網站往往在某一領域具有其專業性,其整體網站的結構相當規範(否則使用者體驗也是個災難,想想東一篇文章西一篇文章基本沒人會喜歡),并且垂直搜尋往往隻需要其中一部分具有垂直性的資源,是以垂直爬蟲相比通用爬蟲更加精确。
- 兩個垂直爬蟲簡介的連結:
http://www.oschina.net/question/163158_109450
http://liangqingyu.com/page/category.html#細說垂直型網絡爬蟲
- http://www.datatang.com/freelimit 資料堂
- http://www.datamall.com/ 資料商城
-
資料挖掘層
這一層體系,基本上是在有行業資料的基礎上,進一步的對興趣點進行提煉。基本也分為三個方向:- 文本挖掘
- 從海量文本中提取出有用的資訊。如,處理和文本的表示,詞的關聯性挖掘及分析,話題的挖掘和分析,觀點挖掘和情感分析,基于文本的預測。如, 根據一段話來判斷它的情緒,看看有沒有反動言論等,這個都算是其中的一種。
- 給出幾個連結,可以簡單了解下:
- 文本挖掘和分析初步 http://www.jianshu.com/p/a98ac6847181
- 知識庫 : 文本挖掘概述 http://udn.yyuap.com/doc/ae/919872.html
- 資料科學18:文本挖掘1 http://jackycode.github.io/blog/2014/06/18/text-mining1/
- 從狹義的角度看,文本挖掘是不做推理的,但現在挖掘技術總是和深度學習結合在一起的。
- 協同過濾
- 協同過濾是利用集體智慧的一個典型方法。要了解什麼是協同過濾 (Collaborative Filtering, 簡稱 CF),首先想一個簡單的問題,如果你現在想看個電影,但你不知道具體看哪部,你會怎麼做?大部分的人會問問周圍的朋友,看看最近有什麼好看的電影推薦,而我們一般更傾向于從口味比較類似的朋友那裡得到推薦。這就是協同過濾的核心思想。換句話說,就是借鑒和你相關人群的觀點來進行推薦,很好了解。
- 你會發現微網誌或淘寶下面經常就會給你推薦小廣告,這就是協同過濾。
-
接着連結兩篇文章:
https://www.ibm.com/developerworks/cn/web/1103_zhaoct_recommstudy2/
- 對于我們來說,協同過濾的理念完全可以應用到産品中,幫使用者進行各種需求的推薦。
- 深度學習
- 其實,這一點是與其他技術相結合的。通過資料,按照各種算法進行學習訓練,進而形成一套模型架構。利用訓練好的模型,可以對未知的資料進行分析。這方面相關的東西太多,大家可以自行google。
- 文本挖掘
-
知識庫層
這一層很好了解,其實更接近我們目前所能了解的東西。文本分析之後,去相應的知識庫尋求問答。例如,對于一個機器人對話系統,你說一句話,語音轉成文字之後,根據文字的分詞、句法、語義分析結果,去對應的語言庫中,尋求或自動生成最合理的應答。對于語音助手,那麼先分析出,需要哪樣的知識庫,在去相應的知識庫中尋求結果,或回一句話,或放個音樂,或開個空調,等等等等。介紹下知識庫:- 通用知識庫
- 專用知識庫
- 比如針對人機對話,音樂,地圖等的庫,都屬于專用庫。
- 媒體庫
- 你在google或百度用文字進行搜尋,結果中有網頁,也會有視訊或圖檔,這就是從媒體庫中進行的抽取
- 社會化媒體庫
-
簡單介紹下,自行了解:
http://wiki.mbalib.com/wiki/%E7%A4%BE%E4%BC%9A%E5%8C%96%E5%AA%92%E4%BD%93
-
- 語義庫和規則庫
- 在我們的課題中,語義庫和規則庫,主要指文字到答複或是控制指令的轉換規則。這種規則一部分是自己定義的,一部分可以利用深度學習,從大資料中進行訓練學習得到的。
-
引擎層
- 就個人看來就是個架構,沒有知識庫,它什麼都幹不了,大家概念一下就好。
-
解決方案層
- 也不多說了,實際上就是你選擇做個聊天機器人還是個語音助手之類的,巴拉巴拉!!!
如何将上述理論和實際結合呢?
這一步的假設是需求的資源都能擷取到。
已做一個聊天機器人為例,講述一下如何通過上述架構來實作:
- 存儲層,就是網上所有的資料,文字的、視訊、音頻都算。
- 資料聚合層,在所有網上雜亂無章的資料中,其實我更需要的是QQ的聊天記錄或是視訊、音頻的對話記錄,需要有針對性的擷取這部分資料。
- 資料挖掘層,那麼如何擷取這些資料呢,可以通過購買或者是爬蟲技術進行爬取。因為這些東西屬于使用者隐私,在使用爬蟲進行爬取的時候可能需要一些黑客的技術融入其中,針對很多大的資料網站是有反爬機制的,還要想辦法繞過這一關。在此實作的基礎上,對對話内容進行NLU的分詞、句法分析等操作,并将輸出結果,作為深度神經網絡的輸入,進行訓練。得到一套應答機制4。
- 知識庫層,利用3輸出的結果,建構應答的語義和規則庫
- 引擎層, 這一部分包括語音識别(聲音轉文字),語義了解引擎(對文字進行分詞和句法分析,将分析結果輸入上面訓練的神經網絡,得到答複),語音合成(将輸出的結果最終的讀出來)。
- 解決方案層, 建構一個聊天機器人的應用,包括UI界面和互動邏輯等。
結論
整個上面的過程,實際上是我一個門外漢,對整個我們要做的事情的一個了解的過程。
參考文獻(文章)
- 微軟小冰智能聊天是如何實作的? https://www.zhihu.com/question/23952075
- 垂直爬蟲
- http://www.oschina.net/question/163158_109450
- http://liangqingyu.com/page/category.html#細說垂直型網絡爬蟲
- 文本挖掘
- 文本挖掘和分析初步 http://www.jianshu.com/p/a98ac6847181
- 知識庫 : 文本挖掘概述 http://udn.yyuap.com/doc/ae/919872.html
- 資料科學18:文本挖掘1 http://jackycode.github.io/blog/2014/06/18/text-mining1/
- 協同過濾
- 探索推薦引擎内部的秘密,第 2 部分: 深入推薦引擎相關算法 - 協同過濾https://www.ibm.com/developerworks/cn/web/1103_zhaoct_recommstudy2/
- 語義了解
- 地圖中的語義了解 | 硬創公開課 http://weibo.com/ttarticle/p/show?id=2309351000223982624799503109
- 社會化媒體
- http://wiki.mbalib.com/wiki/%E7%A4%BE%E4%BC%9A%E5%8C%96%E5%AA%92%E4%BD%93