430的目標是完成機器人的推薦系統,提升機器人回答問題的準確率,關於過程碰到的問題以及解決方案與你們分享一下,(請輕噴!) html
那麼這個推薦系統到底應該怎麼作呢? web
最開始的第一個思路是 根據用戶 進入到ERP的模塊 推薦該模塊下的相關問題。其實就是根據用戶的軌跡來推薦問題,這是一個思路可是不太完整。由於頗有可能用戶就從ERP的桌面就進入了機器人,但他實際要諮詢的是銷售系統的相關知識,那麼此時的推薦就不太知足用戶的諮詢需求。 算法
所以參考一些業界其餘公司的作法,能夠基於內容的協同過濾(Collaborative Filtering,即CF)來設計機器人推薦系統。 函數
那麼什麼是基於內容的協同過濾,一個最經典的例子就是看電影,有時候不知道哪一部電影是咱們喜歡的或者評分比較高的,那麼一般的作法就是問問周圍的朋友,看看最近有什麼好的電影推薦。在問的時候,都習慣於問跟本身口味差很少的朋友,這就是協同過濾的核心思想。 spa
協同過濾是在海量數據中挖掘出小部分與你品味相似的用戶,並讓這些用戶成爲鄰居,而後根據他 設計
們喜歡的東西組織成一個排序的目錄推薦給你。因此就有以下兩個核心問題 htm
(1)如何肯定一個用戶是否與你有類似的問題? blog
(2)如何將鄰居們的喜愛諮詢的問題組織成一個排序目錄? 排序
協同過濾算法包括基於用戶和基於物品的協同過濾算法。so 咱們應該怎麼作呢 get
一、收集用戶偏好習慣
機器人通過一段時間的積累,已經積累了一些用戶常常諮詢的問題以及對問題的反饋,以及一些問題自己的屬性,好比問題的類型、以及問題所屬的模塊系統
二、數據預處理
1、降燥處理,主要針對對於用戶的誤操做數據進行過濾,減小對總體數據的影響
2、歸一化處理,不一樣行爲數據的取值相差可能很大,經過歸一化,才能使數據更加準確。
三、通過上述處理後
咱們獲得一張用戶的user profile的二維的矩陣。如圖:
I1 |
I2 |
I3 |
|
U1 |
1 |
1 |
1 |
U2 |
1 |
0 |
0 |
U3 |
0 |
1 |
0 |
u表示用戶,k表示知識庫條目
1:表示機器人對用戶諮詢問題反饋的知識庫條目有效,0:則表示無效。
一樣的道理,咱們能夠創建知識庫條目的item profile 二維矩陣,每個知識庫條目 有所屬的子系統、所屬模塊、以及當前的問題類型等。在這裏我截取了4個屬性,所屬子系統、所屬一級模塊、所屬二級模塊,以及問題類型。如圖:
attr1 |
attr2 |
attr3 |
attr4 |
|
I1 |
0.01 |
0.02 |
0.08 |
0.33 |
I2 |
0.01 |
0.03 |
0.17 |
0.5 |
I3 |
0.98 |
0.95 |
0.75 |
0.17 |
四、計算類似度
有了評分矩陣之後,那麼開始要找到用戶類似度及物品類似度了。
推薦系統中一般使用餘弦類似性做爲距離度量,在n維孔空間中評價被視爲向量,基於這些向量之間的夾角來計算類似性。
計算用戶k與用戶a的類似度:
計算條目m與條目b的類似度:
通過計算之後,咱們能夠拿到用戶和物品的類似度矩陣。
五、推薦
準備了這麼多,最後最終的目的仍是要進行推薦,剛剛咱們提到了2個算法,基於用戶的協同過濾和基於物品的協同過濾,(雖然能夠百度到,可是補充說明一下)
基於用戶的協同過濾,由於咱們計算出了用戶的類似度矩陣,如圖:
u1 |
u2 |
u3 |
|
u1 |
0 |
0.156874 |
0.21221 |
u2 |
0.14213 |
0 |
0.56231 |
u3 |
0.165984 |
0.62123 |
0 |
而後咱們還能夠設計一個權重,根據最近鄰居的類似度以及它們對物品的偏好,預測當前用戶偏好的但未涉及條目,計算獲得一個排序的條目列表進行推薦
基於物品的協同過濾,相似的咱們還能夠拿到一個物品的類似度矩陣(不貼圖了),他是從物品自己出發,好比A喜歡諮詢知識庫條目k,那麼咱們根據物品類似度矩陣,拿到與k類似的而且用戶A並未諮詢過的條目推薦給A。
六、評估
用於評估預測精確度的指標之一是Root Mean Squared Error(RMSE)
因此咱們能夠直接用sklearn中的mean_square_error(mse)函數,而後再求個平方根,就是RMSE。
結果如圖:
從最終的結果來看,基於用戶與基於物品的預測精確度差距不大,同時,因爲基於物品計算複雜會比基於用戶的計算複雜少不少,目前採用就是基於物品的協同過濾算法。
兩種算法的適用場景請參考:
https://www.ibm.com/developerworks/cn/web/1103_zhaoct_recommstudy2/index.html
7、後續
推薦系統在業界一直有一個問題比較難處理,就是冷啓動,因爲收集到的用戶信息不足,致使數據稀疏,推薦效果不是很不理想;那麼解決方案是基於模型的協同過濾(MF),採用奇異值分解算法svd。他的推薦效果很不錯,如圖:
(ps:相對svd算法的複雜度是最高的。。。。。對於沒有GPU必要設備的咱們來講只能放棄了)
言歸正傳,後續準備分享建設機器人寒暄庫,讓機器人能夠口吐"人言",甚至口吐"甄嬛體"。
目前還須要童鞋幫忙建設寒暄庫,各路大神有時間的,助小的一臂之力。
推薦資料:
https://www.ibm.com/developerworks/cn/web/1103_zhaoct_recommstudy2/index.html
http://blog.163.com/lnhenrylee@126/blog/static/2414832520123269713813/