1. 程式人生 > >聊天機器人中對話模板的高效匹配方法

聊天機器人中對話模板的高效匹配方法

/*.*/

                                                     author: 張俊林,黃通文,薛會萍

儘管深度學習目前在研發聊天機器人方面進行的如火如荼,但是這些技術距離真正實用還有不短的距離,在市面上你能看到的非常多的聊天機器人中,採用會話模板通過模板匹配來響應使用者聊天應該是個主流方法,如果聊天對話內容非常多,採用簡單粗暴的匹配效率是極低的,所以如何研發能夠支援高效匹配的對話模板系統就非常必要。

|對話模板


  雖說目前人工智慧熱,NLP是人工智慧中最重要的分枝之一,但是其實目前的NLP技術,就算把暴熱的深度學習技術算進來,距離真正理解人的語言還有十萬八千里距離,但是有時候你會有錯覺,覺得好像它已經理解你的意思了啊,要不然怎麼聊得這麼

High啊,比如下面的人和機器的對話:

我是人:你知道王思聰是誰嗎

我是ChatBot:你問國民老公幹嘛,你要跟他借錢嗎?

看上去回答的夠機智吧?難道這還沒理解人的意思嗎?所以說是錯覺嗎,其實只要在後臺儲存這麼一個匹配模板就能做到上面的機智回答,而且可以確定的一點是,越是回答的有趣的答案,越可以肯定這是通過模板技術來做的,為啥呢?因為其它技術做不到真正理解人的話,更不要說回答的有趣了。

一句互動對話的模板由<Q,A>資料對構成,其中Q代表輸入模板,A代表聊天機器人應該回答什麼話,A可能不會是模板,而是就是應答的一句話,也可能是帶著標籤的模板,但是Q往往採用模板,因為這樣覆蓋率高,當然Q也完全可以是不帶模板萬用字元的完整的一句話,但是一般而言模板居多,否則要窮舉所有可能使用者的問話基本不可能,通過加入

*或者?這種萬用字元,可以用一個模板匹配更多的使用者輸入。當然,模板可以做得更復雜一些,按照複雜度不同,可能有下面幾種型別的模板。

最簡單的模板可能是這樣的:

 Q:你貴姓?

 A:人家貴性女;

就是完整一句話作為一個模板;

稍微複雜些的模板長這樣:

 Q:*喜歡*電影*是什麼*

 A:我最喜歡的電影當然是《斷背山》了,啥時候咱倆一起去看,帥哥~

這樣,無論使用者問的是下面哪句話,都能蹦出基情滿滿的回答:

   User A: 你能告我最喜歡的電影是什麼嗎?

   UserB:你最近喜歡的好電影是什麼啊

很明顯,這樣能夠一個模板匹配多種輸入的情況。

如果再複雜一些,可以是帶實體類別標籤的模板:

Q:<PersonName>的生日是

<Date>嗎?

A:哥,我不敢認識<PersonName>.Value啊。

這樣的模板等於把一些常見的實體變數抽象出來,否則帶經常變化的人名地名日期等的句子模板是沒法做的。如果有了上面的模板,就可以這麼應答:

UserA:孫楊的生日是1232號嗎?

聊天系統先上實體識別模組,把上面這句話轉換成:

<PersonName>的生日是<Date>嗎?

而且記住實體變數的值:<PersonName>.Value=孫楊;<Date>.Value=1232

這樣發現對話模板庫裡面有一個匹配上的模板,於是就可以根據Q對應的A內容,把變數值填充進去,可以回答:

“哥,我不敢認識孫楊啊。”

因為這種型別的模板帶實體變數的識別和值替換,所以看上去會顯得智商高一點。

|簡單高效的對話模板匹配

上面列舉了常見的幾種會話模板型別,如果模板數量少,那很好辦,在使用者輸入內容後需要進行模板匹配,如果模板少,哪怕最簡單的暴力匹配都不是啥問題,速度也不會太慢,但是如果模板數量巨大,比如幾十萬上百萬,那麼一個一個去暴力匹配這速度是不現實的,使用者還以為你ChatBot休克了呢。所以現在的問題是,有什麼高效的會話模板匹配方法嗎?後面內容就是講這個的。

下面介紹下我們在實際工作中的一個做法,這個沒有參考相關資料,純粹拍腦袋,所以不保證效率是最快的,不過一方面好在實現簡單,手快的話就是幾個小時的工作量,至於效率的話,我們測試過查詢效率也是非常高的,基本都是幾毫秒十幾毫秒級別的,和Alice的模板查詢速度比效能提升了12個數量級,大多數應用場合應該是夠用的,所以分享出來供有需求同學參考。

