easyrec:一个java库的推荐系统!
一:环境搭建
安装JDK和JRE,分别安装在同一个文件夹(java)下的两个文件夹中(jdk、jre)
系统变量配置:1:新建 系统JAVA_HOME 变量→F:/java/jdk
2:系统Path 变量→编辑加入→%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
3:新建系统 CLASSPATH 变量→.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
4:检验是否配置成功 运行cmd 输入 java -version
安装Tomcat(开源免费的java Web服务器)
1:下载地址:http://tomcat.apache.org/
2:环境变量配置:新建系统CATALINA_HOME变量→F:\Tomcat\tomcat
3:cmd进入安装目录中的bin目录,执行service.bat install(移除为service.bat remove)
4:双击运行bin目录中的tomcat8w.exe,start开始
5:浏览器输入localhost:8080,如果能进入Tomcat控制首页就安装成功
进入Tomcat控制首页,进入Manger App(输入用户名和密码)
首次进入需要先进行设置(F:\Tomcat\tomcat\conf\tomcat-users.xml)加入以下代码
<role rolename="manager-gui"/>
<user username="tomcat" password="s3cret" roles="manager-gui"/>
关闭后重启tomcat8w.exe,再次进入后使用相应的用户名和密码登录即可
在Deploy栏目中,直接部署easyrec项目文件(easyrec-web.war从官网下载对应版本后解压即可获得)
部署完成之后,浏览器地址栏输入http://localhost:8080/easyrec-web/进入配置阶段(4步,如果没有第四步)
innodb_flush_log_at_trx_commit=0
innodb_buffer_pool_size=1024M
innodb_log_file_size=250M
innodb_log_buffer_size=16M
在my.ini中的[mysqld]下输入
sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
保存后,重启服务。再次配置(完成后确保能够重定向成功,如果失败,一般是sql_mode中有ONLY_FULL_GROUP_BY,去掉即可)
二:重定向成功之后(以后登录需要进入http://localhost:8080/easyrec-web/,输入用户名和密码登录)
创建新的租户,就可以直接使用创建的租户(一个租户对应一个项目),进行接口调用和后续处理
easyrec的使用一般分为:设置阶段和使用阶段(算法内置,只要使用即可)具体登录后在API下面查看(前一个是API接口调用的维基百科详情,后一个是JS接口调用的详情,一般使用第一个)
设置阶段:即时token的获取、itemtype设置、商品新增、商品间的关系设置等
使用阶段:常用的有其他人也看过、用户历史记录、社区最多查看、针对用户的推荐、用户动作发送等
三:表结构和表字段说明:参考https://wenku.baidu.com/view/7cd8ad0b83c4bb4cf7ecd1aa.html
四:注意!VIEWED_TOGETHER的优先推荐级别是最高的,远高于IS_RELATED,前者关系值10都比后者关系值100要被优先推荐,多关系指向同一个商品时候,推荐级别会被设置为最高,即使他的关系值是平均计算。(具体都由内部算法决定)
五:本人封装的一个常用接口调用的类
class EasyRec{
protected $apikey="";//API密钥
protected $tenantid="";//租户ID来识别您的网站
protected $username="";//后台登录用户名
protected $password="";//后台登录密码
protected $serverUrl="http://localhost:8080/easyrec-web";//easyrec项目地址
//封装curl请求,只需要使用到get请求
public function easy($url){
//创建curl
$ch=curl_init();
//设置curl
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
//执行curl
$output=curl_exec($ch);
//关闭curl
curl_close($ch);
return $output;
}
/**
* [生成即时token]
* @return [string] [最新的token]
*/
public function token(){
//拼接接口url
$url_token="{$this->serverUrl}/operator/signin?operatorId={$this->username}&password={$this->password}";
//获取到一个XML结果
$res= $this->easy($url_token);
//将XML先转换成json对象,然后转换成数组,取出token
$res=json_decode(json_encode(simplexml_load_string($res)),true);
//返回token字符串
return $res["token"];
}
/**
* [添加itemType:只允许使用大写,不会重复添加]
* @param [type] $itemtype [商品/文章类型]
*/
public function addType($itemtype){
$url_addType="{$this->serverUrl}/api/1.0/additemtype?apikey={$this->apikey}&tenantid={$this->tenantid}&itemtype={$itemtype}";
$res=$this->easy($url_addType);
//成功了返回空字符串''
return $res;
}
//删除itemType
public function deleteType(){
//删除一个类型会删除所有相关操作、规则等,一般不会选择删除
}
/**
* [导入或者更新文章/商品]
* @param [type] $itemid [文章ID]
* @param [type] $itemdescription [文章描述] urlencode("测试10"),文章title
* @param [type] $itemurl [文章详情页地址] urlencode("/item/article")
* @param [type] $itemimageurl [文章图片地址] urlencode("/img/covers/hua.jpg")
* @param [type] $itemtype [文章类型,默认ITEM]
*/
public function addItem($itemid,$itemdescription,$itemurl="",$itemimageurl="",$itemtype="ITEM"){
//增加或者修改文章或者商品的时候需要使用token
$token=$this->token();
//拼接接口url
$url_add="{$this->serverUrl}/api/1.0/importitem?token={$token}&tenantid={$this->tenantid}&itemid={$itemid}&itemdescription={$itemdescription}&itemurl={$itemurl}&itemimageurl={$itemimageurl}&itemtype={$itemtype}";
//发起请求
$res=$this->easy($url_add);
return $res;
}
/**
* [规则导入]
* @param [type] $itemfromid [从商品]
* @param [type] $itemtoid [到商品]
* @param [type] $assoctype [关联类型]一般使用前两种(默认VIEWED_TOGETHER)
* VIEWED_TOGETHER、IS_RELATED、PROFILE_SIMILARITY、GOOD_RATED_TOGETHER、BOUGHT_TOGETHER
* @param [type] $assocvalue [关联值0.0到100]默认100
* @param [type] $itemfromtype [从商品类型] 默认ITEM
* @param [type] $itemtotype [到商品类型] 默认ITEM
* @return [string] [description]
*/
public function rule($itemfromid,$itemtoid,$assoctype="VIEWED_TOGETHER",$assocvalue=100,$itemfromtype="ITEM",$itemtotype="ITEM"){
//规则导入的时候需要使用token
$token=$this->token();
$url_rule="{$this->serverUrl}/api/1.0/importrule?token={$token}&tenantid={$this->tenantid}&itemfromid={$itemfromid}&itemfromtype={$itemfromtype}&itemtoid={$itemtoid}&itemtotype={$itemtotype}&assoctype={$assoctype}&assocvalue={$assocvalue}";
$res=$this->easy($url_rule);
return $res;
}
/**
* [发送查看动作]
* @param [string] $apikey [API密钥]
* @param [string] $tenantid [租户ID来识别您的网站]
* @param [string] $userid [当前用户ID] "24EH1723322222Z1"
* @param [string] $sessionid [用户回话ID] "F3D4E3BE31EE3FA069F5434DB7EC2E01"
* @param [string] $itemid [文章/商品ID]
* @param [string] $itemdescription [商品描述] urlencode 文章表的文章title
* @param [string] $itemurl [文章/商品详情页面的链接] urlencode("/item/article")默认""
* @param [string] $itemimageurl [项目的图像] urlencode("/img/covers/hua.jpg")默认""
* @return [string] [用户查看文章的信息]
*/
public function view($userid,$sessionid,$itemid,$itemdescription,$itemurl="",$itemimageurl=""){
//拼接接口url
$url_view="{$this->serverUrl}/api/1.0/view?apikey={$this->apikey}&tenantid={$this->tenantid}&itemid={$itemid}&itemdescription={$itemdescription}&itemurl={$itemurl}&itemimageurl={$itemimageurl}&userid={$userid}&sessionid={$sessionid}";
//发起请求
return $this->easy($url_view);
}
/**
* [获取推荐信息(最多返回15条,结果按相关性排序)]
* @param [type] $apikey [API密钥]
* @param [type] $tenantid [租户ID来识别您的网站]
* @param [type] $userid [当前用户ID] "24EH1723322222Z1"
* @param integer $numberOfResults [记录返回数量,默认返回15条]
* @param string $requesteditemtype [推荐获得商品或文章类型,默认ITEM]
* @return [json] [获取到的推荐信息]
*/
public function rec($userid,$numberOfResults=15,$requesteditemtype="ITEM"){
//拼接接口url
$url_rec="{$this->serverUrl}/api/1.0/json/recommendationsforuser?apikey={$this->apikey}&tenantid={$this->tenantid}&userid={$userid}&numberOfResults={$numberOfResults}&requesteditemtype={$requesteditemtype}";
//发起请求
return $this->easy($url_rec);
}
/**
* [获取历史记录]
* @param [type] $apikey [API密钥]
* @param [type] $tenantid [租户ID来识别您的网站]
* @param [type] $userid [当前用户ID] "24EH1723322222Z1"
* @param [type] $numberOfResults [记录返回数量,默认返回15条]
* @return [json] [获取历史记录]
*/
public function history($userid,$numberOfResults=15){
//拼接接口url
$url_histo="{$this->serverUrl}/api/1.0/json/actionhistoryforuser?apikey={$this->apikey}&tenantid={$this->tenantid}&userid={$userid}&numberOfResults={$numberOfResults}";
//发起请求
return $this->easy($url_histo);
}
/**
* [获取查看最多]
* @param string $timeRange [时间范围:(DAY、WEEK、MONTH、ALL)]
* @param integer $numberOfResults [记录返回数量,默认返回50条]
* @return [type] [description]
*/
public function most($timeRange="All",$numberOfResults=50){
//拼接接口url
$url_most="{$this->serverUrl}/api/1.0/json/mostvieweditems?apikey={$this->apikey}&tenantid={$this->tenantid}&timeRange={$timeRange}&numberOfResults={$numberOfResults}";
//发起请求
return $this->easy($url_most);
}
}