秦樂臻
(山東省實驗中學,山東濟南,250000)
身處互聯網的新時代,人們的生活已離不開多種多樣的手機應用和軟件:網絡成為了人們學習,交流,工作的重要平臺,微信則是時下應用最廣的手機軟件之一(手機覆蓋率已超90%),融入了人們的日常生活,成了我們身邊必不可少的一部分。固然,科技的發展為時代帶來了空前的技術飛躍,然而,人際交流卻隨之跌入低谷。這種情況下,智能聊天機器人就顯出了其重要性和優越性。它可以保證個人信息的安全性,涵蓋范圍廣泛,運用自然語言反饋結果,迅速,準確,使用方便,貼近生活。與傳統搜索軟件不同,聊天機器人提高了用戶獲取信息的有效性,深刻的改變著人們的生活方式,促進了人機的互動和交流。因此,聊天機器人是目前非常熱的一個人工智能研發與產品方向。
本人設計開發基于微信小程序的智能聊天機器人,結合Html和微信小程序理論,調用圖靈機器人API,研究了一個具有聊天問答、娛樂互動、信息查詢等功能的微信智能聊天機器人程序。
聊天機器人在電商網站、聊天軟件、智能設備等方面應用廣泛。特別是近年來,聊天機器人的應用更加趨向場景化,擁有如客服、私人助理、知識問答、陪聊等現實意義的功能。客服機器人在電商平臺運用廣泛的主要功能是協助運營商的經營管理,自動回答用戶提出的有關產品或服務的問題,使人力、物力、成本消耗最小化,用戶也可以借此更好,更準確地了解產品信息。小京東JIMI機器人,阿里小蜜等就是此類代表;私人助理類聊天機器人的功能更加日常化,生活化,可以幫助用戶實現天氣預報,時間規劃、購物、出行等生活事宜。如微軟Cortana,出門問問軟件等;閑聊類機器人主要實現對話式聊天功能,使交流更加人性化,充滿真實感。比如先前的“小黃雞”和微軟“小冰”等;知識問答類的聊天機器人則可以運用自然語言提出的知識性問題,如Wolfram Alpha、訊飛的開心熊寶等,結合教育和娛樂,拓寬了教育市場。
自然語言處理中的問答系統一直是智能聊天機器人中備受關注的核心。而中文語言處理機制更加繁瑣,也因此需要更高的技術水平。哈爾濱工業大學開發了相關自然語言處理應用,擁有適用于漢語的句法、語法分析、分詞等功能;科大訊飛信息科技股份有限公司致力于語音識別開發,實現了較高精準度的語音輸入,語音控制,一定程度上推動了聊天機器人的發展;臺灣國防大學研制了中文回答系統CQAS,主攻命名實體和關系處理,以特征因子表示中文文字,有最終以串聯方式進行搜索、反饋,交流、應答。
國外在問答系統方面涉足較早,目前來看,技術有更高的成熟度。如谷歌公司開發的助理類軟件Google Now可以以Web為媒介,以服務形式回答用戶問題,并可以猜測用戶喜好,提出建議等,擴展了搜索引擎的功能;新加坡國立大學開發的LAMP系統可以保存網絡信息并對其中的文檔進行精度較高的語法分析,并將有效答案進行篩選呈遞。
此項目主要基于微信小程序,核心技術是調用了圖靈機器人API,實現了人機聊天的功能。先后進行了需求調研,功能設計,界面設計,代碼編寫,軟件測試等環節。
1.1.1 分詞
就像存儲單位中的“字節”,在語言的成分中,“詞”是最小的獨立的成分,英文單詞之間是有空格作為分界,而中文是把字作為基本單位,擁有一定的連貫性,沒有明顯的分隔標志。因而,如何分析中文詞語顯得尤為重要。分詞方法大致可分為三類:基于字典、詞庫匹配的分詞方法;基于詞頻度統計的分詞方法;基于知識理解的分詞方法。
應用詞典匹配、漢語詞法或語言知識進行分詞,如:最大匹配法、最小分詞方法。此方法較易實現且速率較快,然而漢語語言現象靈活多變,限制了較大規模范圍的實現;第二類基于統計的分詞方法基于字和詞的統計,把相鄰的字之間的詞頻等信息等應用于分詞,實用性較強。
基于詞的頻度統計的分詞方法屬于全切分方法,統計文章中任意兩字同時出現的頻率,次數越高則組合成一個詞語的可能性越大,這種方法可以發現所有切分時出現的異義,易進行詞語,固定搭配等的提取。
基于知識理解的分詞方法主要基于句法和語法的分析,并結合了語義分析,聯系語境和上下文對詞進行分析框定,這類方法類似于人對信息的理解過程,對知識和信息需求量大。
基于字符串匹配的分詞方法,又叫機械分詞方法。正向掃描實現的叫做正向匹配,相反則叫做逆向匹配。以長詞為先的是最大匹配,短詞優先的為最小匹配。最大正向匹配法 (MM法)在分詞時首先為最長詞設定一個字符長度,并相應地查找字典。若于字典中的長詞,匹配,那么該詞段被被整體化后分離出來;若無法匹配,則去掉該詞段的最后一個字后重復以上過程,直到匹配成功為止,此時,原該此段剩余字符長度為0,完成匹配。逆向最大匹配法(RMM)與MM法過程原理大致相同 ,但分詞切分的與前者反向且使用詞段以倒序存儲的逆序辭典。通常,用RMM發分詞時要先將文檔倒排,使之逆序兒符合分詞順序。然后,使用正向最大匹配法分詞。逆向匹配的分詞正確率更高,常常和正向匹配法結合成雙向匹配法使用,從而即使發現并處理歧義。
聯系實際,由于用戶在聊天時通常簡答,語句簡短,而基于統計的分詞方法和基于理解的分詞方法若想成功準確地實現脫離不了段落,所以總結以上所述,比較看來,只有基于字符串匹配的分詞是比較適合的。雙向最大匹配法也是現今處理漢語正確率最高的方法。
實現過程:匹配。匹配大致可分為三步:(1)用戶通過聊天界面發送信息;(2)系統對該信息進行分詞處理;(3)在系統知識存儲庫中尋找相匹配的話語作為回復。
基于詞典的分詞分為詞典加載、預處理、最大匹配和歧義消解:在預處理時,首先按照字符特點為文段斷句,將文段分為若干僅有中文的短句,并將其單位化;再對短句子進行雙向最大匹配分詞,例如輸入“北京太平洋”正向與反向切詞結果均為《北京,太平洋》長詞優先,所以只對“太平洋”做出響應;之后系統會對分詞結果總結比較,找出歧義,并進行消除處理,重復以上步驟直到詞切分徹底。
1.1.2 目前主流實現方法
(1)直接將問題和對應的答句寫入數據庫:這種方式操作簡單,但不夠精準,需要大量各式各樣的語句作為基礎,太過于機械化,不夠靈活,不適用于聊天。
(2)使用AIML方式:較易獲得,操作較簡單,但它用空格作為分詞標準,不適用于中文文字。
(3)使用搜索引擎的方式檢索:和直接將問題和對應的答句寫入數據庫不同,使用這種方法可以擴大識別范圍,但有時會因為不夠精準降低回復質量,造成答不對問。
(4)未來新型高級技術:是人工智能有著類人類的神經系統甚至一定的思考能力、更精準靈活的語義識別能力和深度學習等技能。
1.2.1 邏輯層
小程序開發的邏輯層作為整個程序的框架,由JavaScript編寫。邏輯層將數據進行處理后發送給視圖層,同時接受視圖層的事件反饋。在 JavaScript的基礎上,做了一些修改,以方便地開發小程序。
(1) API
小程序開發框架提供許多原生api,可以最大化豐富微信的功能,如獲取用戶信息,本地存儲,微信支付等。wx.on開頭的API是監聽某個時間發生的API接口,接受一個CALLBACK函數作為參數。當該時間觸發的時候,會調用callback函數。默認狀態下,其他的api接口都接受一個object作為參數。object中可以指定success(接口調用成功的回調函數), fail(接口調用失敗的回調函數),complete(接口調用結束的回調函數,且調用成功、失敗都會執行)來接收接口調用結果。
常見的api接口是wx.request 發起的是https網絡請求。一個微信小程序,同時只能有5個網絡請求連接。數據 API 列表:wx.getStorage(用來獲取本地數據緩存);wx.setStorage(用來設置本地數據緩存);wx.clearStorage(清除本地數據緩存)。
(2) setData()函數
setData函數用于將數據從邏輯層發送到視圖層,同時改變對應的this.data的值。(這里的this指的是.js文件)
(3) 頁面的路由
小程序中所有頁面的路由全部由框架進行管理。路由方式:(1)初始化:打開新頁面,調用 API wx.navigateTo或使用組件
1.2.2 視圖層
(1)數據綁定
WXML中的動態數據均來自對應Page的data。簡單綁定:數據綁定使用”Mustache”語法(變量要用大括號包起來),可以作用于(內容):
(2)列表渲染
wx:for:在組件上使用 wx:for 控制屬性綁定一個數組,即可使用數組中各項的數據重復渲染該組件。
默認數組的當前項的下標變量名默認為 index,數組當前項的變量名默認為 item
{{index}}: {{item.message}}
(3)條件渲染
wx:if:在框架中,我們用wx:if=”{{condition}}”來判斷是否需要渲染該代碼塊:
(4)事件
事件是視圖層到邏輯層的通訊方式,可以將用戶的行為反饋到邏輯層進行處理;可以綁定在組件上,當達到觸發事件,就會執行邏輯層中對應的事件處理函數;事件對象可以攜帶額外信息,如id, dataset, touches。type,通用事件類型;target,觸發事件的源組件。
Detail,自定義事件所攜帶的數據,如表單組件的提交事件會攜帶用戶的輸入,媒體的錯誤事件會攜帶錯誤信息,詳見組件定義中各個事件的定義。點擊事件的detail 帶有的 x, y 同 pageX, pageY 代表距離文檔左上角的距離。
(5)語句
if-else語句:用于基于不同的條件來執行不同的動作。只有當指定條件為 true 時,該語句才會執行代碼。
if (條件)
{
只有當條件為 true 時執行的代碼
}
For循環:For循環可以將代碼塊執行指定的次數,遍又一遍地運行相同的代碼,并且每次的值都不同。
for (var i=0;i { document.write(cars[i] + “ } While 循環:While 循環會在指定條件為真時循環執行代碼塊。) while (條件) { 需要執行的代碼 } do/while 循環是 while 循環的變體。該循環會執行一次代碼塊,在檢查條件是否為真之前,然后如果條件為真的話,就會重復這個循環。 此小程序實現了用戶與圖靈機器人聊天的功能。用戶在對話框中輸入消息,點擊發送按鈕發送消息,微信小程序將通過圖靈機器人返回相應的回復。小程序界面如圖1所示。 圖1 聊天界面 微信智能聊天機器人程序目錄共分為四個主要部分,目錄結構如圖2所示。 圖2 目錄結構 (1)image文件夾,其下存有應用圖片; (2)pages文件夾,包含自定義子文件夾chat(含有chat.js ,chat.json ,chat.wxml, chat.wxss 四個文件)和pic,存放照片,(含 pic.js ,pic.json ,pic.wxml ,pic.wxss四個文件); (3)utils文件夾,存放輔助性文件,含util.js; (4)app文件,描述整體程序框架(含app.js ,app,json ,app,wxml ,app.wxss,分別描述頁面邏輯,頁面配置,頁面結構和頁面樣式)。 用戶在對話框中輸入文字,點擊發送按鈕發送文字,此時調用了chat.js文件中的send函數。send函數實現了通過網絡請求調用圖靈機器人接口,請求成功后通過 success.res函數返回響應信息,最后將返回的信息賦值給chat.wxml文件中text的value。 2.3.1 小程序配置 (1)app.json文件 此文件是微信小程序中不可缺少的一部分,做為入口來配置文件。此文件可以實現對小程序全面布局的配置,可以設置小程序的標題;導航欄的樣式,顏色;背景色,窗口等,在app.json中設置頁面布局。其中在window中通過backgroundTextStyle設置背景文字樣式,在navigationBarBackgroundColor設置導航欄背景顏色,navigationBarTitleText設置導航欄標題,navigationBarTextStyle設置導航欄文字樣式;在tabBar中通過backgroundColor設置背景顏色,SelectedColor設置圖標顏色,最后在其下list數組中通過iconPath和text設置了圖標和其對應標題。 (2)app.js文件 此文件也是微信小程序必不可少的組成成分,此文件處理了小程序的生命周期,并聲明全局變量。小程序注冊程序在加載時調用function函數,使用到了wx.getStorageSync和wx.setStorageSync兩個api,進行數據存儲,并定義’logs’為本地緩存的key,logs為存儲內容,用來存儲日志。然后通過wx.login()得到登錄憑證,使用wx.getSetting({獲取用戶當前設置,用戶如果已經授權,則 key 為scope 值,value 為Bool 值,直接調用getUserInfo,將res 發送給后臺 (3)app.wxss文件 app.wxss 是整個小程序的公共樣式表。在.container中定義了height,display, fl ex-direction使靈活項目縱向對齊,align-items使 fl ex中項目在當前 fl ex縱軸方向上居中對齊。,justify-content使在彈性盒對象的元素中的各項周圍留有空白,padding來設置內邊距屬性,box-sizing使元素的任何內邊距和邊框都將在已經設定的寬度和高度內進行設定。 2.3.2 視圖層 (1)chat.wxml文件 在滾動視圖中設置允許橫向滾動,scroll-y=”true”,用style定義其高度,并用scroll-top設置滾動條位置。使用block wx:for進行渲染,循環列表變量{{msglist}},在視圖容器view下判斷,若item.type==0則為發送狀態時,發送的消息綁定在text的value上,并使用image調用image中的存儲圖片,顯示本機頭像;若item.type==1,則為返回狀態時,則調用image圖像顯示對方頭像,收到的文字同樣綁定。用戶在文本區域textarea中輸入文字,點擊發送按鈕,觸發form表單的submit事件,此時調用chat.js中的send函數,具體實現代碼是: (2)chat.wxss 設置.reply樣式:橫向對齊,外邊距大小10px;設置.send樣式:右對齊;設置.photo樣式:寬度40px,高度40px,背景顏色為#999;設置.text樣式:用marginleft設置左外邊距為10px,margin-right設置右外邊距10px,內邊距10px,背景色#999,使用border-radius設置對話外框圓角的弧度;設置.sendMsg樣式:外邊距和底邊距均10px;設置.inputMsg:背景色#999,字體顏色#あf,高度30px,使用font-size設定字號大小12px。 (3)chat.js 應用page()函數,分別輸入object參數:data,定義頁面初始化數據,并顯示文字“This is page data”;onLoad,描述小程序生命周期,加載監聽頁面同時可調用某函數function(),在頁面加載時實現功能;onReady,完成監聽頁面的初次渲染,在頁面加載完成時實現其功能;onShow監聽頁面顯示時實現功能,onHide小程序后臺運行或跳轉到其他頁面時觸發,onUnload頁面關閉時觸發;onPullDownRefresh,頁面下拉時觸發;onReachBottom,頁面觸底時觸發;onShareAppMessage,用戶點擊分享時觸發。send函數通過wx.request進行網絡請求,調用圖靈機器人API接口,發送msg數組取出數據, var msglist = this.data.msglist; msglist.push(msg); this.setData({msglist:msglist}); 需要傳三個參數,分別是url、data、header。其中,在data中發送請求的參數,’key’,’info’,’userid’, data:{‘key’:’35f94c81869745d18467475bb00b 74bd’, ‘info’:sendMsg, ‘userid’:’eb2edb736’ }, 在header中設置請求的參數’apikey’和’contenttype’,’content-type’使用默認json數據格式。header:{ ‘content-type’:’application/json’, ‘apikey’: ‘35f94c81869745d18467475bb00b74bd’ }, 如果請求發送成功,圖靈API接收到請求后調用了getReplay函數返回結果,使用success接收開發者服務成功返回的回調函數,在對話框中顯示回復的信息,同時滾動條自動下拉,與用戶進行對話。 全文首先結合現狀寫了智能聊天機器人的研究意義和發展狀況;然后介紹了微信智能聊天機器人運用的相關技術,包括自然語言處理原理、實現過程和微信小程序的理論、技術,并加以展望;然后介紹了微信智能聊天機器人的具體實現過程和分步代碼解析。此研究成功實現了微信小程序和圖靈機器人API相結合的人機網絡聊天,以展現了該程序一定的聊天問答、娛樂互動、信息查詢等功能,充滿趣味性。 通過本次的研究,本人對微信小程序相關技術及開發有了一定理解,但與此同時,本成果在程序編寫和頁面布局等方面還有部分值得雕琢和完善之處,創新思想仍需鍛煉,對復雜化功能的設計和應用能力還待提高。今后,本人打算在提升個人技術的基礎上,進一步融入人工智能的發展的時代潮流,充分利用其優勢,結合社會現狀,把握好發展前景,將智能聊天機器人更好應用于教育業中,解決一定的基礎性教育問題,提高教育資源人力物力等的利用率以及更高效的進行教育普及及宣傳,實現如“在線智能輔導”,“學習性人機對話互動交流”等多樣化功能并進行相應的產品設計。 當今的互聯網和人工智能是科技的結晶更是時代的主導,若在相關技術開發中加以正確的利用,一定可以更好的造福全人類。
”)2 具體實現
2.1 功能描述

2.2 目錄結構

2.3 代碼實現
3 總結