首先,對於每個QA進行唯一編號,並對其Q部分,用切割點把Q切割成若干字串片段,切割點有哪些呢?包括多字元萬用字元*和單字元萬用字元?符號,以及事先定義的實體標籤(比如<PersonName><Address><Date>,<FilmName>等),這裡實體標籤既是切割點,也是需要記錄的字串片段,一身二用,而萬用字元只充當切割點。比如對於上面的三個例子:

1.*喜歡*電影*是什麼*

會被切割為:

{你,喜歡,電影,是什麼}

2.<PersonName>的生日是<Date>嗎?

會被切割為:

{<PersonName>,的生日是,<Date>,嗎?}

       3. 你貴姓?

      因為沒有切割點,所以整個句子被當做一個片段,如下:

        {你貴姓?}

    然後,將這些被切割的字串片段相同的合併後,形成了字串字典:

    Diction={你,喜歡,電影,是什麼, 你貴姓?, <PersonName>,的生日是,<Date>,嗎?}

 根據這個字典,構建多模式匹配演算法,我們實際用的是Wu_Manber演算法,這個演算法可以從使用者輸入句子中極快地將字典中包含的字串片段全部掃描出來;

 第三步,根據第一步每個Q對應的編號及其被切割成的片段,建立記憶體倒排索引,Key是字串片段內容或者其雜湊值(因為有時候這個字串片段可能是完整的一句話),Value是對應的Q編號序列,等價於一般意義搜尋引擎的文件ID列表;


                                               1.執行邏輯圖

有了以上基礎設施,我們就可以來快速地進行模式匹配了(參考圖1示意),假設使用者輸入NewQ,首先用Wu_Manber演算法掃描NewQ,把其中包含的字典中的字串片段都找出來,比如找出了A,B,C三個片段;使用A,B,C三個片段,從倒排索引中找出同時包含三個片段的模板集合QSet;現在有了使用者輸入NewQ和一個小的模板集合QSet,可以採用正則表達等傳統的方式去進行模式匹配,找出其中某個模式或者一個模式也匹配不上。因為這個QSet相比原先整個模板集合來說,資料量是極小的,絕大多數時候只有一個或者幾個,所以這個步驟不會太耗時間。

所以,綜合上述過程,可以看出基本思路是:使用多模式匹配和倒排索引來快速找到一些候選的模板集合,這個模板集合大小相對原先整個模板集合來說相當小,然後在這個小集合上進行常規的模式匹配。

瞧,大家覺得很神的對話一般都是這種方式蹦出來的,你覺得ChatBot理解了人的語言了嗎?


相關推薦

聊天機器人中對話模板高效匹配方法

/*.*/                                                     author: 張俊林,黃通文,薛會萍儘管深度學習目前在研發聊天機器人方面進行的如火如荼,但是這些技術距離真正實用還有不短的距離,在市面上你能看到的非常多的聊天

使用Opencv中matchTemplate模板匹配方法跟蹤移動目標

模板匹配是一種在影象中定位目標的方法,通過把輸入影象在實際影象上逐畫素點滑動,計算特徵相似性,以此來判斷當前滑塊影象所在位置是目標影象的概率。 在Opencv中,模板匹配定義了6種相似性對比方式:     CV_TM_SQDIFF 平方差匹配法:計算影象畫素間的距離之和,最

SAP 中的popup dialog (彈出對話框) 常見實現方法

program ng- 方法 tput starting div class titlebar 小時 方法1: FM:POPUP_TO_CONFIRM(標準對話彈出消息) 有三個button:YES-NO-CANL,可進行對應的邏輯推斷 可設定標

正則匹配方法

blank csdn 關於 expr 取ip地址 數值 換ip 表達式 java 這裏是幾個主要非英文語系字符範圍(google上找到的): 2E80~33FFh:中日韓符號區。收容康熙字典部首、中日韓輔助部首、註音符號、日本假名、韓文音符,中日韓的符號、標點、帶圈或帶括

Java高效入門方法_蘿魏紫

得到 理論 你會 來看 打開 基礎 調整 找到 hello 根據我的觀察,扣除部分3分鐘熱度的人以外,真心想學習的人,在高效問題上,最重大的阻礙,即是挫折感。下文,我針對的就是速度,這個關鍵點進行分析,我並不認同高速是一個最好的學習方法,不過既然問題是關於速度的,所

特征檢測和特征匹配方法

.com comment 場景 原則 它的 自帶 相同 for 視覺 一幅圖像中總存在著其獨特的像素點,這些點我們可以認為就是這幅圖像的特征,成為特征點。計算機視覺領域中的很重要的圖像特征匹配就是一特征點為基礎而進行的,所以,如何定義和找出一幅圖像中的特征點就非常重要。這

