[转] 基于 电子商务Apache Mahout 营造社会化推荐引擎

在JavaScript中,日常会来获得Document文档成分,是 HTML
文书档案对象模型的英文缩写,Document Object Model for
HTML,是依照浏览器编制程序,HTML DOM 定义了用来 HTML
的一多种标准的靶子,以及走访和拍卖 HTML 文书档案的标准措施。

来源:http://www.ibm.com/developerworks/cn/java/j-lo-mahout/index.html

通过 DOM,能够访问具有的 HTML
成分,连同它们所蕴涵的文本和总体性。能够对里面包车型地铁始末张开改变和删除,同时也足以创设新的因素。HTML
DOM 独立于阳台和编制程序语言。它可被此外编制程序语言举个例子 Java、JavaScript 和
VBScript 使用。

推介引擎简单介绍

推介引擎利用十一分规的消息过滤(IF,Information
Filtering)本领,将分裂的内容(举例电影、音乐、书籍、新闻、图片、网页等)推荐给可能感兴趣的用户。平日情况下,推荐引擎的得以达成是因此将用户
的私有喜好与特定的参照特征举办比较,并意欲预测用户对1部分未评分项目标喜好水平。参考特征的抉择或者是从项目作者的新闻中提取的,或是基于用户所在的社
会或组织情状。

依据什么抽出参考特征,大家得以将引入引擎分为以下四大类:

  • 据悉内容的推荐介绍引擎:它将计算得到并推荐给用户一些与该用户已选拔过的体系一般的内容。举个例子,当您在网络购书时,你总是购买与正史有关的图书,那么根据内容的推荐介绍引擎就会给你推荐一些紧俏的历史方面包车型大巴书本。
  • 听大人讲联合过滤的推荐介绍引擎:它将引入给用户一些与该用户品味相似的别的用户喜欢的始末。例如,当您在网络买时装时,基于共同过滤的引进引擎会依照你的历史购买记录或是浏览记录,分析出您的穿着品位,并找到与你品尝相似的一部分用户,将她们浏览和购买的衣裳推荐给你。
  • 基于关联规则的推荐介绍引擎:它将引入给用户一些施用关联规则意识算法总计出的始末。关联规则的觉察算法有大多,如
    Apriori、AprioriTid、DHP、FP-tree 等。
  • 混合推荐引擎:结合以上种种,获得三个特别健全的引入效果。


着互联互连网数据和剧情的缕缕增高,人们尤其重视推荐引擎在网络应用中的成效。同理可得,由于互联英特网的数目过多,用户很难找到本身想要的信息,通过提
供搜索效果来消除那些标题是遥远不够的。推荐引擎能够透过分析用户的表现来预测用户的喜好,使用户能更易于找到他们潜在内需的新闻。那里以电子商务应用中
的引荐引擎为例来注脚推荐引擎在网络使用中的首要性。

电子商务推荐系统 (E-Commence Recommendation System)
向客户提供商品消息和选购建议,模拟贩卖人士扶助客户变成购买进程。智能推荐系统的职能能够包罗为:将电子商务网址的浏览者转变为购买者
,升高电子商务网站的穿插发卖才干,升高客户对电子商务网址的忠诚度。

电子商务推荐系统的分界面表现情势有以下两种:

  • 浏览:客户提议对特定物品的查询要求,推荐引擎依照查询要求回到高水平的推荐介绍;
  • 一般商品:推荐引擎依照客户购物篮中的货物和客户大概感兴趣的货色推荐与它们仿佛的货品;
  • Email:推荐系统经过电子邮件的法子通告客户或者感兴趣的商品消息;
  • 讲评:推荐系统向客户提供任何客户对相应产品的评头品足新闻。

 

  childNodes
反回当前因素全部子成分的数组,firsChild重返当前成分的首先个下级子成分,lastChild反回当前因素的结尾二个子成分,nextSibling
再次来到紧跟在当下成分前边的因素,nodeValue钦命表成分,的读/写属性
parentNode钦定表示成分的父节点
previousSibling重临紧邻当前成分从前的要素。

Apache Mahout 简介

