Day 4:PredictionIO——如何建立一個博客推薦器

編者注:咱們發現了比較有趣的系列文章《30天學習30種新技術》,準備翻譯,一天一篇更新,年終禮包。下面是第四天的內容。


今天是「30天學習30種新技術」的第4天。到目前爲止我很享受,並且周圍開發者反響也很不錯。我如今更有動力在30天內完成它了。在這篇文章中,我將介紹如何在Java下使用PredictionIO來簡單地構建一個博客推薦引擎。我沒找到太多在Java下使用PredictionIO的文檔。因此,本文對那些尋找在Java下使用PredictionIO的完整教程的人可能會有用。「30天學習30種新技術」系列文章的目錄能夠在這裏找到。javascript

PredictionIO

PredictionIO是什麼?

PredictionIO是一個用Scala編寫的開源機器學習服務器應用,能夠幫助你方便地使用REST API搭建推薦引擎。它同時也提供了客戶端SDK,封裝了REST API。Java、Python、Ruby和PHP都有客戶端SDK。PredictionIO的核心使用Apache Mahout。Apache Mahout是一個可伸縮的機器學習庫,它提供衆多彙集、分類、過濾算法。Apache Mahout能夠在分佈式的Hapoop集羣上運行這些算法。html

做爲用戶,咱們不須要操心這些細節。咱們只需安裝PredictionIO而後使用它就是了。欲知詳情,請讀文檔java

我爲何要關心PredictionIO?

我決定學習PredictionIO是由於我想使用一個能夠幫助我加上機器學習功能的庫。PredictionIO有助於實施諸如推薦有意思的內容、發現類似內容之類的功能。python

安裝PredictionIO

在文檔中說起了不少安裝PredictionIO的方法。我使用Vagrant,這樣我就不會搞亂個人系統,同時不用本身配置全部的東西。git

  1. 下載適合你的操做系統的最新版的vagrant:http://downloads.vagrantup.com/github

  2. 下載並安裝 VirtualBox。 請參考 https://www.virtualbox.org/wiki/Downloadsweb

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

  4. 解壓縮 PredictionIO-x.x.x.zip。其中包括了設置PredictionIO所須要的腳本。打開命令行終端,轉到PredictionIO-x.x.x目錄。apache

vagrant腳本將首先下載Ubuntu vagrant box,接着安裝依賴——MongoDB、Java、Hadoop和PredictionIO服務器。這很耗時間(取決於網速)。若是你所在的位置網絡不穩定,我建議你使用wget下載。wget命令支持斷點續傳。使用以下命令將precise64 box下載到適當的位置:segmentfault

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

建立PredictionIO應用

做爲開始,咱們建立一個博客推薦應用。點擊「Add an App」按鈕,輸入應用名「blog-recommender」。

predictionio-add-an-app

應用建立後,你能夠在以下所示的Applications裏看到。

predictionio-application

接着點擊Develop,你將看到應用的詳情。重要的信息是App Key。你編寫應用的時候須要這個。

blog-recommender-application

應用案例

咱們正要實現的用例和亞馬遜的「購買此商品的顧客也同時購買」功能很類似。咱們要實現的是「瀏覽此博客的讀者也同時瀏覽」功能。

開發博客推薦的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");

    }

}

上面展現的類主要作了這些事:

  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中插入記錄,你能夠經過查看面板來確認這一點。

predictionio-added-data

既然數據已經插入了咱們的PredictionIO應用了,咱們須要在咱們的應用中添加引擎。點擊Add an Engine按鈕。以下所示,選擇Item Similarity Engine

choose-engine

而後建立Item Similarity Engine,輸入engine1做爲名稱。

create-item-similarity-engine

按下Create按鈕以後Item Similarity Engine就建立好了。如今你能夠改動一些配置,不過咱們將使用默認配置。進入Algorithms標籤,你會看到引擎還沒有運行。點擊Train Data Model Now可運行引擎。

predictionio-train-data-model-now.preview

等上一段時間。數據模型訓練完成以後,你會看到狀態已經變成Running了。

predictionio-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程序,你會看到結果:blog4blog5blog6blog7

正如你在上面的例子中看到的,爲應用增長推薦功能很容易。我會在我將來的項目中使用PredictionIO,我也會花更多的時間學習和使用PredictionIO。

這就是今天的內容。請多多回饋。


原文 Day 4: PredictionIO--How to Build A Blog Recommender
翻譯 SegmentFault

相關文章
相關標籤/搜索