關於機器學習中的一些常用方法的補充

機器學習 k近鄰 apriori pagerank前言 機器學習相關算法數量龐大,很難一一窮盡,網上有好事之人也評選了相關所謂十大算法(可能排名不分先後),它們分別是: 1. 決策樹2. 隨機森林算法3. 邏輯回歸4. 支持向量機5. 樸素貝葉斯6

程序員高效學習方法

主體 參考資料 學習過程 而且 16px 中一 實現 .cn 通過 註:以下內容出自http://www.cnblogs.com/weilu2/p/learning_method.html 1、自頂向下的學習方法 也就是分層學習,與網絡化學習方式有一定的關聯性 2、網絡

SSM-Spring-12:Spring中NameMatchMethodPointcutAdvisor名稱匹配方法切入點顧問

cep con ram -c intercept cts str framework 所有 ------------吾亦無他,唯手熟爾,謙卑若愚,好學若饑------------- advice 是通知advisor 是顧問 顧問(Advisor)     

機器學習之特征選擇方法

transform 數量 filter 想要 一起 進行 AD IE 維度 特征選擇是一個重要的數據預處理過程,在現實機器學習任務中,獲得數據之後通常先進行特征選擇,此後在訓練學習器,如下圖所示: 進行特征選擇有兩個很重要的原因: 避免維數災難:能剔除不相關(irrel

利用MessageFormat實現短信模板匹配

att 不可 san 參考 很多 print size class 異常 其實沒什麽技術含量,因為老是想不起來,所以在此文做下記錄。 通常我們的應用系統中都會有很多短信的發送,或者是信息郵件等的推送,而這些信息卻有著相同的共性,比如只是用戶名換了下。 像下面這條,除了紅

嵌入式系統在機器人中的應用

能夠 功能 通信協議 works text alt 通信 type 現實 隨著高新技術的發展,機器人在各個行業,各個領域的使用率節節攀升。而機器人的發展,於嵌入式計算機為核心的嵌入式系統是密不可分的。目前,嵌入式系統在機器人控制系統被廣泛采用。   嵌入式控制器越來越微型化

高效學習方法

nbsp 獲取 div clas width fmt .cn qpi detail 參考:https://blog.csdn.net/vqhgWJl9EUB/article/details/81199661 一、費曼學習法   又稱為【快速學習法】,具體步驟如下圖。   

htmlrunner模板的使用方法

over test port itl stl epo scrip rom 方法 # coding:utf-8import unittestimport osfrom common.htmlRunner import HTMLTestRunnerimport timenow_

如何計算用戶在某個車站上下車,地圖匹配方法

list hash ror err traffic == %s url 使用 具體需求基於電信的位置融合數據,分析用戶是否通過火車出行,以及火車出行的相關信息,如乘車車次、上車站、下車站等。 數據描述1、用戶定位數據手機號碼業務開始時間城市編碼經緯度基站標識網格號業務類型事

織夢手機站搜尋結果顯示為電腦站的搜尋結果模板的解決方法

有使用dedecms最新程式移動版的同學肯定遇到過,手機版搜尋結果跳轉到的是電腦版搜尋結果頁面去了。 解決方法 1、在移動站模板的搜尋框程式碼上加入 <input type="hidden" name="mobile" value="1" /> <form name="formsea

聊天室專案設計模板

客戶端 發起請求 伺服器 核心功能 1. 有一個簡單的登入(採集使用者名稱) 2. 每個人均可以自由發言 其他人 接收到訊息 3. hello world ----》 張三 : hello world 4. 管理員可以發言 5. 每個人進入或者退出房間會有提示 技術選擇 {name:(addre

pandas DataFrame高效程式設計方法: 根據多列的值做判斷,生成新的列值,其中多列的值是包含多個值的資料型別

一.遇到的問題描述: 我遇到問題的資料比較複雜,下面以比較簡單的資料為例說明問題,所以這些資料的含義是沒有意義的,可以忽略資料的的具體意義。資料如下所示: import numpy as np import pandas as pd data = {'city': [{'Beijing':1

Struts xml中Action的method與路徑的三種匹配方法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

各種有關檔案的對話方塊的建立方法

如圖所示,工程中列舉了常用對話方塊的建立方法,如儲存對話方塊,檔案選擇對話方塊,資料夾選擇對話方塊。後續有更新。連結:工程原始碼 儲存對話方塊建立: UpdateData(TRUE);CString filename = "1.txt";CFileDialog saveDlg(FALSE