上一篇介紹了整個問答機器人的技術架構和特定,本篇着重說下
如何讓機器人(看起來)更智能
輸入聯想
使用jquery.autosuggest.js實現的輸入聯想,在輸入2個字后,在5000個問答中基於全文檢索,檢索10條記錄,供用戶選擇。
猜你想問
Chatterbot中也有閾值的概念,例如匹配度低於0.2,可定義為無法回答,但可以額外增加一個閾值,如0.5
當匹配度0~0.2回復無法回答
當匹配度0.2~0.5 回復我猜您想問“XXX”
當匹配度0.5~1回復匹配問題“XXX”
上下文變化
意圖規則JSON數據格式,prompts為缺失該參數是的返回值,我們可以多設置幾個,再用隨機數獲取,這樣每次與用戶交互的問題都是同樣含義的不同問法,也有助於消除歧義。
{
"rule": [{
"intent": "weather",
"entities": [
{"name":"city","type":"city","required":"true","prompts":["請問查詢哪里的天氣","想查詢哪個城市的天氣"]},
{"name":"date","type":"date","required":"false","prompts":[]}
]
},
{
"intent": "bookhotel",
"entities": [
{"name":"city","type":"city","required":"true","prompts":["請問預訂哪里","想預訂哪個城市"]},
{"name":"checkindata","type":"date","required":"true","prompts":["請問何時入住","預訂酒店的時間"]},
{"name":"checkoutdata","type":"date","required":"false","prompts":[]}
]
},
{
"intent": "bookticket",
"entities": [
{"name":"fromcity","type":"city","required":"true","prompts":["請提供出發城市","從哪起飛"]},
{"name":"tocity","type":"city","required":"true","prompts":["請提供到達城市","到哪落地"]},
{"name":"date","type":"date","required":"true","prompts":["請問預訂機票的時間","想預訂哪天的機票"]}
]
}
]
}
如何優化機器人
1.關鍵字
預先定義QA與關鍵詞的匹配關系,如果用戶問題中包含關鍵詞,則檢索與此關鍵詞匹配的QA,縮小查詢范圍,如果同時包含多個關鍵字,則unionQA列表,如果不包含關鍵字則從全部QA檢索。
在問題、答案的基礎上加入關鍵詞列。
初始化時,使用行列轉化,將關鍵字和問題加工成1對1的關系
這樣在算法比對時,僅判斷包含關鍵字的問題,比對數據量從5000變為了幾十條速度提升非常明顯,而且還能略微提高正確率
2.緩存
主要設置了2級緩存:緩存5000條問答數據,緩存用戶提出的問題和引擎的答案(如果有人問過的問題,將直接從緩存回復)
3.中文處理
自定義詞典,中文處理也是很重要部分,分詞工具使用jieba,我們將之前標注的關鍵字作為自定義詞典,用來提供特定業務分詞的准確性。
去標點符號,標點符號在問答系統中是非常討厭的,我在訓練和用戶輸入處理時會移除全部的標點符號
去停用詞,“是什么,什么時候,是什么意思,多少錢,有沒有,更有趣,更有甚者,又為什么,有問題嗎,有問題么”等等,這類詞在用戶提問中經常出現,卻沒有實際意義,分詞后將這類詞屏蔽。