聊天機(jī)器人實(shí)踐(二)

之前的推送中,介紹了聊天機(jī)器人目前的發(fā)展。本篇主要介紹基于規(guī)則的,檢索的聊天機(jī)器人引擎 - Bot Engine.

問題域


Speech?to?Text?=>?Logic?=>?Text?to?Speech

STT和TTS,目前有很多廠商提供技術(shù)產(chǎn)品:

Speech to Text 語音識(shí)別技術(shù)

Google Cloud Platform,?IBM Watson API,?云知聲,科大訊飛

Text to Speech 語音合成技術(shù)

IBM Watson API?Docs?demo

經(jīng)過多年的研究,尤其是深度學(xué)習(xí)的采用,在這兩項(xiàng)技術(shù)上取得了突破性進(jìn)展。今天本文所要討論的是logic,而且是基于規(guī)則引擎的logic,?基于機(jī)器學(xué)習(xí)的部分將在以后的文章中討論。

Conversation Model


在兩個(gè)人之間的對(duì)話,可以用下面這個(gè)模型表示,雙方頭腦中所要向?qū)Ψ奖磉_(dá)的目標(biāo),需要通過語言來交換意見,為了達(dá)成共識(shí),二者需要在一個(gè)語境下。

https://vimeo.com/43677920

為了支撐這個(gè)模型,在設(shè)計(jì)Bot Engine過程中,要考慮如下的要點(diǎn):

低成本的構(gòu)建對(duì)話

能區(qū)分不同類型的對(duì)話

規(guī)范化輸入

高效率的規(guī)則引擎

用戶畫像

回復(fù)時(shí),考慮對(duì)話的歷史記錄

低成本的構(gòu)建對(duì)話


構(gòu)建聊天內(nèi)容最好是不需要有開發(fā)技能,而且有的開發(fā)者也沒有很好的聊天的技能。即便像Botframework這樣的大廠的產(chǎn)品,在構(gòu)建對(duì)話時(shí),都不夠友好,只能面向有開發(fā)技能的人,而且是一種硬編碼。這樣對(duì)于維護(hù)對(duì)話很不利。

使用Botframework的waterfall,設(shè)計(jì)對(duì)話的人需要了解builder.Prompts接口和session.beginDialog|endDialog。這樣做很不合理。

exports.start?=?[(session,?arg,?next)?=>?{??
????builder.Prompts.text(session,?"Do?you?want?to?start?Class?now?");
},?(session,?results)?=>?{
????co(function*()?{
????????return?yield?watson.sentiment(results.response);
????}).then(function(o)?{
????????let?reply;
????????switch?(o.docSentiment.type.toLowerCase())?{
????????????case?'positive':
????????????????reply?=?'_begin_';
????????????????break;
????????????case?'negative':
????????????????reply?=?"Got?it."
????????????????break;
????????????case?'neutral':
????????????????reply?=?"Ok,?then.";
????????????????break;
????????}
????????if?(reply?==?'_begin_')?{
????????????session.beginDialog('/daily_lessons/vocabulary');
????????}?else?{
????????????builder.Prompts.text(session,?reply);
????????????session.endDialog();
????????}
????});
}];

而另外一方面,使用script的方式,顯得更合理,比如SuperScript.

+?Do?you?want?to?start?Class?now?
-?start_class

??+?~yes
??%?Do?you?want?to?start?Class?now
??-?Great,?^redirectTo(/daily_lessons/vocabulary)

??+?~no
??%?Do?you?want?to?start?Class?now
??-?Ok,?then.

還有rivescript,?chatscript, 同樣類似于superscript方式進(jìn)行構(gòu)建對(duì)話。

能區(qū)分不同類型的對(duì)話


設(shè)計(jì)對(duì)話時(shí),至少有三種類型的對(duì)話:

system

系統(tǒng)對(duì)話,只能聊一次,或者只能由系統(tǒng)主動(dòng)發(fā)出。比如自我介紹,bot小明進(jìn)行初次對(duì)話,bot會(huì)問:“你叫什么名字?”。小明回答“小明”。那么bot就知道"id:xxx"是小明。而將來bot都不應(yīng)該再問這個(gè)問題。

