[譯] 第四天: PredictionIO - 怎樣建立博客推薦引擎

前言

這是我30天學習30種技術挑戰的第四天,到目前爲止,我很享受這項挑戰,也從程序員同行那裏獲得很好的反響。我會十分積極的去完成這30天的挑戰。在這篇博客裏,我會講到怎樣用PredictionIO來輕鬆建立博客推薦引擎。我沒有找到太多關於Java使用PredictionIO的文檔。因此,經過這篇博客,也許對要找PredictionIO Java端到端指導文檔的人有用。完整的博客系列能夠從這裏看到。javascript

什麼是PredictionIO?

PredictionIO 是一個開源的機器學習服務器,用Scale語言開發。它提供了簡單的方式使用REST API來建立推薦引擎,也提供客戶端SDK,包含REST
API.
客戶端SDKJava, Python, PHP都適用。PredictionIO核心使用Apache Mahout.Apache
Mahout
是一個可擴展的機器學習應用,提供各類聚類,分類,過濾算法,能夠在分佈式的Hapoop集羣上運行這些算法。
 html

做爲用戶,咱們不用擔憂那些細節,只需安裝PredictionIO來開始使用。想了解更多信息能夠點擊介紹java

我爲何關注PredictionIO?

PredictionIO是由於我想使用能幫我添加機器學習能力的庫。 PredictionIO有助於實現一些功能如爲用戶推薦有趣服務,發掘類似內容。python

安裝PredictionIO

在介紹裏面有多種安裝方式。我用的是Vagrant方式,避免讓我弄壞機器環境,也不用本身去安裝每一步。git

  1. 下載最新的vagrant包,你能夠從這裏下載。
  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下載Ubuntu, wget 支持斷點下載。下載precise64.程序員

wget -c http://files.vagrantup.com/precise64.box

 

下載完成後,打開Vagrantfile, 更改config.vm.box_url, 指向precise64.box的下載路徑。github

config.vm.box_url = "/Users/shekhargulati/tools/vagrant/precise64.box"

 

  1. 如今就等vagrant 本身安裝,所花時間由你的網速而定。
  2. 接下來建立管理員帳號,參考http://docs.prediction.io/current/installation/install-predictionio-with-virtualbox-vagrant.html#create-an-administrator-account.
  3. 服務程序會運行在http://localhost:9000. 更多瞭解請看 http://docs.prediction.io/current/installation/install-predictionio-with-virtualbox-vagrant.html#accessing-predictionio-server-vm-from-the-host-machine. 程序會要求你登陸,登陸後能夠看到以下顯示

建立PredictionIO程序

咱們即將開始建立博客推薦程序,點擊 Add an App 按鈕,輸入 blog-recommender.web

 

建立好後你能夠在Applications下看到以下顯示。算法

 

而後點擊 Develop, 你能夠看到詳細的程序信息,這裏的關鍵信息 App Key, 這是咱們寫這個程序必需的。apache

程序用例

咱們這裏使用的用例相似於亞馬遜的功能「買了這個的用戶同時也買了這些」。咱們顯示的是瀏覽了這篇博客的讀者還瀏覽了這些博客。

Java開發博客推薦程序

咱們已經建立了PredictionIO,該寫Java程序了,用Eclipse來開發。我用的是Eclipse Kepler,集成了m2eclipse. 經過導航File>New>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>

從以上代碼能夠注意到MavenPredictionIO Java API的依賴。

如今寫插入數據到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. 建立客戶端實例。客戶端類覆蓋了PredictionIO REST      API. 咱們須要提供PredictionIO博客推薦程序的API_KEY
  2. 接着咱們用客戶端實例建立了兩個帳號,這些帳號在PredictionIO程序裏,必填項只有 userId.
  3. 而後用客戶端實例添加了10篇博客,這些博客也在PredictionIO程序裏。建立的時候你只需傳itemIditemType. itemId blog1,…blog10, itemTypejavascript,scala等。
  1. 而後咱們對其進行了些操做,"shekhar"用戶瀏覽了"blog1","blog2""blog4",      "rahul"用戶瀏覽了"blog1","blog4", "blog6" ,           "blog7".
  2. 最後,關掉客戶端。

 

Java運行這個類,它會在PredictionIO程序裏插入數據,你能夠經過頁面看到記錄。

 

如今數據已經插入到PredictionIO程序,咱們須要添加引擎到咱們的程序,點擊 Add an Engine按鈕,選擇以下Item Similarity Engine.

 

而後輸入名字如"engine1" 建立Item Similarity Engine

 

點擊Create按鈕後,你就有了相似項引擎,如今你能夠修改配置了,不過咱們這裏使用的時候默認設置。到Algorithms頁面下,看到引擎沒有啓動,點擊"Train Data Model Now"來啓動。

 

等幾分鐘,數據模型啓動後你能夠看到狀態顯示Running.

 

這個用例咱們解決的是根據讀者瀏覽的博客,而後推薦博客。經過如下代碼,咱們能夠獲得全部和用戶"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".

 

從以上示例能夠看出,給程序添加推薦功能很簡單,我會在之後的項目中用到它,再多花些時間研究。 

 

這是今天的內容,留下你的建議和意見吧!

 

原文:https://www.openshift.com/blogs/day-4-predictionio-how-to-build-a-blog-recommender

相關文章
相關標籤/搜索