Apache Mahout 是 Apache Software Foundation(ASF)
旗下的八个开源项目,提供一些可扩展的机械学习世界卓越算法的贯彻,目的在于匡助开荒职员尤其方便飞快地创立智能应用程序。特出算法包蕴聚类、分类、协同过
滤、进化编程等等,并且,在 Mahout 的近年来版本中还参预了对 Apache Hadoop
的支撑,使这几个算法可以更快捷的运作在云计算意况中。

 document.getElementById是获取有钦命惟一ID属性值文书档案中的元素。document.getElementByTagName重临当前成分中有钦命标识名的子成分的数组,hasChildNodes()再次回到1个布尔值,提示成分是或不是有子成分,document.getElementBycClassName是获得文书档案中的类名成分,document.getElementsByName(elementName)
:通过name获取节点,从名字能够观察,那么些情势再次来到的不是一个节点成分,而是兼具一样名称的节点数组。然后,大家得以经过要拿走节点的某部属性来循环判定是不是为须要的节点。

Taste 简介

Taste 是 Apache Mahout 提供的贰个壹并过滤算法的便捷落到实处,它是三个基于
Java 达成的可扩展的,高效的引入引擎。Taste
既达成了最主旨的依附用户的和凭借内容的推荐介绍算法,同时也提供了扩充接口,使用户能够壹本万利的概念和兑现协和的引荐算法。同时,Taste
不仅仅只适用于 Java 应用程序,它能够看成内部服务器的2个零部件以 HTTP 和
Web Service 的款型向外面提供推荐的逻辑。Taste
的筹算使它能餍足公司对引入引擎在性质、灵活性和可扩大性等方面包车型客车需要。

想得到浏览器的宽窄如下:

Taste 职业原理

 网页可知区域宽:document.body.clientWidth
网页可知区域高:document.body.clientHeight
网页可知区域宽:document.body.offsetWidth (蕴涵边线的宽)
网页可知区域高:document.body.offsetHeight (包罗边线的宽)
网页正文全文宽:document.body.scrollWidth
网页正文全文高:document.body.scrollHeight
网页被卷去的高:document.body.scrollTop
网页被卷去的左:document.body.scrollLeft
网页正文部分上:window.screenTop
网页正文部分左:window.screenLeft
荧屏分辨率的高:window.screen.height
显示屏分辨率的宽:window.screen.width
荧屏可用专门的学问区高度:window.screen.availHeight
荧屏可用职业区宽度:window.screen.availWidth

图 1. Taste 的要害组件图

电子商务 1

Taste 由以下四个不可或缺的机件组成:

  • DataModel:DataModel
    是用户喜好新闻的画饼充饥接口,它的具体贯彻援助从随机等级次序的数据源抽取用户喜好新闻。Taste
    暗许提供 JDBCDataModel 和
    FileDataModel,分别援救从数据库和文书中读取用户的喜好音讯。
  • UserSimilarity 和 ItemSimilarity:UserSimilarity
    用于定义多个用户间的相似度,它是依附共同过滤的引入引擎的骨干部分,能够用来测算用户的“邻居”,那里我们将与近来用户口味一般的用户称为他的邻里。
    ItemSimilarity 类似的,计算内容之间的相似度。
  • UserNeighborhood:用于基于用户相似度的推荐介绍形式中,推荐的始末是基于找到与近日用户喜好相似的“邻居用户”的不二秘籍发生的。UserNeighborhood
    定义了规定邻居用户的方式,具体贯彻一般是基于 UserSimilarity
    总括获得的。
  • Recommender:Recommender 是引入引擎的空洞接口,Taste
    中的主题零部件。程序中,为它提供三个DataModel,它能够测算出对两样用户的推荐介绍内容。实际利用中,首要采取它的落成类
    GenericUserBasedRecommender 只怕GenericItemBasedRecommender,分别达成基于用户相似度的引荐引擎或然依据内容的引入引擎。

  下边用三个电子商务的网页来具体讲一下:

Taste 的设置与简便的 德姆o 达成

设置 Taste 的软件必要:

  • 假定急需 build 源代码或然例子,供给 Apache Ant 一.伍+ 或 Apache Maven
    二.0.十+。
  • Taste 应用程序须求 Servlet
    2.3+
    容器,例如
    Jakarta Tomcat
  • Taste 中的 MySQLJDBCDataModel 得以达成内需 MySQL
    4.x+
    数据库。

安装 Taste 并运行 Demo:

  1. 从 SVN 或是下载压缩包拿走 Apache Mahout 的揭露版本:
  2. 从 Grouplens 下载数据源:“1 Million MovieLens
    Dataset”
  3. 解 压数据源压缩包,将 movie.dat 和 ratings.dat 拷贝到 Mahout
    安装目录下的 taste-web/src/
    main/resources/org/apache/mahout/cf/taste/example/grouplens 目录下。
  4. 再次来到在 core 目录下,运行”mvn install”,将 Mahout core
    安装在本地库中。
  5. 进入 taste-web, 拷贝 ../examples/target/grouplens.jar 到
    taste-web/lib 目录
  6. 编辑 taste-web/recommender.properties,将 recommender.class 设置为
    org.apache.mahout. cf.taste.example.grouplens.GroupLensRecommender。
  7. 在 Mahout 的装置目录下,运行”mvn package”。
  8. 运 行“mvn jetty:run-war”。那里需求将 Maven 的最大内部存款和储蓄器设置为
    10二四M,MAVEN_OPTS=-Xmx拾2肆M。如若急需在 汤姆cat
    下运作,能够在实践”mvn package”后,将 taste-web/target 目录下转移的
    war 包拷贝到 汤姆cat 的 webapp 下,同时也供给将 Java 的最大内部存储器设置为
    102四M,JAVA_OPTS=-Xmx十二4M,然后运转 汤姆cat。
  9. 访问“http://localhost:8080
    /[your_app]/RecommenderServlet?userID=一”,获得系统为编号为 1的用户的引入内容。参看图 二,Taste demo
    运营结果分界面,每壹行首先项是推荐引擎预测的评分,第三项是电影的号码。
  10. 还要,Taste 还提供 Web 服务走访接口,通过以下 U昂CoraL 访问:

    http://localhost:8080/[your_app]/RecommenderService.jws

    WSDL
    文件:http://localhost:8080/[your_app]/RecommenderService.jws?wsdl

    也足以因而轻松的 HTTP 请求调用那一个 Web 服务:

    http://localhost:8080/[your_app]/RecommenderService.jws?method=recommend&userID=1&howMany=10

  <html>
    <head>
        <title></title>
        <style>
            *{ margin:0; padding:0;}
            a{ text-decoration:none; color:white;}
            a:hover{color:red;}
            ul,li,ol{list-style:none; font-size:13px;
color:#fff;line-height:27px;}
            img{border:none;}
            img,input,select,textarae{vertical-align: middle}
            body{ width:1350px; margin:0 auto; font-size:12px;}
            ol li a{color:#fff;}

图 2. Taste 德姆o 运维结果分界面

电子商务 2

 

            #header{width:1350px; height:37px; background:url(122.png)
no-repeat; border-bottom:1px solid #c9c9c9; line-height:37px;}
            #main{width:1350px; height:504px; background:#f8f8f8;}
            #left{width:182px; height:500px; background:#3d4e64;
border-radius:3px;float:left;}
            #lunbo{width:1160px;
                height:300px;
                background:#f8f8f8;
                border-bottom:2px solid #666666;
                float:right;
                margin:0 auto;
                margin-top:10px;
                position:relative;}

使用 Taste 创设推荐引擎实例 – 电影推荐引擎

听他们说地点的步骤,大家能够赢得2个归纳的引荐引擎 demo
意况,上边介绍怎样运用 Taste 方便地营造自定义的引入引擎。

            #lunbo img{width:1160px;
                height:300px;
                display:none;
                position:absolute;
                z-index:5;
                }
            ul{margin-left:400px;}
            ul li{
                list-style:none;
                border:1px solid #000;
                border-radius:50%;
                width:18px;
                height:18px;
                text-align:center;
                float:left;
                margin-top:300px;
                margin-left:10px;
                z-index:15;
                }

抽取 Taste 工具包

直接运用 Mahout 的品种条件实行编码,须求动用 Ant 也许 Maven
实行编译,整个经过相比较复杂,那里大家将塑造推荐引擎所须求的工具包从
Mahout 工程中抽取出来,从而有利于的塑造自定义的推荐介绍引擎。

在 Eclipse 中开创 Web 应用的工程 MovieSite,将 demo 时生成的引荐引擎 Web
应用的 war 包解压缩,将 lib 下的 jar 文件拷贝到 MovieSite 的 lib
目录下。那样我们就足以方便的编写制定自身的推荐引擎。

        </style>
    </head>
    <body>
        <div id=”header”><a
