1.分享者:趙俊良node
毛豆網客服總監,北京交通大學碩士,曾任北京聯合大學信息學院講師,擁有十餘年嵌入式系統研發經歷和智能儀器測控領域的創業經歷正則表達式
Bot Friday - 沙龍第5場分享 實現支持微信小程序的聊天機器人npm
2019-08-16 於北京微軟,zhaoicjson
2.wechaty的小程序實現小程序
因爲項目的需求,接入了wechaty,感受很好用。後來發現,發送小程序部分還不能實現,在大神們的鼓勵下,歷經艱辛,修改爲了能夠成功的發送小程序。後來在李卓桓的建議下,咱們提交了PR,第一次給開源項目提交PR,本覺得很簡單,實際中也碰到了一些問題,好在都解決了。微信小程序
(1)開發環境的創建api
新手作開發時,在這一步可能會浪費大量的時間。我本人就是這樣,首次創建本地開發環境時,花了一天的時間,其實這個時間徹底能夠節省下來,這裏對wechaty-puppet-padpro本地開發環境的配置,作個簡要說明,但願後續的開發者能更加容易的用wechaty作開發。微信
這裏涉及到wechaty,wechaty-puppet,wechaty-puppet-padpro三個庫,測試使用官方的wechaty-getting-started,各類關聯錯綜複雜,這裏須要感謝一下蘇暢,在他的幫助下,我也花費了一天時間才跑通,可是在捅破窗戶紙以後,發現其實也很簡單app
各個庫之間的關聯關係以下圖學習
1)wechaty,wechaty-puppet,wechaty-puppet-padpro這三個庫在本地都須要
npm i && npm run dist && npm link
改動代碼後須要運行 npm run dist
npm i以後,須要運行npm link
2)wechaty連接上本地庫
npm link wechaty-puppet
npm link wechaty-puppet-padpro
複製代碼
3)wechaty-getting-started連接上本地wechaty
npm link wechaty
複製代碼
即搭建好了開發環境,使用下面的命令便可開發測試,其中WECHATY_PUPPET_PADPRO_TOKEN須要得到有效的token
ECHATY_PUPPET=wechaty-puppet-padpro WECHATY_PUPPET_PADPRO_TOKEN=puppet_padpro_xxxx node examples/some-example.js
複製代碼
(2)開發測試
小程序的payload接口的定義以下
export interface MiniProgramPayload {
appid? : string, // optional, appid, get from wechat (mp.weixin.qq.com)
description? : string, // optional, mini program title
pagepath? : string, // optional, mini program page path
thumbnailurl? : string, // optional, default picture, convert to thumbnail
title? : string, // optional, mini program title
username? : string, // original ID, get from wechat (mp.weixin.qq.com)
}
複製代碼
其中username和appid能夠在小程序的後臺得到,有這兩項,就能夠發送出小程序了,可是樣子是這樣的
thumbnailurl是預留的,目前還不起做用,計劃將來經過這個url傳送一個圖片,用於小程序的封面,其他各項對應關係以下圖
到這一步,因爲沒法自動生成cdnthumbnail相關的信息,小程序還不能顯示出圖片,爲了知足業務的須要,咱們經過分析小程序xml,提取出了相關數據,硬編碼在padpro裏。這樣終於能夠發送出一個相對完整的小程序了,缺點是圖片是固定的。將來若是有高手熟悉小程序cdn這部分,能夠繼續完善wechaty-puppet-padpro。
關於wechaty-puppet-padpro中小程序的詳細部分,能夠參考如何用PadPro實現發送微信小程序
3.用正則表達式實現聊天機器人
咱們目前的業務場景,仍是比較簡單的,程序裏經過正則表達式就能比較好的知足咱們的需求
(1)對於時間的識別 毛豆少兒課堂小程序,是想經過識別出時間,設置課程提醒,因此對於時間的識別就很關鍵,通過測試對比,NLP最終選用了微軟的@microsoft/recognizers-text-suite,微軟的NLP,根據輸入的文本,返回一個複雜的json值,在這個返回值中,找到字段中的須要時間。尋找優先級路徑以下圖。例如,在datetime中找到有效時間,就返回,不然在time中查找,如此一級一級,若是全部字段都沒有有效時間,返回空,不創建課程提醒。
(2)一些識別歧義的處理
在文本的識別中,有一些特殊須要處理的地方
特殊符號的處理
在微信文本中,常常會遇到一些表情符號,有可能會影響到識別,經過正則表達式,能夠去除
var msgText = originalText.replace(/<[^>]*>?/gm, '')
複製代碼
還有一些文本信息,若是以空格開頭,也會影響識別,下面是去除開頭空格的正則表達式
msgText = msgText.replace(/(^\s*)/g, '')
複製代碼
時間歧義
在週日晚上6:30這種語言環境下,晚上6:30沒有歧義,可是週日,能夠看到nlp解析出兩個日期,上週日和本週日,通常本週日纔是咱們要表達的,因此此處選用第二個結果
在6月9日10點這種語言環境下,會產生兩個歧義四種結果,今年或明年的6月9日,上午或下午10點,因此能夠看到識別的結果是四個,第二個結果正好巧合是咱們須要的。
而換成6月9日22點這種語言描述,時間的歧義沒有了,會返回兩個年的結果,今年或明年的6月9日,按照以前慣例,仍然選用第二個識別結果,就會產生偏差,明年的6月9日,明顯不是須要的結果。
九號樓的歧義
在實際測試中,在時間前會出現某某號樓這樣的詞語,例以下面的實例,出現九號樓,會致使識別成日期9日
爲了不相似問題,經過正則表達式,在號樓前加入#,能夠較好的解決這類問題。
var msgText2 = msgText.replace(/號樓/g, '#號樓')
複製代碼
2-6點歧義
在時間識別中,還有相似2-6點這種描述,NLP會識別出6點,而咱們想要的倒是開始時間2點
經過正則表達式,將 (數字)-(數字)點 這種描述,改寫成 (數字)點-(數字)點,就能較好的識別出開始時間
var msgText2 = msgText2.replace(/(\d+)\-(\d+)點/g, '$1點-$2點')
複製代碼
小助手新加好友的處理
因爲和客戶溝通的入口,都放在微信小助手,而小助手新加好友後,微信會有自動回覆:我經過了您的朋友驗證請求,如今咱們能夠開始聊天了,其中關鍵詞如今,會致使識別出當前時間,讓小助手建立提醒,並推送給新加好友,形成很差的體驗。
然而關鍵字如今也很重要,因此這裏經過正則表達式,將如今咱們刪除,防止錯誤的識別,同時也能保留關鍵詞如今
var msgText2 = msgText2.replace(/如今咱們/g, '')
複製代碼
(3)與現有產品的掛接
通過前面的處理後,若是正確識別出了時間,就能夠根據句子中的關鍵詞,給用戶推送相應的服務。目前小助手支持會議模式,直播模式和課堂模式。
const reg = /zoom|視頻會議|音頻會議|演講|羣學習/g
if(msgText.match(/直播/g)){
let invite_url = '\n邀請連麥連接\nhttps://smh.maodou.io/invite/' + live_id + '/1234567890'
let admin_url = '\n\n直播間後臺連接\nhttps://smh.maodou.io/admin/content/course/' + live_id
....
}
else if(msgText.match(reg)){
console.log(chalk.red('匹配到會議關鍵詞'))
let meeting_url
if(msgText.match(/zoom|視頻會議/g)){
meeting_url = '\n視頻會議連接\nhttps://kaihui.maodou.io/j/683175?mode=zoom'
}
else if(msgText.match(/音頻會議/g)){
meeting_url = '\n音頻會議連接\nhttps://kaihui.maodou.io/j/683175?mode=audio'
}
.....
}
複製代碼
實際測試效果,以下圖所示
4.demo-毛豆課堂現場的快速體驗
分享的最後,在現場作了一個毛豆課堂的demo,經過和小助手互動,建立了課程和小程序提醒,將小程序推送給現場嘉賓,加入小程序提醒後,會收到短信上課提醒,經過短信中的連接,用戶能很快速進入課堂進行互動。
5.後續工做
目前,wechaty發送微信小程序,毛豆小助手的時間識別,還有許多須要改進的地方。咱們但願逐步的完善,找到一個最佳的體驗。
(1)完善小程序cdn圖片 小程序的圖片cdn地址,目前在wechaty-puppet-padpro中沒法生成,若是有熟悉這部分的高手,能夠接着完善
(2)掛接訊飛stt語音轉文字 毛豆小助手,目前只能識別分析文本信息,計劃將來能夠接入訊飛語音轉文字接口,讓小助手具備更佳的用戶體驗
(3)聊天機器人訓練引擎化 將代碼引擎化,經過配置文件或api進行訓練與更新,能讓非技術人員也方便的完善機器人的訓練