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];
// 判斷當前推薦列表中是否存在看過的item
var 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-阿裏雲