基于 Apache Mahout 构建社会化推荐引擎

http://www.ibm.com/developerworks/cn/java/j-lo-mahout/

马 春娥, 软件工程师, IBM

马春娥,工作在 IBM 中国软件开发中心 Web 2.0 开发小组,开发人员,曾参与 Project Zero 和 Lotus Mashup Center 的开发。主要的关注点在 Web 2.0 领域的数据的建模,数据的处理,数据的可视化,Web2.0 领域的数据的语义,数据的关联等。
赵 晨婷, 软件工程师, IBM
赵晨婷,现就职于 IBM 中国软件开发中心 Web 2.0 开发小组,对 SOA、J2EE、Web 2.0 应用的开发有丰富的经验。主要关注点在数据处理、数据搜索、推荐算法和推荐系统设计等。

 简介: Web 2.0 的一个核心思想就是“群体智慧”,即基于大众行为,为每个用户提供个性化的推荐。这使得如何让用户能更快速更准确的获得所需要的信息,成为了 Web 应用成败的关键。Apache Mahout 是 ASF(Apache Software Foundation)的一个较新的开源项目,提供机器学习领域的一些经典算法的高效实现。本文主要讲述如何基于 Apache Mahout 来构建社会化推荐引擎,帮助 Web 应用开发者更高效的实现个性化推荐功能,从而提高最终用户满意度。

推荐引擎简介

推荐引擎利用特殊的信息过滤(IF,Information Filtering)技术,将不同的内容(例如电影、音乐、书籍、新闻、图片、网页等)推荐给可能感兴趣的用户。通常情况下,推荐引擎的实现是通过将用户的个人喜好与特定的参考特征进行比较,并试图预测用户对一些未评分项目的喜好程度。参考特征的选取可能是从项目本身的信息中提取的,或是基于用户所在的社会或社团环境。

根据如何抽取参考特征,我们可以将推荐引擎分为以下四大类:

  • 基于内容的推荐引擎:它将计算得到并推荐给用户一些与该用户已选择过的项目相似的内容。例如,当你在网上购书时,你总是购买与历史相关的书籍,那么基于内容的推荐引擎就会给你推荐一些热门的历史方面的书籍。
  • 基于协同过滤的推荐引擎:它将推荐给用户一些与该用户品味相似的其他用户喜欢的内容。例如,当你在网上买衣服时,基于协同过滤的推荐引擎会根据你的历史购买记录或是浏览记录,分析出你的穿衣品位,并找到与你品味相似的一些用户,将他们浏览和购买的衣服推荐给你。
  • 基于关联规则的推荐引擎:它将推荐给用户一些采用关联规则发现算法计算出的内容。关联规则的发现算法有很多,如 Apriori、AprioriTid、DHP、FP-tree 等。
  • 混合推荐引擎:结合以上各种,得到一个更加全面的推荐效果。

随着互联网上数据和内容的不断增长,人们越来越重视推荐引擎在互联网应用中的作用。可想而知,由于互联网上的数据过多,用户很难找到自己想要的信息,通过提供搜索功能来解决这个问题是远远不够的。推荐引擎可以通过分析用户的行为来预测用户的喜好,使用户能更容易找到他们潜在需要的信息。这里以电子商务应用中的推荐引擎为例来说明推荐引擎在互联网应用中的重要性。

电子商务推荐系统 (E-Commence Recommendation System) 向客户提供商品信息和购买建议,模拟销售人员帮助客户完成购买过程。智能推荐系统的作用可以概括为:将电子商务网站的浏览者转变为购买者 ,提高电子商务网站的交叉销售能力,提高客户对电子商务网站的忠诚度。

电子商务推荐系统的界面表现形式有以下几种:

  • 浏览:客户提出对特定商品的查询要求,推荐引擎根据查询要求返回高质量的推荐;
  • 相似商品:推荐引擎根据客户购物篮中的商品和客户可能感兴趣的商品推荐与它们类似的商品;
  • Email:推荐系统通过电子邮件的方式通知客户可能感兴趣的商品信息;
  • 评论:推荐系统向客户提供其他客户对相应产品的评论信息。

http://blog.youkuaiyun.com/softwarehe/article/details/7465151

 

2:使用 Taste 构建推荐引擎实例 – 电影推荐引擎

这一部分就比较头痛了,我也无法一一详细描述,中间有很多困难之处。