href=”#”><h3>      全体货品归类</h三></a></div>
        <div id=”main”>
                <div id=”left”>
                    <ol style=”margin-top:12px;
margin-left:14px;”>
                        <p><a
href=”#”>Kindle电子阅读器   ></a></p>
                        <p><a
href=”#”>Fire三星平板          ></a></p>
                        <p><a
href=”#”>Kindle电子阅读器   ></a></li>
                        <p><a
href=”#”>Firesurface          ></a></p>
                        <p><a
href=”#”>Kindle电子阅读器   ></a></li>
                        <p><a
href=”#”>Fire三星平板          ></a></p>
                        <p><a
href=”#”>Kindle电子阅读器   ></a></li>
                        <p><a
href=”#”>Fire苹果平板          ></a></p>
                        <p><a
href=”#”>Kindle电子阅读器   ></a></li>
                        <p><a
href=”#”>Fire三星平板          ></a></p>
                        <p><a
href=”#”>Kindle电子阅读器   ></a></li>
                        <p><a
href=”#”>Fire三星GALAXY Tab          ></a></p>
                        <p><a
href=”#”>Kindle电子阅读器   ></a></li>
                        <p><a
href=”#”>Fire华为平板          ></a></p>
                        <p><a
href=”#”>Kindle电子阅读器   ></a></li>
                        <p><a
href=”#”>Fire华为平板          ></a></p>
                        <p><a
href=”#”>Kindle电子阅读器   ></a></li>
                        <p><a
href=”#”>Fire三星平板          ></a></p>
                    </ol>
                    
                </div>
                <div id=”lunbo”>
                        
                        <img src=”1.png”>
                        <img src=”2.png”>
                        <img src=”3.png”>
                        <img src=”4.png”>
                        <img src=”5.png”>

图 三. MovieSite 工程中引用的 jar 文件

电子商务 3

                        <ul>
                        <li
style=”background:red”onmouseover=”jin(0)”onmouseout=”chu(0)”>1</li>
                        <li
onmouseover=”jin(1)”onmouseout=”chu(1)”>2</li>
                        <li
onmouseover=”jin(2)”onmouseout=”chu(2)”>3</li>
                        <li
onmouseover=”jin(3)”onmouseout=”chu(3)”>4</li>
                        <li
onmouseover=”jin(4)”onmouseout=”chu(4)”>5</li>
                        </ul>
                </div>

多少建立模型

那里大家想要编写3个影视推荐引擎,第一步须要对数据开始展览建模,分析利用中涉及的主要性实体以及实体间的涉及,从而设计数据仓库储存款和储蓄,程序中的类,以及引入引擎的
DataModel。

                <div id=”footer”><img
src=”121.gif”/></div>
        </div>

图 四 电影和用户音讯数据模型

电子商务 4

数据模型中设有以下实体:

  • Movie:表示影片,包涵电影的为主消息:编号、名称、发表时间、类型等等。
  • User:表示用户,包罗用户的宗旨新闻:编号、姓名、邮件等等。
  • Movie
    Reference:表示有些用户对有个别电影的喜好品位,包括用户号码、电影编号、用户的评分以及评分的年月。
  • Movie
    Similarity:表示七个电影的相似度(这里的相似度是双向的),包蕴三个电影编号、电影的相似度。多个电影的相似度能够透过电影的基本消息总计获得。

上面大家就依据这几个数据模型设计数据库的存款和储蓄以及引入引擎的 DataModel。

  1. 一 .创制 MySQL
    数据库存款和储蓄电影和用户的新闻,用户的喜好音讯以及电影和电视的相似度。

    ##### 清单 1. 创制数据库 SQL

     CREATE DATABASE movie; 
     USE movie; 
     CREATE TABLE movies (  // 保存电影相关的信息。
        id INTEGER NOT NULL AUTO_INCREMENT, 
        name varchar(100) NOT NULL, 
        published_year varchar(4) default NULL, 
        type varchar(100) default NULL, 
     --    ...more movie information... 
        PRIMARY KEY (id) 
     ); 
    
     CREATE TABLE users (  // 保存用户信息
        id INTEGER NOT NULL AUTO_INCREMENT, 
        name varchar(50) NOT NULL, 
        email varchar(100) default NULL, 
     --    ...more user information... 
        PRIMARY KEY (id) 
     ); 
    
     CREATE TABLE movie_preferences (  // 保存用户对电影的评分,即喜好程度
        userID INTEGER NOT NULL, 
        movieID INTEGER NOT NULL, 
        preference INTEGER NOT NULL DEFAULT 0, 
        timestamp INTEGER not null default 0, 
        FOREIGN KEY (userID) REFERENCES users(id) ON DELETE CASCADE, 
        FOREIGN KEY (movieID) REFERENCES movies(id) ON DELETE CASCADE 
     ); 
    
     CREATE TABLE movie_similarity (   // 保存电影和电影的相似程度
        movieID1 INTEGER NOT NULL, 
        movieID2 INTEGER NOT NULL, 
        similarity DOUBLE NOT NULL DEFAULT 0, 
        FOREIGN KEY (movieID1) REFERENCES movies(id) ON DELETE CASCADE, 
        FOREIGN KEY (movieID2) REFERENCES movies(id) ON DELETE CASCADE 
     ); 
    
     CREATE INDEX movie_preferences_index1 ON movie_preferences ( userID , movieID ); 
     CREATE INDEX movie_preferences_index2 ON movie_preferences ( userID ); 
     CREATE INDEX movie_preferences_index3 ON movie_preferences ( movieID );
    

     

    在实质上接纳中,大家供给将利用中的实例数据写入到数据库中。作为例子,那里将从
    GroupLen 下载的数据源写入数据库。

  2. 统一希图实现推荐引擎的 DataModel。

    鉴于地点使用数据仓库储存款和储蓄用户的喜好音信,那里须求依靠数据库的推荐介绍引擎落成。那里扩展MySQLJDBCDataModel 完成电影推荐引擎的 DataModel 实例。

    ##### 清单 2. Taste DataModel 的实现

    public class MovieDataModel extends MySQLJDBCDataModel { 
    
        // 保存用户对电影的评分的数据库表名
        public final static String PERFERENCETABLE = "movie_preferences";  
        public final static String USERID_COLUMN = "userID";   // 表中用户标识的列名
        public final static String ITEMID_COLUMN = "movieID";  // 表中电影标识的列名
        public final static String PERFERENCE_COLUMN = "preference";  // 表中评分的列名
    
        public MovieDataModel(String dataSourceName) throws TasteException {         
            super(lookupDataSource(dataSourceName), PERFERENCETABLE, USERID_COLUMN, 
                ITEMID_COLUMN, PERFERENCE_COLUMN); 
        } 
    
        public MovieDataModel() { 
            //DBUtil.getDataSource() 将返回应用的数据源
            // 此应用是 J2EE 应用,所以这里会采用 JDNI 的方式创建数据库链接。
            super(DBUtil.getDataSource(), PERFERENCETABLE, USERID_COLUMN, 
                ITEMID_COLUMN, PERFERENCE_COLUMN); 
        } 
     }
    

     

    </body>
    <script>
        p=document.getElementsByTagName(“img”);
        l=document.getElementsByTagName(“li”);
        m=0
        onload=function(){
                    s=setInterval(“kaishi()”,850)
                    }

引入引擎达成

前方介绍了多少建立模型和 DataModel
的兑现,上边来详细介绍引入引擎的贯彻。如前方介绍的,Taste
既贯彻了最宗旨的基于用户的和基于内容的推荐算法,同时也提供了扩充接口,使用户能够便宜的定义和落到实处团结的引进算法。下边详细介绍怎么着扩充Taste
的推荐引擎接口,达成基于用户相似度的引荐引擎,基于内容相似度的引荐引擎,以及
Slope One 的引入引擎。Slope One
是一种尤其迅猛轻便的依照项目的推荐介绍方式,须要动用用户的评分音信。

        function kaishi(){
                    for(var i=0;i<5;i++){    
                                p[i].style.display=”none”;
                                l[i].style.background=”white”
                                }
                                m++;
                                if(m>=5){m=0;}
                                p[m].style.display=”block”;
                                l[m].style.background=”red”
                }
        lunbo.onmouseover=function(){clearInterval(s);}
        lunbo.onmouseout=function(){s=setInterval(“kaishi()”,850);}
        
        function jin(hand){
                        for(var i=0;i<5;i++){    
                                p[i].style.display=”none”;
                                l[i].style.background=”white”
                                }
                                m++;
                                if(m>=5){m=0;}
                                p[hand].style.display=”block”;
                                l[hand].style.background=”red”
                        }
        function chu(hand){
                m=hand;
                }
    </script>