daily

這些是bot可以重復(fù)和用戶聊的主題,可能并不是每天,它們可以每隔一段頻率就觸發(fā),比如:問候,節(jié)日祝福,“你在做什么”, etc.

business

和一些閑聊的機(jī)器人不同,bot應(yīng)該提供一些價(jià)值,這些價(jià)值可能是個(gè)人信息助手,?導(dǎo)購,?教育,?播放音樂

聲明對(duì)話類型:

>?topic:business?(vocabulary?class)
+?Do?you?want?to?start?Class?now?
-?start_class

??+?~yes
??%?Do?you?want?to?start?Class?now
??-?Great,?^redirectTo(/daily_lessons/vocabulary)

??+?~no
??%?Do?you?want?to?start?Class?now
??-?Ok,?then.
<

所以,一個(gè)對(duì)話看起來像是這個(gè)樣子。

規(guī)范化輸入


表達(dá)同樣的意思,可以有多種表示方法。

whats?the?color?of?the?calanders??
what?is?the?colour?of?the?calenders??
what?be?the?colour?of?the?calender

在將輸入語句傳給規(guī)則引擎前,要先做規(guī)則化處理。比如:

1) tokenized - 分詞

2) stemmed - 英文單詞取詞根

3) lemmatized - 英文單詞變形的歸類(例如單復(fù)數(shù)歸類)

4) part-of-speech (POS) tagger -?reads text in some language and assigns parts of speech to each word

5) named entity recognizer (NER) - [ labels sequences of words in a text which are the names of things]?
(http://nlp.stanford.edu/software/CRF-NER.html) 專有名詞 - 人名、地名、組織名、URL鏈接、系統(tǒng)路徑等

這里需要結(jié)合很多工具庫來實(shí)現(xiàn):NLTK, Stanford CoreNLP, Jieba分詞,Wordnet, ConceptNet.

比如,借助Stanford CoreNLP,可以有下面的標(biāo)注:

經(jīng)過規(guī)范化輸入,在規(guī)則引擎中,可以依賴詞性和函數(shù)實(shí)現(xiàn)更智能的回答。

高效率的規(guī)則引擎


Bot可以有大量的主題,即便是只有100主題,每個(gè)主題15個(gè)對(duì)話,那就是1500個(gè)規(guī)則。如果只是單機(jī)運(yùn)行,至少要進(jìn)行下面兩個(gè)優(yōu)化:

排序

通過聊天的記錄和關(guān)鍵字,先給對(duì)話棧排序。

排序的思路大概是這樣:

1) 查看當(dāng)前對(duì)話,是否還有下文,一個(gè)對(duì)話的下文可以對(duì)應(yīng)多個(gè)規(guī)則。

如果有下文,檢測(cè)是否一個(gè)規(guī)則能匹配上輸入。如果匹配上了,回復(fù)。 如果沒有下文,或者沒有規(guī)則能匹配上,進(jìn)入次優(yōu)匹配。

2)?次優(yōu)匹配是將聊天主題的歷史記錄,使用TF-IDF算法進(jìn)行排序。

簡單說,就是使用一個(gè)函數(shù)計(jì)算用戶聊天的對(duì)應(yīng)主題頻率。給不同的聊天主題加權(quán)重。在次優(yōu)匹配中,都是處理用戶曾經(jīng)聊過的主題。

3) 在次優(yōu)匹配中,沒有命中,進(jìn)入其他匹配。

其他匹配包括了以前沒有聊過的主題。

并發(fā)

在排序后,去同時(shí)處理匹配運(yùn)算,將命中的規(guī)則的回復(fù),按照排序的順序放到數(shù)組里,然后,從數(shù)組中取第一個(gè)元素。這樣就比按照順序一個(gè)一個(gè)檢測(cè)快很多。

比如,一些Node.js模塊:async

