“基於 Apache Mahout 構建社會化推薦引擎”-電影推薦引擎建立


一,參考文章:

(1)基於 Apache Mahout 構建社會化推薦引擎:http://www.ibm.com/developerworks/cn/java/j-lo-mahout/

(2)“基於 Apache Mahout 構建社會化推薦引擎”一文例子運行紀實 :http://blog.csdn.net/softwarehe/article/details/7465151

(3)對 基於 Apache Mahout 構建社會化推薦引擎 一文的補充http://www.cnblogs.com/abelstronger/articles/2093847.htm

二,說明:

    運行環境是:linux下myeclipse8.0+tomcat6.0,用的時mahout0.5。

    由於是linux環境,所以可能js代碼有警告,這里先忽略。

    整個過程主要參考了原文一(1),這是基礎,原始代碼也是從原文下載的;

    搭建過程主要參考一(2),基本上大的問題在該文中都給出了解決辦法;

    數據導入過程參考了一(3),不過由於時linux下,所以數據路徑稍微修改了一下。

    這里主要是對以上作者的工作做一個稍微的補充,希望對以后的同學能有一定幫助。

 

三,具體建立工程過程

(1)在myeclipse下建立web project 工程,命名為MovieSite。

(2)在WebRoot/WEB-INF/lib下導入各種包,具體如下圖:

這里做一下說明

說明1:

lib 下的包主要是將 demo 時生成的推薦引擎 Web 應用的 war 包解壓縮,將 lib 下的 jar 文件拷貝到 MovieSite 的 lib 目錄下,同時將jasper.jar,mysql-connector-java-5.0.6-bin.jar考入lib中。

說明2:

由於采用的時tomcat6.0,Tomcat6.0之前的版本以Tomcat5.5.20 壓縮版為例,jasper-runtime.jarTomcat5.5.20\common\lib下就自帶有的。但是在Tomcat6.0版本后lib包的位置調整了,現在只有lib在跟目錄下。jasper-runtime.jarjasper-compiler-jdt.jarjasper-compiler.jar等都集成到jasper.jar包中去了,所以直接包含jasper.jar就可以了。

參考:http://wenku.baidu.com/view/f4f3fa0190c69ec3d5bb7557.html

說明3:

lib下並沒有servlet-api.jar和jsp.jar,主要原因是jsp-api.jar和servlet-api.jar這兩個包tomcat的common\lib已經有了,必須將\WEB-INF\lib\目錄下的去掉,否則會沖突的,會引起validateJarFile(/usr/local/src/tomcat6/webapps/MovieSite/WEB-INF/lib/servlet-api.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class。

參考:End2012的 http://hi.baidu.com/lpzsybgekvbdkrd/item/f975beac2a08b59b14107302    一文。

(3)在src下導入原來工程的各種包,具體如下:

    其中前面的6個包是原來的MovieSite工程已經有的,,dataimporter是向數據庫插入數據的幾個class,主要是參考一(3)的數據導入部分,包括ImportMovies.java,ImportRatings.java,ImportUsers.java,這里

說明1:

有一點需要注意的,由於數據是后來導入的,導入movies數據的時候沒有問題,不過在導入movie_preferences的時候注意去掉對users表的外鍵參考(因為此時users表為空呢)。

說明2:

導入數據之后會報DBUtils.java下趙不到getJDBCConnection,解決辦法就是在DBUtils.java下添加getJDBCConnection()類,(參考一(2)的數據導入部分)

說明3:

這個時候會提示com.ibm.taste.example.movie.recommender中的幾個class出現錯誤,,主要是類型錯誤,將類中參數Rescorer<long>rescorer 修改為IDRescorer rescorer即可。

說明4:

這時候可能會提示MovieDataModel.java有問題,在MovieDataModel.java,添加一行public final static String TIMESTAMP_COLUMN = "timestamp";這里的timestamp對應的是數據庫表里邊的字段名,不能亂寫,再出錯的super函數最后加上一個參數 TIMESTAMP_COLUMN,這個編譯錯誤消失(參考一(2))

(4)配置web.xml

不知道是什么原因,我參考一(2)配置web.xml總是出現錯誤,所以,我就直接在新項目的web.xml中手動添加各個參數,最終web.xml如下:

 

View Code
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 <servlet>
  <description>Movie recommender servlet</description>
  <display-name>Movie Recommender</display-name>
  <servlet-name>movie-recommender</servlet-name>
  <servlet-class>com.ibm.taste.example.movie.servlet.MovieRecommenderServlet</servlet-class>
  <init-param>
   <param-name>recommender-class</param-name>
   <param-value>com.ibm.taste.example.movie.recommender.UserBasedRecommender</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet>
  <display-name>Apache-Axis Servlet</display-name>
  <servlet-name>axis</servlet-name>
  <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
 </servlet>
 <servlet>
  <display-name>User Servlet</display-name>
  <servlet-name>user</servlet-name>
  <servlet-class>com.ibm.taste.example.movie.servlet.UserServlet</servlet-class>
 </servlet>
 <servlet>
  <display-name>Movie Servlet</display-name>
  <servlet-name>movie</servlet-name>
  <servlet-class>com.ibm.taste.example.movie.servlet.MovieServlet</servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>movie-recommender</servlet-name>
  <url-pattern>/recommend</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>user</servlet-name>
  <url-pattern>/user</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>movie</servlet-name>
  <url-pattern>/movies</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>axis</servlet-name>
  <url-pattern>*.jws</url-pattern>
 </servlet-mapping>
 <!-- The rest of the config is adapted from Axis's default web app -->
 <session-config>
  <session-timeout>5</session-timeout>
 </session-config>
 <mime-mapping>
  <extension>wsdl</extension>
  <mime-type>text/xml</mime-type>
 </mime-mapping>
 <mime-mapping>
  <extension>xsd</extension>
  <mime-type>text/xml</mime-type>
 </mime-mapping>
 <welcome-file-list>
  <welcome-file>index.html</welcome-file>
 </welcome-file-list>
 <login-config>
  <auth-method>BASIC</auth-method>
 </login-config>
 
 <resource-ref>
  <description>DB Connection</description>
  <res-ref-name>jdbc/movie</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
 </resource-ref>
 
</web-app>

 

(5)將index.html文件,style文件夾,images文件夾,script文件夾拷貝到WebRoot下,修改index.html的一些警告。

(6)部署項目運行

 

 在Email中輸入users表中的數據例如:test1@gmail.com  ,  Password中不用輸入,Login即可,結果如下:

四,總結

    雖然可以看到結果,不過還有幾個問題,現在正在修改中,,,

    (1)警告:You are not using ConnectionPoolDataSource. Make sure your DataSource pools connections to the database itself, or database performance will be severely reduced.,看來連接池還有問題,

    (2)關閉項目時:The web application [/MovieSite] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

    (3)關閉項目時:The web application [/MovieSite] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it. This is very likely to create a memory leak.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM