閱讀535 返回首頁    go 機器人


實時修正算法開發手冊__算法規範_開發者指南_推薦引擎-阿裏雲

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

233

先決條件

您需要熟悉基於NodeJS的開發模式,主要包括JS的基本語法+異步編程+函數回調(後兩項為高級進階要求,依您所需要開發的算法複雜度選擇具備即可)。

算法代碼可在推薦引擎提供的界麵中進行編輯修改,並運行在推薦環境中,您不需要在本地搭建NodeJS的環境。

基本知識

一個實時修正算法表現一個函數(一段NodeJS代碼),函數體基本結構如下:

  1. function(logs) { // logs為數組類型,即您通過日誌API上傳的一組原始日誌,每條日誌為string類型
  2. var callback = this; // 固定寫法,callback為回調函數
  3. console.log('test log', logs);
  4. // 定義一個解析日誌內容的方法,依您上傳的日誌格式進行解析。這裏簡單演示一個url請求參數的解析函數
  5. var parseLog = function(log) {
  6. var paraobj = {}, fields = log.split('&');
  7. fields.forEach(function(ele) {
  8. var tt = ele.split('=');
  9. var k = decodeURIComponent(tt[0]), v = decodeURIComponent(tt[1]);
  10. paraobj[k] = v;
  11. });
  12. return paraobj;
  13. }
  14. // 定義您需要讀取的數據結構
  15. var DataReader = {
  16. REC_USER: []
  17. };
  18. // 解析當前日誌中每個用戶產生行為的item列表
  19. var user2rec = {};
  20. logs.forEach(function(log) {
  21. var logobj = parseLog(log);
  22. var user_id = logobj.user_id, item_id = logobj.item_id;
  23. DataReader.REC_USER.push(user_id);
  24. user2rec[user_id] = user2rec[user_id] || [];
  25. user2rec[user_id].push(item_id);
  26. });
  27. console.log(JSON.stringify(DataReader));
  28. // 根據您定義的數據結構讀取在線數據,TOOLBOX的使用方法見下一節詳細說明
  29. TOOLBOX.read(DataReader, function(err, data) {
  30. if (err) return callback(err);
  31. console.log(JSON.stringify(data));
  32. // 定義您要寫入的數據結構
  33. var DataWriter = {REC_USER: {}};
  34. var REC_USER = data.REC_USER;
  35. // 執行一個簡單邏輯,若當前用戶沒有推薦結果,把他最近產生過行為的item直接作為下次推薦列表
  36. REC_USER.forEach(function(reclist, idx) {
  37. var user_id = DataReader.REC_USER[idx];
  38. if (reclist.length === 0) {
  39. DataWriter.REC_USER[user_id] = user2rec[user_id].map(function(item_id) {
  40. return [item_id, 1.0];
  41. })
  42. }
  43. });
  44. // 根據您定義的結構更新在線數據,TOOLBOX的使用方法見下一節詳細說明
  45. TOOLBOX.write(DataWriter, callback);
  46. });
  47. }

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”}
這是一個異步方法,需要使用回調形式使用

實例附錄(僅供參考)

實現實時行為過濾(看過不再推薦)

  1. function(logs) {
  2. var callback = this;
  3. var parseLog = function(log) {
  4. var paraobj = {}, fields = log.split('&');
  5. fields.forEach(function(ele) {
  6. var tt = ele.split('=');
  7. var k = decodeURIComponent(tt[0]), v = decodeURIComponent(tt[1]);
  8. paraobj[k] = v;
  9. });
  10. return paraobj;
  11. }
  12. var getKey = function(user_id) {
  13. return "U_BHV_HIST" + "#" + user_id.toString();
  14. }
  15. var DataReader = {
  16. REC_USER: [],
  17. OTHERS: []
  18. };
  19. var user2item = {};
  20. logs.forEach(function(log) {
  21. var logobj = parseLog(log);
  22. var user_id = logobj.user_id, item_id = logobj.item_id;
  23. user2item[user_id] = user2item[user_id] || {};
  24. user2item[user_id][item_id] = 1;
  25. });
  26. DataReader.REC_USER = Object.keys(user2item);
  27. // 請求獲取用戶實時曆史行為
  28. DataReader.OTHERS = Object.keys(user2item).map(function(u) {
  29. return getKey(u);
  30. });
  31. var this_user_bhv = {};
  32. for (var user in user2item)
  33. this_user_bhv[user] = Object.keys(user2item[user]);
  34. TOOLBOX.read(DataReader, function(err, data) {
  35. if (err) return callback(err);
  36. var DataWriter = {REC_USER: {}, OTHERS: {}};
  37. var REC_USER = data.REC_USER, last_user_bhv = data.OTHERS.split('01');
  38. REC_USER.forEach(function(reclist, idx) {
  39. var user_id = DataReader.REC_USER[idx];
  40. // 判斷當前推薦列表中是否存在看過的item
  41. var filtered = reclist.filter(function(rec) {
  42. return this_user_bhv[user_id].every(function(item_id) {
  43. return rec[0] !== item_id;
  44. });
  45. });
  46. // 隻在有更新的情況下寫回,節省寫在線存儲開銷
  47. if (filtered.length < reclist.length)
  48. DataWriter.REC_USER[user_id] = filtered;
  49. // 合並用戶本次行為記錄
  50. var diffitems = user2item[user_id];
  51. last_user_bhv.forEach(function(item_id) {
  52. diffitems[item_id] = 1;
  53. });
  54. DataWriter.OTHERS[getKey(user_id)] = Object.keys(diffitems).join('01');
  55. });
  56. TOOLBOX.write(DataWriter, callback);
  57. });
  58. }

最後更新:2016-11-23 16:04:12

  上一篇:go 在線算法開發手冊__算法規範_開發者指南_推薦引擎-阿裏雲
  下一篇:go 數據格式規範__數據規範_開發者指南_推薦引擎-阿裏雲