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-阿里云