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