1. 程式人生 > >基於Web日誌挖掘的個性化推薦系統(附原始碼)

基於Web日誌挖掘的個性化推薦系統(附原始碼)

個性化推薦系統

實現該系統主要是使用的程式語言主要是R,然後配合css在樣式上進行一定優化,使用shiny開發的一款web程式,主要實現的核心功能是基於spark的ALS演算法的課程個性化推薦系統。首頁介面如下圖所示:

該系統中的所有課程名稱,課程圖片以及課程連結均從百度傳課爬取進行彙總得到的,因此點選每個圖片均可以跳轉至該課程在百度傳課的頁面。

該系統中實現的主要功能有:

  1. 首頁推薦。

  2. 課程搜尋。

  3. 課程分類。

  4. 個性化推薦

  5. 熱點分析。

首頁推薦

當一個新使用者或未登入的使用者進入到該學習平臺時,系統無法得知使用者的具體資訊,因此對使用者的興趣愛好還一無所知,所以無法使用常規的推薦演算法進行推薦。一般在這個時候,只是向用戶推薦那些普遍反映比較好的物品之前。面對這種情況,該專案通過Web日誌分析,提取瀏覽次數較多的課程在首頁進行推薦。
首頁推薦是從預處理好的資料中提取使用者訪問的課程ID,然後統計這些課程ID出現的次數,根據出現的次數以降續進行排序,向用戶推薦最熱門,也是訪問次數最多的課程。

課程搜尋

搜尋功能可以幫助使用者快速查詢到所有與搜尋關鍵字相關的課程,這些課程名稱資料是使用R語言從Web日誌中提取出來的,因此可以搜尋出所有存在於Web日誌中的課程。該搜尋引擎是基於正則表示式來完成。通過grepl函式在課程資料中的課程名中進行正則表示式匹配,可以搜尋到所有包含關鍵字的課程,並獲取其序列號,當查詢完成之後,將序列號集合返回。根據課程的序列號和ID號將查詢到的課程顯示在前端。

使用者可以使用搜索功能完成課程的搜尋,另外一個方面,該功能是對熱點分析中的熱詞分析功能的一個完善,使用者可以檢視熱詞,然後使用搜索功能進行課程檢視。

課程分類

課程分類主要通過人工的方法,在課程資訊彙總檔案中對各個課程新增標籤,在前端顯示時根據標籤即可顯示。課程分類可以幫助使用者根據類別進行課程檢視。該設計中包含13個類別,比如“辦公”,“考試”,“外語”,“建造”,“金融”等。

在最初爬取資料的時候我並沒有想到後期會有課程分類功能,所以在資料中也沒有新增分類標籤,所以後期資料分類表籤是手動新增。

因為在百度傳課爬取課程名和課程圖片時,我是根據課程分類爬取的,因此在後期新增分類時也基本就是在Excel中複製,花費不了多少時間。

個性化推薦

個性化推薦是基於使用者的歷史訪問資料進行分析計算。在該系統中的個性化推薦是基於Web日誌的資料探勘,使用Spark中的ALS機器學習演算法實現。ALS演算法是基於協同過濾進行課程推薦。
該推薦演算法主要是基於使用者和使用者之間的聯絡進行推薦,需要的資料包括使用者ID,課程ID,課程評分。但Web日誌資料中並沒有使用者對課程的評分資料,只有使用者訪問的課程內容,因此該系統使用使用者觀看課程視訊的次數作為對該課程的評分。
本文從Web日誌資料中統計出每個使用者觀看每個視訊的次數,根據使用者對課程的訪問次數來反映使用者對該課程的喜歡程度,觀看次數越多越喜歡,反之則不喜歡。ALS演算法可以根據其喜歡的課程視訊發現相似使用者,相似使用者各自喜歡的視訊之間必有交集,再分析相似使用者的喜歡的課程視訊,去除使用者已經看過的課程視訊來對其進行推薦。由此可知,該演算法是根據其他已有的使用者偏好來預測使用者對其未觀看視訊的評分或喜歡程度,對新使用者無法進行個性化推薦。

其中使用者資訊儲存在MySQL資料庫中,使用者在登入時通過訪問資料庫,對賬戶和密碼進行檢查。

在另外一方面,因為該日誌是自己使用指令碼自動生成了20萬行,所以在這裡推薦的效果並不是很明顯。

熱點分析

熱點分析包含兩個部分:熱詞分析和地域分析。

熱詞分析

首先Web日誌資料中提取課程名稱,使用jiebaR擴充套件包進行分詞。分詞時,需要針對該系統建立課程詞典和停用詞庫,因為Web日誌中的課程名包含一些專用名詞,比如“一帶一路”,使用系統詞典,它會被切分成兩個詞:“一帶”和“一路”,另外也包含了大量的停用詞,比如“的”,“是”等。通過這種方式,可以非常有效地提高分詞的準確性。

熱詞分析是向用戶推薦一些關鍵字,使用者可以通過搜尋功能進行搜尋檢視,這也是一種潛在的推薦方法。

地域分析

該功能模組是從Web日誌提取使用者的訪問IP。通過爬蟲,使用Data Science Toolkit網站提供的API,根據IP可以獲取地理位置。根據地理座標,使用REmap擴充套件包的remapH函式進行地理資料視覺化,REmap擴充套件包可以繪製出非常優秀的地理熱圖,遷移圖。
Data Science Toolkit提供的API返回的結果是JOSN形式儲存的,需要使用正則表示式對其進行處理。R語言正則表示式gsub函式可以完成正則表達的替換。該API返回的結果包括國家,城市,運營商,地理座標等。通過觀察資料可以發現僅地理座標為數字型別,其餘均為字串型別。因此使用網路爬蟲獲取到的資料處理過程比較簡單,可以直接將非數字型別的字串替換為空,替換之後剩餘的均為數字型別,也就是經度和緯度。不過這個API現在好像直接訪問不了,估計需要翻牆才能使用。

不過在這裡我需要說明的是該地理熱圖是通過REmap包繪製的,但由於REmap包的css和shiny的css有衝突,導致系統介面出現一些故障,因為我是將地理熱圖儲存成圖片顯示的。

以上就是我在該系統中實現的具體功能,如有疑問,歡迎在評論區留言討論,如果有必要我會再寫幾篇分別具體對每個小功能進行詳細的解釋和介紹。

如果需要具體程式程式碼請點選閱讀原文訪問我的GitHub進行檢視和下載,同時歡迎fork,感謝Star

☞ 推薦閱讀

4.正則表示式

轉載請註明:

作者:王亨

公眾號:跟著菜鳥一起學R語言

原文連結:http://blog.csdn.net/wzgl__wh