</html>

清单 三. 依照用户相似度的引荐达成
public class UserBasedRecommender implements Recommender { 

    private final Recommender recommender; 

    public UserBasedRecommender() throws IOException, TasteException { 
        this(new MovieDataModel()); 
    } 

    public UserBasedRecommender(DataModel model) throws TasteException { 

        UserSimilarity userSimilarity = new PearsonCorrelationSimilarity(model);  
        userSimilarity.setPreferenceInferrer(new AveragingPreferenceInferrer(model)); 

        UserNeighborhood neighborhood = 
            new NearestNUserNeighborhood(3, userSimilarity, model); 
        recommender = new CachingRecommender( 
            new GenericUserBasedRecommender(model, neighborhood, userSimilarity)); 
    } 

    // 对外提供的推荐的接口,参数为用户标识和推荐项的个数
    public List<RecommendedItem> recommend(long userID, int howMany) 
        throws TasteException { 
        return recommender.recommend(userID, howMany); 
    } 

    public List<RecommendedItem> recommend(long userID, int howMany, 
        Rescorer<Long> rescorer) throws TasteException { 
        return recommender.recommend(userID, howMany, rescorer); 
    } 

    // 以下方法都是实现 Recommender 的接口
    public float estimatePreference(long userID, long itemID) throws TasteException { 
        return recommender.estimatePreference(userID, itemID); 
    } 

    public void setPreference(long userID, long itemID, float value) 
        throws TasteException { 
        recommender.setPreference(userID, itemID, value); 
    } 

    public void removePreference(long userID, long itemID) throws TasteException { 
        recommender.removePreference(userID, itemID); 
    } 

    public DataModel getDataModel() { 
        return recommender.getDataModel(); 
    } 

    public void refresh(Collection<Refreshable> alreadyRefreshed) { 
        recommender.refresh(alreadyRefreshed); 
    } 

    public String toString() { 
        return "UserBasedRecommender[recommender:" + recommender + ']'; 
    } 
 }

 

从地点的代码示例清单 三 能够观察,落成3个推荐介绍引擎供给贯彻 Recommender
接口,它一般是对此某种 Taste 提供的推荐引擎的扩张,那是对
GenericUserBasedRecommender
实行的扩展,个中最根本的措施正是实例化推荐引擎的构造方法,一般在那之中涉及以下步骤:

  • 基于 DataModel,总计用户的相似度,那里运用 PearsonCorrelation 算法。
  • 为用户相似度设置相似度推理方法,那里运用了
    AveragingPreferenceInferrer。
  • 依赖用户相似度计算用户的“邻居”,那里将与该用户近来相差为 叁的用户设置为该用户的“邻居”。
  • 使 用以上获得的用户相似度对象和邻居用户的图谋方法对象成立一个GenericUserBasedRecommender 的实例。一般情状下,那时都利用
    CachingRecommender 为 RecommendationItem
    进行缓存,从而提升访问速度。
清单 四. 基于内容相似度的引入落成
public class ItemBasedRecommender implements Recommender { 

    private final Recommender recommender; 

    public ItemBasedRecommender() throws IOException, TasteException { 
        this(new MovieDataModel()); 
    } 

    public ItemBasedRecommender(DataModel dataModel) throws TasteException { 

        Collection<GenericItemSimilarity.ItemItemSimilarity> correlations = 
            MovieSimilarityTable.getAllMovieSimilarities(); 
        ItemSimilarity itemSimilarity = new GenericItemSimilarity(correlations); 
        recommender = new CachingRecommender(new EmbededItemBasedRecommender( 
            new GenericItemBasedRecommender(dataModel, itemSimilarity))); 
    } 

    public List<RecommendedItem> recommend(long userID, int howMany) 
        throws TasteException { 
        return recommender.recommend(userID, howMany); 
    } 

     ......... 

    //EmbededItemBasedRecommender 类的定义          
    private static final class EmbededItemBasedRecommender implements Recommender { 

