热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Day4:PredictionIO——如何创建一个博客推荐器

编者注:我们发现了比较有趣的系列文章《30天学习30种新技术》,准备翻译,一天一篇更新,年终礼包。下面是第四天的内容。今天是“30天学习30种新技术”的第4天。到目前为止我很享受,

编者注:我们发现了比较有趣的系列文章《30天学习30种新技术》,准备翻译,一天一篇更新,年终礼包。下面是第四天的内容。

今天是“30天学习30种新技术”的第4天。到目前为止我很享受,而且周围开发者反响也很不错。我现在更有动力在30天内完成它了。在这篇文章中,我将介绍如何在Java下使用PredictionIO来简单地构建一个博客推荐引擎。我没找到太多在Java下使用PredictionIO的文档。所以,本文对那些寻找在Java下使用PredictionIO的完整教程的人可能会有用。“30天学习30种新技术”系列文章的目录可以在这里找到。

《Day 4:PredictionIO——如何创建一个博客推荐器》

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,这样我就不会搞乱我的系统,同时不用自己配置所有的东西。

  1. 下载适合你的操作系统的最新版的vagrant:http://downloads.vagrantup.com/

  2. 下载并安装 VirtualBox。 请参考 https://www.virtualbox.org/wiki/Downloads

  3. 下载最新的包含 PredictionIO 的 vagrant包: https://github.com/PredictionIO/PredictionIO-Vagrant/releases

  4. 解压缩 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应用会要求你登录。登录之后,你会见到如下所见的面板。

《Day 4:PredictionIO——如何创建一个博客推荐器》

创建PredictionIO应用

作为开始,我们创建一个博客推荐应用。点击“Add an App”按钮,输入应用名“blog-recommender”。

《Day 4:PredictionIO——如何创建一个博客推荐器》

应用创建后,你可以在如下所示的Applications里看到。

《Day 4:PredictionIO——如何创建一个博客推荐器》

接着点击Develop,你将看到应用的详情。重要的信息是App Key。你编写应用的时候需要这个。

《Day 4:PredictionIO——如何创建一个博客推荐器》

应用案例

我们正要实现的用例和亚马逊的“购买此商品的顾客也同时购买”功能很相似。我们要实现的是“浏览此博客的读者也同时浏览”功能。

开发博客推荐的Java应用

既然我们已经创建了PredictionIO应用,那么该是时候编写我们的Java应用了。我们使用Eclipse来开发这个应用。我使用的是Eclipse Kepler,内建了m2eclipse集成。通过 文件 > 新建 > Maven项目 创建一个基于Maven的项目。选择maven-archetype-quickstart,然后输入Maven项目的详细信息。用下面的内容替换pom.xml

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.shekhar
blog-recommender
0.0.1-SNAPSHOT
jar
blog-recommender
http://maven.apache.org

UTF-8



io.prediction
client
0.6.1





org.apache.maven.plugins
maven-compiler-plugin
3.1


1.7
1.7





上面的内容中值得注意的是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");
}
}

上面展示的类主要做了这些事:

  1. 我们创建了一个Client类的实例。Client类封装了PredictionIO的REST API。我们需要将PredictionIO博客推荐应用的 API_KEY 提供给它。
  2. 接着我们利用Client实例创建了两个用户。这两个用户在PredictionIO应用中创建。只有userId是必须要填上的。
  3. 在此之后我们利用Clinet实例添加了10个博客。博客同样在PredictionIO应用中创建。当创建一项事物的时候,你只需传递两样东西——itemIditemTypeblog1,…blog10itemId,而Javascriptscala等是itemType
  4. 然后我们对创建的事物施加一些行动。用户shekhar浏览了blog1blog2blog4,而用户rahul则浏览了blog1blog4blog6blog7
  5. 最后,我们关闭了cilent实例。

将这个类作为Java应用程序运行。它会在PredictionIO中插入记录,你可以通过查看面板来确认这一点。

《Day 4:PredictionIO——如何创建一个博客推荐器》

