- Day 1: Bower - 管理你的客户端依赖关系
- Day 2: AngularJS - 对 AngularJS 的初步认识
- Day 3: Flask - 使用 Python 和 OpenShift 进行即时 Web 开发
- Day 4:PredictionIO - 如何创建一个博客推荐器
- Day 5: GruntJS - 重复乏味的工作总会有人做(反正我不做)
- Day 6:在 Java 虚拟机上使用 Grails 进行快速 Web 开发
- Day 7: GruntJS 在线重载 提升生产率至新境界
- Day 8: Harp.JS - 现代静态 web 服务器
- Day 9: TextBlob - 对文本进行情感分析
- Day 10: PhoneGap - 开发手机应用如此简单
- Day 11: AeroGear 推送服务器:使应用的通知推送变得简单
- Day 12: OpenCV - Java 开发者的人脸检测
- Day 13: Dropwizard - 非常棒的 Java REST 服务器栈
- Day14:使用斯坦福 NER 软件包实现你自己的命名实体识别器(Named Entity Recognition,NER)
- Day 15:Meteor - 从零开始创建一个 Web 应用
- Day 16: Goose Extractor - 好用的文章提取工具
- Day 17: 使用 JBoss Forge 和 OpenShift 构建部署 JAVA EE 6 应用
- Day 18: BoilerPipe - Java 开发者的文章提取工具
- Day 19: EmberJS 入门指南
- Day 20: 斯坦福 CoreNLP - 用 Java 给 Twitter 进行情感分析
- Day 21:Docker 入门教程
- Day 22: 使用 Spring、MongoDB 和 AngularJS 开发单页面应用
- Day 23:使用 TimelineJS 构建精美的时间轴
- Day 24: 使用 Yeoman 自动构建 Ember 项目
- Day 25: 联合 Tornado、MongoDB 和 AngularJS 进行应用开发
- Day 26: TogetherJS - 让我们一起来编程!
- Day 27: Restify - 在 Node.js 中构建正确的 REST Web 服务
- Day 28: OpenShift 的 Eclipse 集成
- Day 29:编写你的第一个 Google Chrome 扩展程序
- Day 30: Play Framework - Java 开发者的梦想框架
Day 4:PredictionIO - 如何创建一个博客推荐器
-
今天是 “30 天学习 30 种新技术” 的第 4 天。到目前为止我很享受,而且周围开发者反响也很不错。我现在更有动力在 30 天内完成它了。在这篇文章中,我将介绍如何在 Java 下使用 PredictionIO 来简单地构建一个博客推荐引擎。我没找到太多在 Java 下使用 PredictionIO 的文档。所以,本文对那些寻找在 Java 下使用 PredictionIO 的完整教程的人可能会有用。“30 天学习 30 种新技术”系列文章的目录可以在 这里 找到。
PredictionIO 是什么?
PredictionIO 是一个用 Scala 编写的开源机器学习服务器应用,可以帮助你方便地使用 REST API 搭建推荐引擎。它同时也提供了客户端 SDK,封装了 REST API。Java、Python、Ruby 和 PHP 都有客户端 SDK。PredictionIO 的核心使用 Apache Mahout。 Apache Mahout 是一个可伸缩的机器学习库,它提供众多聚集、分类、过滤算法。Apache Mahout 可以在分布式的 Hapoop 集群上运行这些算法。
作为用户,我们不需要操心这些细节。我们只需安装 PredictionIO 然后使用它就是了。欲知详情,请读 文档 。
我为什么要关心 PredictionIO?
我决定学习 PredictionIO 是因为我想使用一个可以帮助我加上机器学习功能的库。PredictionIO 有助于实施诸如推荐有意思的内容、发现相似内容之类的功能。
安装 PredictionIO
在文档中提及了很多安装 PredictionIO 的方法。我使用 Vagrant,这样我就不会搞乱我的系统,同时不用自己配置所有的东西。
- 下载适合你的操作系统的最新版的 vagrant: http://downloads.vagrantup.com/
- 下载并安装 VirtualBox。 请参考 https://www.virtualbox.org/wiki/Downloads
- 下载最新的包含 PredictionIO 的 vagrant 包: https://github.com/PredictionIO/PredictionIO-Vagrant/releases
- 解压缩
PredictionIO-x.x.x.zip
。其中包括了设置 PredictionIO 所需要的脚本。打开命令行终端,转到 PredictionIO-x.x.x 目录。
vagrant 脚本将首先下载 Ubuntu vagrant box,接着安装依赖 - MongoDB、Java、Hadoop 和 PredictionIO 服务器。这很耗时间(取决于网速)。如果你所在的位置网络不稳定,我建议你使用 wget 下载。wget 命令支持断点续传。使用如下命令将 precise64 box 下载到适当的位置:
wget -c http://files.vagrantup.com/precise64.box
等待下载完成之后,打开 Vagrantfile
,修改 config.vm.box_url
,指向下载目录,例如:
config.vm.box_url = "/Users/shekhargulati/tools/vagrant/precise64.box"
现在只需 vagrant up
就可以开始安装进程了。取决于你的网速,这会花一些时间。
接着我们将按照文档所言创建一个管理员账户 http://docs.prediction.io/current/installation/install-predictionio-with-virtualbox-vagrant.html#create-an-administrator-account
可以通过 http://localhost:9000/ 访问应用。阅读以下文档了解详情 http://docs.prediction.io/current/installation/install-predictionio-with-virtualbox-vagrant.html#accessing-predictionio-server-vm-from-the-host-machine PredictionIO 应用会要求你登录。登录之后,你会见到如下所见的面板。
创建 PredictionIO 应用
作为开始,我们创建一个博客推荐应用。点击“Add an App”按钮,输入应用名“blog-recommender”。
应用创建后,你可以在如下所示的 Applications
里看到。
接着点击 Develop
,你将看到应用的详情。重要的信息是 App Key。你编写应用的时候需要这个。
应用案例
我们正要实现的用例和亚马逊的“购买此商品的顾客也同时购买”功能很相似。我们要实现的是“浏览此博客的读者也同时浏览”功能。
开发博客推荐的 Java 应用
既然我们已经创建了 PredictionIO 应用,那么该是时候编写我们的 Java 应用了。我们使用 Eclipse 来开发这个应用。我使用的是 Eclipse Kepler,内建了 m2eclipse 集成。通过 文件 > 新建 > Maven 项目 创建一个基于 Maven 的项目。选择 maven-archetype-quickstart
,然后输入 Maven 项目的详细信息。用下面的内容替换 pom.xml
。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelversion>
<groupId>com.shekhar</groupid>
<artifactId>blog-recommender</artifactid>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>blog-recommender</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceencoding>
</properties>
<dependencies>
<dependency>
<groupId>io.prediction</groupid>
<artifactId>client</artifactid>
<version>0.6.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupid>
<artifactId>maven-compiler-plugin</artifactid>
<version>3.1</version>
<configuration>
<!-- http://maven.apache.org/plugins/maven-compiler-plugin/ -->
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
上面的内容中值得注意的是 PredictionIO Java API 和 Maven 的依赖关系。
现在我们将编写一个类,在 PredictionIO 中插入数据。这个类是这样子的。
package com.shekhar.blog_recommender;
import io.prediction.Client;
import io.prediction.CreateItemRequestBuilder;
public class BlogDataInserter {
private static final String API_KEY = "wwoTLn0FR7vH6k51Op8KbU1z4tqeFGZyvBpSgafOaSSe40WqdMf90lEncOA0SB13";
public static void main(String[] args) throws Exception {
Client client = new Client(API_KEY);
addUsers(client);
addBlogs(client);
userItemViews(client);
client.close();
}
private static void addUsers(Client client) throws Exception {
String[] users = { "shekhar", "rahul"};
for (String user : users) {
System.out.println("Added User " + user);
client.createUser(user);
}
}
private static void addBlogs(Client client) throws Exception {
CreateItemRequestBuilder blog1 = client.getCreateItemRequestBuilder("blog1", new String[]{"machine-learning"});
client.createItem(blog1);
CreateItemRequestBuilder blog2 = client.getCreateItemRequestBuilder("blog2", new String[]{"javascript"});
client.createItem(blog2);
CreateItemRequestBuilder blog3 = client.getCreateItemRequestBuilder("blog3", new String[]{"scala"});
client.createItem(blog3);
CreateItemRequestBuilder blog4 = client.getCreateItemRequestBuilder("blog4", new String[]{"artificial-intelligence"});
client.createItem(blog4);
CreateItemRequestBuilder blog5 = client.getCreateItemRequestBuilder("blog5", new String[]{"statistics"});
client.createItem(blog5);
CreateItemRequestBuilder blog6 = client.getCreateItemRequestBuilder("blog6", new String[]{"python"});
client.createItem(blog6);
CreateItemRequestBuilder blog7 = client.getCreateItemRequestBuilder("blog7", new String[]{"web-development"});
client.createItem(blog7);
CreateItemRequestBuilder blog8 = client.getCreateItemRequestBuilder("blog8", new String[]{"security"});
client.createItem(blog8);
CreateItemRequestBuilder blog9 = client.getCreateItemRequestBuilder("blog9", new String[]{"ruby"});
client.createItem(blog9);
CreateItemRequestBuilder blog10 = client.getCreateItemRequestBuilder("blog10", new String[]{"openshift"});
client.createItem(blog10);
}
private static void userItemViews(Client client) throws Exception {
client.identify("shekhar");
client.userActionItem("view","blog1");
client.userActionItem("view","blog4");
client.userActionItem("view","blog5");
client.identify("rahul");
client.userActionItem("view","blog1");
client.userActionItem("view","blog4");
client.userActionItem("view","blog6");
client.userActionItem("view","blog7");
}
}
上面展示的类主要做了这些事:
- 我们创建了一个 Client 类的实例。Client 类封装了 PredictionIO 的 REST API。我们需要将 PredictionIO 博客推荐应用的
API_KEY
提供给它。 - 接着我们利用 Client 实例创建了两个用户。这两个用户在 PredictionIO 应用中创建。只有
userId
是必须要填上的。 - 在此之后我们利用 Clinet 实例添加了 10 个博客。博客同样在 PredictionIO 应用中创建。当创建一项事物的时候,你只需传递两样东西 -
itemId
和itemType
。blog1
,...blog10
是itemId
,而javascript
、scala
等是itemType
。 - 然后我们对创建的事物施加一些行动。用户
shekhar
浏览了blog1
、blog2
和blog4
,而用户rahul
则浏览了blog1
、blog4
、blog6
和blog7
。 - 最后,我们关闭了 cilent 实例。
将这个类作为 Java 应用程序运行。它会在 PredictionIO 中插入记录,你可以通过查看面板来确认这一点。
既然数据已经插入了我们的 PredictionIO 应用了,我们需要在我们的应用中添加引擎。点击 Add an Engine
按钮。如下所示,选择 Item Similarity Engine
。
然后创建 Item Similarity Engine
,输入 engine1
作为名称。
按下 Create
按钮之后 Item Similarity Engine
就创建好了。现在你可以改动一些配置,不过我们将使用默认配置。进入 Algorithms 标签,你会看到引擎尚未运行。点击 Train Data Model Now
可运行引擎。
等上一段时间。数据模型训练完成之后,你会看到状态已经变成 Running 了。
我们要解决的问题是基于用户访问过的博客向用户推荐博客。在下面的代码中,我们获取了对 userId shekhar
而言 blog1
的相似项。
import io.prediction.Client;
import java.util.Arrays;
public class BlogrRecommender {
public static void main(String[] args) throws Exception {
Client client = new Client("wwoTLn0FR7vH6k51Op8KbU1z4tqeFGZyvBpSgafOaSSe40WqdMf90lEncOA0SB13");
client.identify("shekhar");
String[] recommendedItems = client.getItemSimTopN("engine1", "blog1", 5);
System.out.println(String.format("User %s is recommended %s", "shekhar", Arrays.toString(recommendedItems)));
client.close();
}
}
运行此 Java 程序,你会看到结果: blog4
、 blog5
、 blog6
和 blog7
。
正如你在上面的例子中看到的,为应用增加推荐功能很容易。我会在我未来的项目中使用 PredictionIO,我也会花更多的时间学习和使用 PredictionIO。
这就是今天的内容。请多多回馈。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论