首先从原文下载作者提供的代码,导入到eclipse,我的eclipse是Eclipse Java EE IDE for Web Developers,版本是Indigo Service Release 2,导入之后是一堆错,这个估计每个人都不一样,自己通过google应该都能解决。我的错误都是lib下的jar包引起的,参考下面:

原文的代码使用的是mahout0.2的,这个显然太老了,我用mahout 0.5的版本替换了,从后面结果看基本无影响,但由于0.5版本有几个地方被修改了,需要修改到适应0.5版本的,到项目的属性里边修改即可。

原来的项目和tomcat相关的几个jar包,由于新版本tomcat没有common/lib目录了,需要将这几个jar包指到正确的位置,有个包还要改名字,修改后分别是:

TOMCAT_HOME/lib/jasper.jar,TOMCAT_HOME/lib/jsp-api.jar,TOMCAT_HOME/lib/servlet-api.jar,自己修改到对应的目录即可。

web.xml也有编译错误,头上几行修改为:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

这些都解决后,可以编译了,出来一堆编译错误,修改如下:

MovieDataModel.java,添加一行public final static String TIMESTAMP_COLUMN = "timestamp";这里的timestamp对应的是数据库表里边的字段名,不能乱写,再出错的super函数最后加上一个参数TIMESTAMP_COLUMN,这个编译错误消失。

数据库连接的相关参数要设置正确

MovieDataModel.java,添加一行public final static String TIMESTAMP_COLUMN = "timestamp";这里的timestamp对应的是数据库表里边的字段名,不能乱写,再出错的super函数最后加上一个参数TIMESTAMP_COLUMN,这个编译错误消失。

还有个和IDRescorer相关的编译错误,由于参数类型变了,修改为正确的类型即可,实际上这一项在项目中根本没用到,改对类型就可以了。

完成上面这些基本可以编译通过,接着出来一个新问题,项目不能导出为war

在属性里找到project facets这一项,可以在这里将项目转化为dynamic web module,java版本要选高于1.5版本的,否则会编译出错。

至此,项目可以放置到tomcat下webapps下了,但是由于转过来的版本打包后有些文件都没有打进去,我只好手工拷贝这些文件到解压目录,应该会有更好的方法,不过我java刚学不久,不知道怎么做,主要拷贝了web.xml,index.html

到这一步,在浏览器里访问website:8080/MovieSite应该能看到登录页面了,但登录肯定会告诉你something wrong,是最后出大招的时候了。

3:初始化数据库

无法登录是因为数据库中无初始数据,需要自己加,怎么加呢?原文肯定没有了,幸好有好人写了个程序,http://www.cnblogs.com/abelstronger/articles/2093847.html

从上面的链接下载到程序之后,需要自己编译3个程序添加数据到数据库,代码自己看,有java基础的应该很容易知道怎么做,如果DBUtils.java报getJDBCConnection找不到,加入下面代码:

public static  Connection getJDBCConnection()
    {
        String driverClassName = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost/movie";
        String username = "username";     //修改为你自己用户名
        String password = "password";      //修改为你自己密码

        Connection conn = null;

        try {
            Class.forName(driverClassName);
            conn = DriverManager.getConnection(url, username, password);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return conn;
    }

    public static void closeConnection(Connection conn)
    {
        if(conn!=null)
        {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

数据库的添加和表的创建参考原文即可。

4:数据源配置:

数据元配置我与文中第二个链接有所不同,

我在eclipse中的新建的tomcat的server.xml和context.xml中做一下修改:

server.xml的HOST之间加入:::

  <resource-ref>
  <description>DB Connection Pool</description>
  <res-ref-name>jdbc/movie</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
  </resource-ref> 
 <Context docBase="MovieSite" path="/MovieSite" reloadable="true" source="org.eclipse.jst.jee.server:MovieSite"/>

context.xml的Context内加入:

 <Resource auth="Container" defaultTransactionIsolation="READ_COMMITTED" driverClassName="com.mysql.jdbc.Driver" maxActive="15" maxIdle="7" name="jdbc/movie" password="sa" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/movie" username="root" validationQuery="Select 1"/>

然后运行,错误就没有了。

但是忽然发现页面无法显示,原因是,index.html未加入,同时把style,js,css,图片内容加入即可,但是推荐的算法好像相对比较慢!!

运行视图在xml

http://www.cnblogs.com/abelstronger/articles/2093847.html

中给出如何将电影数据导入mysql中。

 

转载于:https://www.cnblogs.com/justinchinawz/archive/2012/08/14/2638832.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值