        // 包含一个 GenericItemBasedRecommender 实例;
        private final GenericItemBasedRecommender recommender; 

        private EmbededItemBasedRecommender(GenericItemBasedRecommender recommender) { 
            this.recommender = recommender; 
        } 

        public List<RecommendedItem> recommend(long userID,  int howMany, 
            Rescorer<Long> rescorer) 
            throws TasteException { 
            FastIDSet itemIDs = recommender.getDataModel().getItemIDsFromUser(userID); 
            return recommender.mostSimilarItems(itemIDs.toArray(), howMany, null); 
        } 

    ........ 

 }

 

从地点的代码示例清单 4 能够看到,与上二个贯彻类似它是对
GenericItemBasedRecommender 的扩展,它的构造方法涉及以下步骤:

  1. 为了拉长推荐引擎的实时响应速度,那里供给对影片音讯的预管理,将电影的相似度提前总括好存款和储蓄在数据库中的
    movie_similarity
    表中,然后从数据库中读取全数的电影的相似度,用于成立ItemItemSimilarity 的集聚。
  2. 听大人说 ItemItemSimilarity 的会集生成3个内容相似度 ItemSimilarity。
  3. 创 建二个 EmbededItemBasedRecommender 实例,它是一个之中类,蕴含二个GenericItemBasedRecommender 实例,它的 recommend 方法中,先从
    DataModel 中赢得该用户评分的电影和电视列表,然后调用
    GenericItemBasedRecommender 中的 mostSimilarItems
    方法总括出最相似的电影推荐给用户。
清单 5. SlopeOne Recommeder 的实现
public final class MovieRecommender implements Recommender { 

    private final Recommender recommender; 

    public MovieRecommender() throws IOException, TasteException { 
        this(new MovieDataModel()); 
    } 

    public MovieRecommender(DataModel dataModel) throws TasteException { 
        // 创建一个 SlopeOneRecommender 的实例
        recommender = new CachingRecommender(new SlopeOneRecommender(dataModel)); 
    } 

    // 对外提供的推荐的接口,参数为用户标识和推荐项的个数
    public List<RecommendedItem> recommend(long userID, int howMany) 
        throws TasteException { 
        return recommender.recommend(userID, howMany); 
    } 

     ........ 

 }

 

Slope One
是一种相当赶快轻松的依赖项目标引入方法,它只必要采取用户的评分音讯。具体的得以完毕,只要求在大家的推荐引擎中包罗一个SlopeOneRecommender 的实例。

引入引擎 API 设计与落到实处

完 成了推荐引擎的安排与落成,上边我们需求统一准备有个别 REST
API,向外揭示推荐功效。为了升高推荐引擎的拍卖功用,那里运用 Singleton
格局达成一个推荐引擎的单例 MovieRecommenderSingleton。在 Servlet
运营的时候开首化推荐引擎的单例,未来每趟调用推荐方式。

清单 6. Servlet 的实现
public class MovieRecommenderServlet extends HttpServlet { 

     private static final int NUM_TOP_PREFERENCES = 20; 
    private static final int DEFAULT_HOW_MANY = 20; 

    private Recommender recommender; 

    @Override 
    public void init(ServletConfig config) throws ServletException { 
        super.init(config); 

         // 从 web.xml 中读取需要创建的推荐引擎类名
        /* 
         * <servlet> 
         *      <servlet-name>movie-recommender</servlet-name> 
         *      <display-name>Movie Recommender</display-name> 
         *      <description>Movie recommender servlet</description> 
         *      <servlet-class> 
         *      com.ibm.taste.example.movie.servlet.MovieRecommenderServlet 
         *  </servlet-class> 
         *      <init-param> 
         *          <param-name>recommender-class</param-name> 
         *          <param-value> 
         *          com.ibm.taste.example.movie.recommender.UserBasedRecommender 
         *      </param-value> 
         *      </init-param> 
         *      <load-on-startup>1</load-on-startup> 
         * </servlet> 
         */ 
        String recommenderClassName = config.getInitParameter("recommender-class"); 
        if (recommenderClassName == null) { 
            throw new ServletException( 
                "Servlet init-param \"recommender-class\" is not defined"); 
        } 

         try { 
            MovieRecommenderSingleton.initializeIfNeeded(recommenderClassName); 
        } catch (TasteException te) { 
            throw new ServletException(te); 
        } 
        recommender = MovieRecommenderSingleton.getInstance().getRecommender(); 
    } 

