535
阿裏雲
實時修正算法開發手冊__算法規範_開發者指南_推薦引擎-阿裏雲
阿裏雲推薦引擎支持兩類實時修正,分別通過數據修正API和實時的用戶行為日誌提交到推薦引擎。數據修正API一般用來解決物品的實時變更需求,比如有新物品上線,或者老物品下架,需要及時調整;利用用戶行為日誌的修正一般用來調整用戶的興趣偏好,根據用戶實時行為進行更有針對性的推薦。阿裏雲推薦引擎會提供默認的修正算法,客戶也可以根據業務需求自己定義。

先決條件
您需要熟悉基於NodeJS的開發模式,主要包括JS的基本語法+異步編程+函數回調(後兩項為高級進階要求,依您所需要開發的算法複雜度選擇具備即可)。
算法代碼可在推薦引擎提供的界麵中進行編輯修改,並運行在推薦環境中,您不需要在本地搭建NodeJS的環境。
基本知識
一個實時修正算法表現一個函數(一段NodeJS代碼),函數體基本結構如下:
function(logs) { // logs為數組類型,即您通過日誌API上傳的一組原始日誌,每條日誌為string類型var callback = this; // 固定寫法,callback為回調函數console.log('test log', logs);// 定義一個解析日誌內容的方法,依您上傳的日誌格式進行解析。這裏簡單演示一個url請求參數的解析函數var parseLog = function(log) {var paraobj = {}, fields = log.split('&');fields.forEach(function(ele) {var tt = ele.split('=');var k = decodeURIComponent(tt[0]), v = decodeURIComponent(tt[1]);paraobj[k] = v;});return paraobj;}// 定義您需要讀取的數據結構var DataReader = {REC_USER: []};// 解析當前日誌中每個用戶產生行為的item列表var user2rec = {};logs.forEach(function(log) {var logobj = parseLog(log);var user_id = logobj.user_id, item_id = logobj.item_id;DataReader.REC_USER.push(user_id);user2rec[user_id] = user2rec[user_id] || [];user2rec[user_id].push(item_id);});console.log(JSON.stringify(DataReader));// 根據您定義的數據結構讀取在線數據,TOOLBOX的使用方法見下一節詳細說明TOOLBOX.read(DataReader, function(err, data) {if (err) return callback(err);console.log(JSON.stringify(data));// 定義您要寫入的數據結構var DataWriter = {REC_USER: {}};var REC_USER = data.REC_USER;// 執行一個簡單邏輯,若當前用戶沒有推薦結果,把他最近產生過行為的item直接作為下次推薦列表REC_USER.forEach(function(reclist, idx) {var user_id = DataReader.REC_USER[idx];if (reclist.length === 0) {DataWriter.REC_USER[user_id] = user2rec[user_id].map(function(item_id) {return [item_id, 1.0];})}});// 根據您定義的結構更新在線數據,TOOLBOX的使用方法見下一節詳細說明TOOLBOX.write(DataWriter, callback);});}
SDK內置屬性
TOOLBOX:SDK內置方法
這部分方法以係統內置函數的形式提供,您可以通過TOOLBOX.func_name調用(func_name為具體的方法名稱)。
注:凡下文中提到的一個“推薦列表”在數據類型上均表示為一個二維數組,如[ [‘a’,1.0], [‘b’,0.9], [‘c’,0.8] ],其中每一維第一位(即例中的’a’,’b’,’c’)固定表示item_id,其餘位數可自定義擴展,如例中的1.0,0.9,0.8表示對應item_id的得分。
TOOLBOX主要包含以下方法:
| 方法名稱 | 方法說明 | 參數列表 | 返回參數 | 注意事項 |
|---|---|---|---|---|
| read | 讀取一組指定類型的在線數據 | DataReader:JSON格式,支持的全部數據類型限定為{“REC_USER”:[], “REC_ITEM”:[], “REC_TAG”:[], “REC_DEFAULT”:1 ,”OTHERS”:[]},您可以有選擇性地進行屬性填充。其中: REC_USER:獲取一組針對用戶的推薦列表,取值類型為字符串數組,如[‘user1’,’user2’]; REC_ITEM:獲取一組針對物品的推薦列表,取值類型為字符串數組,如[‘item1’,’item2’]; REC_TAG:獲取一組針對自定義Tag的推薦列表,取值類型為字符串數組,如[‘tag1’,’tag2’]; REC_DEFAULT:獲取默認推薦列表,不需要獲取默認推薦結果時,可以不設定該屬性或將屬性值設為0(亦即REC_DEFAULT:0); OTHERS表示獲取一組自定義鍵值對,取值類型為字符串數組,如[‘key1’,’key2’] |
返回結果格式同輸入參數,與DataReader中各查詢屬性順序一一對應的查詢結果,其中: REC_USER/REC_ITEM/REC_TAG/REC_DEFAULT:一組推薦列表(數組),如[[[‘a’,1.0], [‘b’,0.9], [‘c’,0.8]], [[‘a’,1.0], [‘b’,0.9], [‘c’,0.8]]]; REC_DEFAULT:一個推薦列表; OTHERS:與自定義鍵順序對應的值字符串 |
1、這是一個異步方法,需要使用回調形式 2、單次調用的查詢條數目不超過100 |
| write | 寫入一組指定類型的在線數據 | DataWriter:JSON格式,支持的全部數據類型限定為{“REC_USER”:{}, “REC_ITEM”:{}, “REC_TAG”:{}, “REC_DEFAULT”:[] ,”OTHERS”:{}},您可以有選擇性地進行屬性填充。其中: REC_USER:寫入一組針對用戶推薦列表,取值類型為JSON,如{“user1”:[[‘a’,1.0], [‘b’,0.9], [‘c’,0.8]], “user2”:[[‘a’,1.0], [‘b’,0.9], [‘c’,0.8]]}; REC_ITEM:同上; REC_TAG:同上; REC_DEFAULT:寫入默認推薦列表,取值為推薦列表; OTHERS表示寫入一組自定義鍵值對,如{“key1”:”value1”,”key2”:”value2”} |
無 | 這是一個異步方法,需要使用回調形式使用 |
實例附錄(僅供參考)
實現實時行為過濾(看過不再推薦)
function(logs) {var callback = this;var parseLog = function(log) {var paraobj = {}, fields = log.split('&');fields.forEach(function(ele) {var tt = ele.split('=');var k = decodeURIComponent(tt[0]), v = decodeURIComponent(tt[1]);paraobj[k] = v;});return paraobj;}var getKey = function(user_id) {return "U_BHV_HIST" + "#" + user_id.toString();}var DataReader = {REC_USER: [],OTHERS: []};var user2item = {};logs.forEach(function(log) {var logobj = parseLog(log);var user_id = logobj.user_id, item_id = logobj.item_id;user2item[user_id] = user2item[user_id] || {};user2item[user_id][item_id] = 1;});DataReader.REC_USER = Object.keys(user2item);// 請求獲取用戶實時曆史行為DataReader.OTHERS = Object.keys(user2item).map(function(u) {return getKey(u);});var this_user_bhv = {};for (var user in user2item)this_user_bhv[user] = Object.keys(user2item[user]);TOOLBOX.read(DataReader, function(err, data) {if (err) return callback(err);var DataWriter = {REC_USER: {}, OTHERS: {}};var REC_USER = data.REC_USER, last_user_bhv = data.OTHERS.split(' 01');REC_USER.forEach(function(reclist, idx) {var user_id = DataReader.REC_USER[idx];// 判斷當前推薦列表中是否存在看過的itemvar filtered = reclist.filter(function(rec) {return this_user_bhv[user_id].every(function(item_id) {return rec[0] !== item_id;});});// 隻在有更新的情況下寫回,節省寫在線存儲開銷if (filtered.length < reclist.length)DataWriter.REC_USER[user_id] = filtered;// 合並用戶本次行為記錄var diffitems = user2item[user_id];last_user_bhv.forEach(function(item_id) {diffitems[item_id] = 1;});DataWriter.OTHERS[getKey(user_id)] = Object.keys(diffitems).join(' 01');});TOOLBOX.write(DataWriter, callback);});}
最後更新:2016-11-23 16:04:12
上一篇:
在線算法開發手冊__算法規範_開發者指南_推薦引擎-阿裏雲
下一篇:
數據格式規範__數據規範_開發者指南_推薦引擎-阿裏雲
調試運行__腳本開發_Lite用戶使用手冊_性能測試-阿裏雲
SLB與RDS相關問題__常見問題_彈性伸縮-阿裏雲
目錄操作__文件操作_用戶指南(Linux)_數據管理-阿裏雲
設置拖拽播放__配置操作接口_API 手冊_CDN-阿裏雲
阿裏雲成中國雲計算霸主 付費用戶100萬 年收入超10億美元
表單上傳__上傳文件_開發人員指南_對象存儲 OSS-阿裏雲
文件導入任務配置__快速入門_數據傳輸-阿裏雲
【推薦】ECS Windows開啟內核轉儲(Core Dump)配置說明__藍屏夯機_操作係統類問題_Windows操作運維問題_雲服務器 ECS-阿裏雲
補丁管理-漏洞回滾失敗__產品常見問題_服務器安全(安騎士)-阿裏雲
蘋果ATS - 證書選擇及配置__常見問題_產品常見問題_證書服務-阿裏雲
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