Js操作DOM元素和得到浏览器高宽电子商务

 网页可见区域方便: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

贪图 6. 因内容之推介结果(查看大图)

电子商务 1

终极,显示 SlopeOne
推荐引擎的引进结果,这种推荐引擎总计速度比快,效果大好,是一模一样种非凡迅猛简单的依照项目之引荐格局。

            #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;}

Apache Mahout 简介

Apache Mahout 是 Apache Software Foundation(ASF)
旗下的一个开源项目,提供一些但扩大的机器上园地经典算法的兑现,旨在救助开发人士更加方便疾速地创制智能应用程序。经典算法包括聚类、分类、协同过
滤、进化编程等等,并且,在 Mahout 的近年本被还进入了针对性 Apache Hadoop
的支撑,使这个算法可以重新便捷的运作在说话总结环境受到。

 document.getElementById是得到有指定惟一ID属性值文档中之元素。document.getElementByTagName再次来到时因素被起指定标记名的子元素的屡屡组,hasChildNodes()再次来到一个布尔值,指示元素是否出子元素,document.getElementBycClassName是收获文档中之类名元素,document.getElementsByName(elementName)
:通过name获取节点,从名字可以看到,那几个法子重回的匪是一个节点元素,而是所有同等名称的节点数组。然后,大家可由此要博得节点的某部属性来循环判断是否为要之节点。

图 3. MovieSite 工程被援的 jar 文件

电子商务 2

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

清单 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 的实例。

                        <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>

图 4 电影以及用户音讯数据模型

电子商务 3

数据模型中在以下实体:

  • Movie:表示影片,包含电影的中坚音讯:编号、名称、宣布时、类型等等。
  • User:表示用户,包含用户之着力新闻:编号、姓名、邮件等等。
  • Movie
    Reference:表示有用户指向有电影之欣赏好品位,包含用户号码、电影编号、用户的评分和评分的年华。
  • Movie
    Similarity:表示两单反影的相似度(那里的相似度是双向的),包括个别独电影编号、电影的相似度。多少个影之相似度可以透过录像的主干消息总括得到。

上边我们就是冲此数据模型设计数据库的囤和推荐引擎的 DataModel。

  1. 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); 
        } 
     }
    

     

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

贪图 2. Taste Demo 周转结果界面

电子商务 4

 

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

数码建模

此地大家想只要编一个视频推荐引擎,第一步要针对数码举办建模,分析下中干的要实体和实体间的涉及,从而设计数据库存储,程序中之近乎,以及推荐引擎的
DataModel。

            #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;
                }

清单 3. 因用户相似度的引进实现
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,总括用户之相似度,这里以 皮尔逊Correlation 算法。
  • 否用户相似度设置相似度推理方法,这里用了
    AveragingPreferenceInferrer。
  • 冲用户相似度总括用户的“邻居”,这里用同拖欠用户最近偏离呢 3
    的用户安装为该用户之“邻居”。
  • 使 用以上得到的用户相似度对象同左邻右舍用户之测算格局对象创造一个
    GenericUserBasedRecommender 的实例。一般情形下,这时还使用
    CachingRecommender 为 RecommendationItem
    举办缓存,从而加强访问速度。

以JavaScript中,日常会来赢得Document文档元素,是 HTML
文档对象模型的英文缩写,Document Object Model for
HTML,是依据浏览器编程,HTML DOM 定义了用于 HTML
的一致多级专业的对象,以及走访和处理 HTML 文档的正式方法。

Taste 的安装和简单的 Demo 实现

设置 Taste 的软件需要:

  • 万一用 build 源代码或者例子,需要 Apache Ant 1.5+ 或 Apache Maven
    2.0.10+。
  • 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 的无限酷内存设置也
    1024M,MAVEN_OPTS=-Xmx1024M。假如用在 汤姆cat
    下运行,可以于推行”mvn package”后,将 taste-web/target 目录下转移的
    war 包拷贝到 汤姆cat 的 webapp 下,同时也需将 Java 的尽特别内存设置为
    1024M,JAVA_OPTS=-Xmx1024M,然后启动 Tomcat。
  9. 访问“http://localhost:8080
    /[your_app]/RecommenderServlet?userID=1”,拿到系统啊编号为 1
    的用户的引进内容。参看图 2,Taste demo
    运行结果界面,每一行首先桩是援引引擎预测的评分,第二项是影片之号子。
  10. 同时,Taste 还提供 Web 服务走访接口,通过以下 URL 访问:

    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;}

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

        </style>
    </head>
    <body>
        <div id=”header”><a
href=”#”><h3>      全体货分类</h3></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=”#”>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平板电脑          ></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=”#”>FireGALAXY Tab          ></a></p>
                        <p><a
href=”#”>Kindle电子阅读器   ></a></li>
                        <p><a
href=”#”>Fire三星GALAXY Tab          ></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”>

抽取 Taste 工具包

直接纳 Mahout 的花色条件举行编码,需要拔取 Ant 或者 Maven
举办编译,整个过程相比较复杂,这里我们用构建推荐引擎所急需的工具确保从
Mahout 工程中抽取出来,从而有利于之构建由定义的推荐引擎。

当 Eclipse 中成立 Web 应用之工 MovieSite,将 demo 时此外推介引擎 Web
应用的 war 包解压缩,将 lib 下之 jar 文件拷贝到 MovieSite 的 lib
目录下。这样我们虽可一本万利的编辑好的推荐引擎。

        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>

Taste 工作规律

  childNodes
反回当前元素所有子元素的多次组,firsChild再次来到时因素的首先个下级子元素,lastChild反回当前因素的末尾一个子元素,nextSibling
再次回到紧跟以现阶段元素前面的要素,nodeValue指定表元素,的读/写属性
parentNode指定表示元素的父节点
previousSibling重临紧邻当前元素以前的素。

以 Taste 构建推荐引擎实例 – 电影推荐引擎

依照上边的步调,我们得拿走一个简约的引进引擎 demo
环境,下边介绍如何运用 Taste 方便地构建从定义之推介引擎。

思量得浏览器的小幅如下:

推荐引擎简介

推荐引擎利用独特的消息过滤(IF,Information
Filtering)技术,将不同之情(例如电影、音乐、书籍、音讯、图片、网页等)推荐给或感兴趣的用户。平时意况下,推荐引擎的兑现是透过将用户
的私房喜欢和特定的参阅特征举办相比,并准备预测用户指向片勿评分项目的欢喜好水平。参考特征的接纳可能是于项目我的信中提的,或是基于用户所在的社
会或社团环境。

基于什么抽取参考特征,我们好将推荐引擎分为以下四非凡接近:

  • 依照内容的推荐引擎:它将计得到并援引给用户有跟该用户已经选了的门类一般之始末。例如,当您以网上购书时,你连买和史有关的书本,那么依据内容的引进引擎就会给你推荐一些热点之史方面的书籍。
  • 基于共同过滤的引荐引擎:它以推荐给用户有与该用户品味相似之其他用户喜欢的始末。例如,当你在网上买衣裳平常,基于联合过滤的引荐引擎会依照你的历史购买记录或浏览记录,分析发生公的登品位,并找到与君品味相似的有用户,将她们浏览以及进货之行装推荐给你。
  • 因关联规则的引进引擎:它用引进给用户有运用关联规则意识算法总计爆发的内容。关联规则之发现算法来广大,如
    Apriori、AprioriTid、DHP、FP-tree 等。
  • 错落推荐引擎:结合以上各样,得到一个一发圆满的引进效果。


着互联网及数据以及内容的不断增强,人们越来越重视推荐引擎在互联网应用中之企图。可想而知,由于互联网上的数码了多,用户相当不便找到好想假使的信,通过提
供搜索效果来缓解者题材是遥远不够的。推荐引擎可以通过分析用户之行为来预测用户的爱好,使用户会更易找到她们潜在内需的信。这里以电子商务应用中
的推介引擎也例来表达推荐引擎在互联网使用被的要。

电子商务推荐系统 (E-Commence Recommendation System)
向客户提供商品信息及采购提议,模拟销售人员协理客户就购买过程。智能推荐系统的企图可包为:将电子商务网站的浏览者转变为购买者
,进步电子商务网站的接力销售能力,提高客户对电子商务网站的忠诚度。

电子商务推荐系统的界面表现格局来以下两种植:

  • 浏览:客户指出针对性特定货物的查询要求,推荐引擎依据查询要求回高质料之推介;
  • 貌似商品:推荐引擎依据客户购物篮中的货色以及客户可能感兴趣之货色推荐和它仿佛的货品;
  • Email:推荐系统通过电子邮件的艺术通报客户可能感兴趣的商品音讯;
  • 评:推荐系统向客户提供其他客户针对相应产品之褒贬新闻。

 

因此 DOM,可以看具有的 HTML
元素,连同它们所涵盖的文件和性质。可以对里面的情节开展改动和去,同时为足以创设新的素。HTML
DOM 独立于阳台和编程语言。它只是为其他编程语言像 Java、JavaScript 和
VBScript 使用。

引进引擎实现

眼前介绍了数建模和 DataModel
的兑现,下面来详细介绍引进引擎的贯彻。如前方介绍的,Taste
既贯彻了极其主旨的基于用户之以及因内容之引荐算法,同时为提供了扩充接口,使用户可一本万利之概念跟兑现协调的推荐算法。下边详细介绍咋样扩张Taste
的引荐引擎接口,实现基于用户相似度的引进引擎,基于内容相似度的推介引擎,以及
Slope One 的推介引擎。Slope One
是同样种植相当疾速简单的依据项目之引荐方法,需要接纳用户的评分消息。

希冀 5. 基于用户之引荐结果(查看大图)

电子商务 5

附带,图 6
体现了冲内容之引荐引擎的引荐结果,推荐引擎会依照用户已经打分的影找到相似之影,推荐给当下用户。

Taste 简介

Taste 是 Apache Mahout 提供的一个齐声过滤算法的急迅落实,它是一个冲
Java 实现的可扩张的,高效之引荐引擎。Taste
既贯彻了无限主题的基于用户的以及因内容之推介算法,同时为提供了扩张接口,使用户可便宜之概念跟实现协调的引进算法。同时,Taste
不仅仅只有适用于 Java 应用程序,它可以当做其中服务器的一个组件为 HTTP 和
Web 瑟维斯(Service) 的款型为外侧提供推荐的逻辑。Taste
的设计要其会知足集团对引进引擎在性、灵活性和可扩张性等方面的要求。

清单 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 作为推荐引擎的响应格式。

用户界面突显

贯彻一个引进引擎的结尾一步就是是编客户端代码,为影片推荐引擎提供一个和好的用户界面。下边显示一下咱吧影片推荐引擎写的一个简短的用户界面:左侧藏黄色框中之是欠用户都打分的视频列表,左边红色框中是引进引擎也用户推荐的影列表。

率先,显示一下基于用户的引进引擎的引进结果,推荐引擎会按照用户已打分的影片找到用户的“邻居”,将“邻居”们于欣赏的影视推荐给当下用户。

祈求 7. SlopeOne 实现的推荐结果(查看大图)

电子商务 6

 

清单 4. 因内容相似度的推介实现
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 的集合生成一个内容相似度 ItemSimilarity。
  3. 创 建一个 EmbededItemBasedRecommender 实例,它是一个中间类,包含一个
    GenericItemBasedRecommender 实例,它的 recommend 方法吃,先从
    DataModel 中拿走该用户评分的影视列表,然后调用
    GenericItemBasedRecommender 中的 mostSimilarItems
    方法统计发生极相似之电影推荐给用户。
图 1. Taste 底要害组件图

电子商务 7

Taste 由以下五独重要的组件组成:

  • DataModel:DataModel
    是用户喜爱好音讯的架空接口,它的切切实实贯彻援助于随机档次的数据源抽取用户喜爱好音讯。Taste
    默认提供 JDBCDataModel 和
    FileDataModel,分别辅助由数据库暨文件被读取用户之爱惜好音讯。
  • UserSimilarity 和 ItemSimilarity:UserSimilarity
    用于定义两单用户中的相似度,它是遵照联合过滤的引荐引擎的大旨部分,可以为此来算用户之“邻居”,那里大家将和当下用户口味一般的用户称他的街坊。
    ItemSimilarity 类似之,统计内容里的相似度。
  • UserNeighborhood:用于因用户相似度的引进方法吃,推荐的始末是依据找到与眼前用户喜爱好相似的“邻居用户”的办法发出的。UserNeighborhood
    定义了规定邻居用户的点子,具体贯彻一般是冲 UserSimilarity
    总结拿到的。
  • Recommender:Recommender 是推荐引擎的空洞接口,Taste
    中之主导组件。程序中,为其提供一个
    DataModel,它可以总结发生对两样用户的推荐内容。实际接纳被,首要用她的兑现类
    GenericUserBasedRecommender 或者
    GenericItemBasedRecommender,分别实现基于用户相似度的推介引擎或依照内容之推介引擎。

引进引擎 API 设计及贯彻

完 成了推介引擎的计划性及落实,下边我们得统筹有些 REST
API,向他透露推荐效用。为了增强推荐引擎的处理效率,那里以 Singleton
情势实现一个推荐引擎的单例 MovieRecommenderSingleton。在 Servlet
启动之早晚初叶化推荐引擎的单例,将来每回调用推荐方法。

图 4. 就此 Poster 测试 Servlet 的结果(查看大图)

电子商务 8

总结

方今几乎拥有大型的电子商务系统,都不可同日而语档次地采纳了各个花样的推介引擎。推荐技术之以,不仅大大的增高了用户购物的体会,扩张了用户之胶在过,而且电子
商务集团为是因为推荐系统的接纳而大大的增强了接力销售的或许,从而大大的加强了营业额。今天,你生出温馨之货色推荐系统么?

借鉴于电子商务的
成功经验,我们可将引进技术运用至其他的世界。像咱以篇章中所示范的这样,你可以创立一个电影之引荐引擎。即使您是一个
blogger,那么你可创造一个博客的推介引擎,假设您是一个新闻提供商,你得运用推荐技术吧歧之用户推荐其恐怕关注的新闻,等等。

今,你推荐了么?

Leave a Comment.