用戶畫像


在和用戶聊天的過程中,獲取到的用戶相關(guān)的信息,有必要記錄在數(shù)據(jù)庫中,這其實(shí)是構(gòu)建知識(shí)圖譜的過程。

知識(shí)圖譜所用的數(shù)據(jù)庫是存在三個(gè)字段的結(jié)構(gòu)化數(shù)據(jù):

{
??"subject":?"Mao",
??"predict":?"chairman",
??"object":?"China"
}

由此構(gòu)建了一個(gè)關(guān)系:

B又可以跳轉(zhuǎn)到D

目前,較為成熟的商業(yè)產(chǎn)品和開源方案都有。

Google Knowledge Graph API

cayley graph

在Bot Engine中,可以得到相關(guān)用戶的Knowledge Graph.

this.user.memory.get(?...)??
this.bot.createUserFact(?...)

使用知識(shí)圖譜,除了對(duì)實(shí)體之間完成關(guān)系構(gòu)建外,還有一個(gè)原因是,搜索速度非???,搜索功能強(qiáng)大。

SuperScript


介紹了這么多,那么到底怎么實(shí)現(xiàn)一個(gè)Bot Engine呢?經(jīng)過了很多比較后,我覺得基于SuperScript實(shí)現(xiàn)Bot Engine是可行的。主要是下面這幾點(diǎn):

社區(qū)活躍:目前穩(wěn)定版本v0.12.2沒有bug, 最新版v1.0.0也在快速開發(fā)。

輕便靈活: 將SuperScript的源碼讀了一遍,覺得即便是作者不維護(hù)了,我也可以維護(hù)。

功能強(qiáng)大:在上面討論的問題中,SuperScript都是有涉及的。

對(duì)話腳本


topic type?- 話題

conversation?- 對(duì)話

function?- 插件和函數(shù)

Get started

npm install?superscript

var?superscript?=?require("superscript");??
new?superscript({?...},?function(err,?bot){??
????bot.reply("userId",?"hello",?function(err,?reply){
????????//?do?your?magic
????})
})

Conclusion


很多人預(yù)計(jì)2017年,AI方向最可能取得成功的領(lǐng)域是聊天機(jī)器人。那么,在這種情況下,面向聊天機(jī)器人的架構(gòu)設(shè)計(jì),是一個(gè)熱門問題。包括Google,F(xiàn)acebook都有可能發(fā)布類似于微軟的Botframework平臺(tái)。而Bot Engine, 一種處理對(duì)話的引擎,起著很關(guān)鍵的作用。在開源社區(qū),還沒有看到哪個(gè)呼聲非常高的實(shí)現(xiàn),SuperScript,至少在JavaScript社區(qū),是一個(gè)不錯(cuò)的選擇。

在下一篇文章中,我將介紹使用深度學(xué)習(xí)技術(shù),依靠聊天語料,訓(xùn)練Bot Model.

Reading List


NaturalNode?- General natural language facilities for node.

SuperScript?- A dialog system and bot engine for conversational UI's.

Stanford CoreNLP?- a suite of core NLP tools

Natural Language Toolkit?- NLTK is a leading platform for building Python programs to work with human language data.

How to Cook a Graph Database in a Night?- A Knowledge Graphic tool based on LevelDB.

◆??◆??◆ ?◆??◆??

張洋銘,投資人中最懂動(dòng)漫的程序員,負(fù)責(zé)PlugandPlay早期科技類項(xiàng)目投資,個(gè)人關(guān)注動(dòng)漫虛擬助手。

微信公眾號(hào):張洋銘Ocean(ocean_anidata)

BP請(qǐng)投遞至:ocean.zhang@plugandplaychina.com

本文作者:王海良? 原文地址:http://eng.snaplingo.net/approaching-a-chatbot-service-part-2-bot-engine/?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,673評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,610評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,668評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,004評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評(píng)論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,173評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,705評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,426評(píng)論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,656評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,833評(píng)論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評(píng)論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,371評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,621評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容