    @Override 
    public void doGet(HttpServletRequest request, 
        HttpServletResponse response) throws ServletException { 
         //Parameters.USER_ID = "userID"
        String userIDString = request.getParameter(Parameters.USER_ID);  
        if (userIDString == null) { 
            throw new ServletException("userID was not specified"); 
        } 
        long userID = Long.parseLong(userIDString); 
        String howManyString = request.getParameter(Parameters.COUNT);      
        //Parameters.COUNT = "count"
        int howMany = howManyString == null ? DEFAULT_HOW_MANY : 
            Integer.parseInt(howManyString); 
        String format = request.getParameter(Parameters.FORMAT);      
        //Parameters.FORMAT = "format"
        if (format == null) { 
            format = "json"; 
        } 

        try { 
            // 为指定用户计算推荐的电影
            List<RecommendedItem> items = recommender.recommend(userID, howMany); 
            // 加载电影的相关信息,RecommendMovieList 是保存了一组推荐电影的相关信息和
            // 引擎计算得到的他们的 ranking 
            RecommendMovieList movieList = new RecommendMovieList(items); 
            if ("text".equals(format)) { 
                writePlainText(response, movieList); 
            } else if ("json".equals(format)) { 
                writeJSON(response, movieList); 
            } else { 
                throw new ServletException("Bad format parameter: " + format); 
            } 
        } catch (TasteException te) { 
            throw new ServletException(te); 
        } catch (IOException ioe) { 
            throw new ServletException(ioe); 
        } 

    } 
    //details please refer to the src code 
 }

 

以上落成了影片推荐引擎服务器端的编制程序,上边大家利用 FireFox 的插件 Poster
测试一下 HTTP
请求,查看推荐引擎的归来结果。对私自三个用户,推荐引擎应该依据一定的平整总括获得壹组电影以及预测的评分,为了有更好的用户体验,引擎在获得推荐介绍电影
序号的列表后,从录制新闻数据库中询问获得电影的连锁音讯,包含电影的名号,发布时间以及项目等新闻。这里大家运用
JSON 作为推荐引擎的响应格式。

图 四. 用 Poster 测试 Servlet 的结果(查看大图)

电子商务 5

用户分界面显得

贯彻二个推荐引擎的结尾一步正是编写客户端代码,为影片推荐引擎提供一个谈得来的用户分界面。上面显示一下我们为电影推荐引擎写的叁个简约的用户分界面:左边深橙框中的是该用户已经打分的影视列表,左边铁锈色框中是推荐引擎为用户推荐的摄像列表。

首先,显示一下依据用户的引荐引擎的引荐结果,推荐引擎会依照用户已打分的影视找到用户的“邻居”,将“邻居”们相比欣赏的摄像推荐给当下用户。

图 伍. 基于用户的推荐介绍结果(查看大图)

电子商务 6

附带,图 陆呈现了依据内容的推荐介绍引擎的推荐介绍结果,推荐引擎会依据用户已打分的电影找到相似的影片,推荐给当下用户。

图 陆. 依据内容的推荐结果(查看大图)

电子商务 7

最后,体现 SlopeOne
推荐引擎的推荐结果,那种推荐引擎计算速度异常快,效果很好,是一种尤其飞速轻松的依据项目标推荐介绍方式。

图 7. SlopeOne 兑现的引进结果(查看大图)

电子商务 8

 

总结

目前大概全体大型的电子商务系统,都比不上程度地运用了各类格局的引荐引擎。推荐才能的运用,不仅大大的提升了用户购物的体会,扩张了用户的粘着度,而且电子
商务公司也是因为推荐系统的使用而大大的提升了接力出卖的大概,从而大大的进步了营业额。今日,你有自个儿的货物推荐系统么?

借鉴于电子商务的
成功经验,大家得以把引入才具利用到别的的领域。像大家在篇章中所演示的那么,你能够创设三个电影的推荐引擎。若是你是1个blogger,那么您能够创立一个博客的引荐引擎,假如你是几个音信提供商,你能够选取推荐技能为分歧的用户推荐它也许关切的新闻,等等。

前日,你推荐了么?

Leave a Comment.