整理到第四天越來越心虛了,因為發現好多專業的技術都不知道,比如關於語義的分析提取之類的,后面打算專門針對這些專業性的“玩法”整理下。那么今天,就繼續整理下人機問答的原理實現吧!
更多內容參考:
背景
在很多的領域其實都需要這樣一個問答系統,問答系統有很多種交互的方式。先來目睹一下問答系統的風采吧:
比如在線的聊天機器人
想要體驗一下的話,可以點擊傳送門
比如智能的搜索平台
關於這種問答系統,好壞的評測很簡單,直接人工肉眼就能判斷出來回答的是否是自己想要的,因此小白的體驗用戶也可以直觀的評測一個問答系統效果是否足夠好。
基於問答庫的實現方法
首先可以設想一下:
如果即沒有任何高大上的機器學習算法,也沒有任何復雜的公式,怎么設計一個問答系統?
如果現在只使用java和mysql(想要個頁面也可以加上js\html....),那么只要我們的數據庫里問答的內容足夠多,就能支撐這樣的問答系統。不過數據支持的搜索過於簡單,只支持普通的%
的模糊搜索。
接下來,我們可以引入一些分詞工具(lucene),或者直接借助全文檢索的系統(solr、elasticsearch)。這樣我們輸入的內容就可以以全文檢索的形式進行查詢了。不過基於全文檢索,即TF-IDF詞頻逆文檔頻率算法,效果仍然有限,比如一些詞語的位置無法識別、同義詞等無法識別。
為了解決這個問題,可以再引入一些自然語言處理的技術手段,比如實現一些同義詞的識別、詞性的轉換等等。
總結起來,大致的流程就是:
- 判斷類型的問題,用於鎖定問題的精准范圍(可以采用一些分類的機器學習算法)
- 信息提取:提取關鍵詞
- 基於關鍵詞的搜索,可以直接基於TF-IDF算法搜索,也可以基於word2vec轉變空間向量使用相似詞進行搜索
- 結合問題的主題等信息對候選集的答案進行打分
- 返回得分最高的TopN候選答案
基於知識圖譜的實現方法
基於問答庫的做法,已經能實現一個基本的問答系統了。但是他其實並不智能,因為所有的答案都需要事先錄入好。沒有准備的問題,就無法找到對應的答案....試想一下,人類說話的方式多種多樣,稍微變一下,就可能得不到想要的答案,這得是多么爛的系統啊。
隨着最近知識圖譜的興起,人機問答系統又迎來了一波春天....關於知識圖譜可以簡單的說一下,知識圖譜里面有這樣幾種類型:
- 實體,比如劉德華、北京、奔馳
- 屬性,比如年齡、地址、性別
- 關系,比如夫妻、父子、前任
有了這樣的定義,就可以基於我們自己擁有的知識庫建立知識圖譜了。
舉個例子,在電商領域阿迪、耐克、三樓、白色都是實體,阿迪
和白色
之間是一種屬性的關系,比如顏色
,因此可以得到這樣的圖:
阿
迪與耐克之間又有一些關系,比如競爭
:
有了這樣的知識圖譜之后,我們就可以進行一些智能的搜索了。
在問答系統系統中一般有這樣幾種方法:
基於語義解析
語義解析一聽就是跟語言學有關的東西,由於我缺少這方面的背景,所以只能講個大概,也許還會有很多紕漏。我們在小學學習語文的時候,老師就教過主謂賓定狀補
,現在不知道大家還記不記得:
- 主語:一個句子的主體,也是整個句子的核心,所有的操作行為的發起者
- 謂語:主體做的動作
- 賓語:動作的承受者
- 定語:描述一些程度
- 狀語:時間地點
- 補語:做一些數量、狀態的補充
比如明明(主語)在不二心(狀語)吃(謂語)了六個(補語)超好吃(定語)的肉包子(賓語)
,而在英文里面詞性又不一樣了,英文中不是主謂賓定狀補
而是名詞``代次``形容詞``副詞``動詞
...一般來說為了統一表示,在自然語言處理里面,都是使用統一的代號進行處理的,比如:
S表示句子;NP、VP、PP是名詞、動詞、介詞短語(短語級別);N、V、P分別是名詞、動詞、介詞。
比如下面兩個語法樹:
那么有了這樣的語法樹,就可以基於語法樹形成特定的查詢語言,直接基於知識庫進行查詢了,比如轉化成SPARQL
進行查詢,比如:
Number of dramas starring Tom Cruise?
可以轉化成查詢語言:
基於信息提取
信息提取的方式,跟之前的語義樹查詢的方式稍有不同。對於這樣的問題:
what is the name of Justin Bieber brother?
會形成語法的依存樹,然后根據依存樹再生成問題圖:
基於這樣的問題圖,我們很容易能到知識圖譜里面查詢到相關的實體,然后得到基於這個實體的子圖。得到子圖后,就可以從這個實體出發,把所有的關系對應的實體都做為回答的候選集。當然不僅僅是一層的關系,也可以收集兩層的圖作為候選集。有了這樣的候選集就剩下尋找最優答案的問題了,尋找答案的方法有很多,比如抽取答案的特征與問題的特征兩兩組合,基於朴素貝葉斯算法選取概率最大的候選答案。
基於word embedding
說完基於特征的信息提取,就要說說這個word embedding,word embedding是一種概念,即區別於普通的One hot編碼。
- one hot:一位有效編碼,一般都是該維有N個值,那么就會用N-1位來表示該維度的數據,從而方便機器學習進行模型的訓練和計算。然而one hot有個缺點就是無法識別詞之間的關系,比如父親和母親、北京和上海
- word embedding:也叫做詞嵌入,常用的方法有word2vec。這種方法是基於大量的語料庫去分析詞語被表達的向量,中間的過程暫且不談,最終的效果就是父親-母親 = 男-女,也就是說在用夾角余弦計算相似度的時候,同種類型的詞語往往相似度都比較高。
那么在問答系統中,就是對問題進行特征的提取,然后轉變成word embedding的表示方法;再對知識庫中的答案提取特征,形成word embedding,最終基於計算兩者的關系,來尋找最匹配的答案。這種基於word embedding的表達方式尋找最佳的匹配,也被應用到了推薦系統的場景,因此還是值得好好研究一下的。
基於深度學習
由於word embedding其實也是基於特征詞的,因此在提取特征詞的時候都會忽略掉位置等等的因素。比如,謝霆鋒的爸爸是誰?
和謝霆鋒是誰的爸爸?
就是兩個完全不同的問題。但是在深度學習中,如果使用一些循環神經網絡,就可以把每個詞作為下一個詞分析的輸入,也就變相的考慮了詞語的順序特征。具體的就不詳談了,能力有限...
對深度學習如何在問答系統中應用,可以參考知乎專欄——揭開知識庫問答KB-QA的面紗
參考
- 基於KB-QA知識庫的問答系統:https://zhuanlan.zhihu.com/p/25735572
- 什么是知識圖譜:http://www.jianshu.com/p/ae871569af02
- 圖靈機器人體驗處:http://www.tuling123.com/experience/exp_virtual_robot.jhtml?nav=exp
- 人機問答系統的工作原理:http://www.csdn.net/article/2014-08-13/2821188
- QA問答系統中深度學習的技術實現:http://www.52nlp.cn/qa問答系統中的深度學習技術實現
- 百度問答系統:https://www.leiphone.com/news/201702/LDdGVnuiyP9HiPXa.html?viewType=weixin