既然数据已经插入了我们的PredictionIO应用了,我们需要在我们的应用中添加引擎。点击Add an Engine按钮。如下所示,选择Item Similarity Engine

《Day 4:PredictionIO——如何创建一个博客推荐器》

然后创建Item Similarity Engine,输入engine1作为名称。

《Day 4:PredictionIO——如何创建一个博客推荐器》

按下Create按钮之后Item Similarity Engine就创建好了。现在你可以改动一些配置,不过我们将使用默认配置。进入Algorithms标签,你会看到引擎尚未运行。点击Train Data Model Now可运行引擎。

《Day 4:PredictionIO——如何创建一个博客推荐器》

等上一段时间。数据模型训练完成之后,你会看到状态已经变成Running了。

《Day 4:PredictionIO——如何创建一个博客推荐器》

我们要解决的问题是基于用户访问过的博客向用户推荐博客。在下面的代码中,我们获取了对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程序,你会看到结果:blog4blog5blog6blog7

正如你在上面的例子中看到的,为应用增加推荐功能很容易。我会在我未来的项目中使用PredictionIO,我也会花更多的时间学习和使用PredictionIO。

这就是今天的内容。请多多回馈。

原文 Day 4: PredictionIO–How to Build A Blog Recommender
翻译 SegmentFault


推荐阅读
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • Python3爬虫入门:pyspider的基本使用[python爬虫入门]
    Python学习网有大量免费的Python入门教程,欢迎大家来学习。本文主要通过爬取去哪儿网的旅游攻略来给大家介绍pyspid ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • SSE图像算法优化系列三:超高速导向滤波实现过程纪要(欢迎挑战)
    自从何凯明提出导向滤波后,因为其算法的简单性和有效性,该算法得到了广泛的应用,以至于新版的matlab都将其作为标准自带的函数之一了&#x ... [详细]
  • 解析Java虚拟机HotSpot中的GC算法实现
    本文探讨了Java虚拟机(JVM)中HotSpot实现的垃圾回收(GC)算法,重点介绍了根节点枚举、安全点及安全区域的概念和技术细节,以及这些机制如何影响GC的效率和准确性。 ... [详细]
  • 软件测试行业深度解析:迈向高薪的必经之路
    本文深入探讨了软件测试行业的发展现状及未来趋势,旨在帮助有志于在该领域取得高薪的技术人员明确职业方向和发展路径。 ... [详细]
  • 本文介绍了如何通过命令行有效地终止所有 Node.js 进程实例,以解决因端口冲突或其他服务冲突导致的问题。 ... [详细]
  • 调试利器SSH隧道
    在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到 ... [详细]
  • 本文介绍了Tomcat的基本操作,包括启动、关闭及首次访问的方法,并详细讲解了如何在IDEA中创建Web项目,配置Servlet及其映射,以及如何将项目部署到Tomcat。 ... [详细]
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
  • Java虚拟机及其发展历程
    Java虚拟机(JVM)是每个Java开发者日常工作中不可或缺的一部分,但其背后的运作机制却往往显得神秘莫测。本文将探讨Java及其虚拟机的发展历程,帮助读者深入了解这一关键技术。 ... [详细]
  • Spring Security基础配置详解
    本文详细介绍了Spring Security的基础配置方法,包括如何搭建Maven多模块工程以及具体的安全配置步骤,帮助开发者更好地理解和应用这一强大的安全框架。 ... [详细]
  • 探讨了在HTML表单中使用元素代替进行表单提交的方法。 ... [详细]
  • JavaScript 跨域解决方案详解
    本文详细介绍了JavaScript在不同域之间进行数据传输或通信的技术,包括使用JSONP、修改document.domain、利用window.name以及HTML5的postMessage方法等跨域解决方案。 ... [详细]
  • 本文详细介绍了如何在CentOS 6.5系统上安装和配置Redis 3.0.6,包括必要的环境准备、软件包下载、编译安装及基本功能测试。 ... [详细]
author-avatar
momosu1028_738_636
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有