徐 偉,許 鵬
云計算、大數據、人工智能技術的發展改變了傳統的課程教學模式,促進了線下線上課程教學模式的融合,尤其是在今年的新冠肺炎疫情期間,各學校為了深入貫徹教育部“停課不停學”的指示精神,要求教師在職教云、騰訊課堂、學習通等在線教育平臺上進行線上授課,開展線上課程建設.線上課程以其具有的不受時間場地限制、授課形式靈活多樣的特點,在新冠肺炎疫情期間得到廣泛應用.據不完全統計,新冠肺炎疫情期間線上課程數量急劇增加,占課程總量的85%,在一定程度上滿足了學生學習知識和技能的需求,但同時也給學生選課帶來了困擾.為了能夠讓學生在眾多的線上課程中選擇到適合自身學習特點的課程,筆者提出設計開發一款高效精準的個性化推薦系統[1],該推薦系統可以根據用戶的歷史行為數據發現用戶的喜好,形成用戶畫像數據,從而為用戶做出精準的個性化推薦,提供更加優質的服務.
本文在對當前主流在線教育平臺的課程推薦功能進行深入研究的基礎上,對學生購買課程的歷史數據進行分析,將評分數據作為學生對課程喜好度的主要依據,將評論數據作為次要依據,基于協同過濾推薦算法,使用MapReduce 計算模型計算出課程間的相似度,最終向學生推薦符合其喜好的課程列表,實現了個性化課程推薦[2]功能.
整個系統由日志采集子系統、數據清洗子系統、數據計算子系統、在線教育平臺業務子系統組成.通過收集業務系統學生用戶的行為數據,針對不同學生進行個性化課程推薦,以滿足不同學生用戶的需求.系統架構如圖1 所示.
(1)日志采集子系統.負責采集用戶的操作日志,并通過大數據組件Flume 將每天的數據實時采集到HDFS 中.Nginx 服務器除了作為網站的代理服務器外,還作為網站日志接收服務器,網站所產生的日志信息發送到Nginx服務器,Nginx 將接收到的日志存儲在日志文件access.log 中.Flume 組件運行在集群中并實時監控access.log 文件的增量日志,一旦監測到有新的增量日志就會將新日志導入到HDFS文件系統的指定目錄[3].
(2)數據清洗子系統.負責對日志進行數據清洗,剔除無效數據,從HDFS 指定目錄讀入非結構化日志數據,然后根據特定規則切分日志條目,將不符合特定規則的臟日志數據舍棄,并將清洗后的數據存入數據倉庫以便于其他應用程序使用[4].
(3)數據計算子系統.基于協同過濾推薦算法,采用MapReduce 離線計算框架,通過Linux 定時任務[5]周期性計算課程相似度,并把結果回寫到MySQL 的推薦表中.
(4)在線教育平臺業務子系統.本業務系統是基于Python 語言的輕量級Web 框架Flask快速開發的在線教育平臺[6],主要包含用戶模塊、課程模塊、訂單模塊、評論模塊等核心業務模塊,具備線上教育平臺的核心業務功能,包括前臺課程展示頁面與后臺管理員頁面,同時在課程詳情頁面還包括課程的推薦列表.在管理員頁面可以對課程進行相應的操作,以及查看不同維度統計信息.在Web 開發中,頁面跳轉是通過不同的Flask 控制器View 視圖函數進行控制,根據用戶的請求路徑調用對應的視圖函數進行處理[7].
本文采用MapReduce 離線計算模型,使用Linux 下執行定時任務工具crontab 周期性對學生行為日志數據進行離線計算,并將計算結果通過Sqoop 同步更新到數據庫中.MapReduce 采用的是分而治之的數據處理方式,Map操作即為“分”操作,將一個大數據塊分解為多個切片,交由集群中的各個節點去計算;而Reduce 即為“合”操作,合并各個節點上的計算結果并輸出[8].
MapReduce 編程模型是一種并行數據計算模型,該模型根據數據輸入量的大小將數據劃分為N個相對獨立的數據切片,啟動N個Map 任務,每個Map 任務獲得一個切片數據,該切片數據經計算處理后生成鍵值對,以(Key/Value)的形式輸出,在Map 和Reduce 中間需要一個Shuffle 過程,該過程將Map 的輸出結果Key/Value 鍵值對按Key 進行分組,形成P個Key/ValueList,然后 交 給P個Reduce 任務去處理,即一個Shuffle 之后的Key 對應一個Reduce 任務,如果用戶指定了Reduce 任務的個數,則需要通過對Key 進行Hash 計算,求出Hash 值,然后根據Hash 值將不同的Key 發送到不同的Reduce 任務,Reduce 任務接收到來自Shuffle 的Key/ValueList 輸入,通過迭代ValueList 計算并輸出最終結果,這是單個MapReduceJob 的完整執行過程[9],如圖2 所示.
在實際項目開發中,可以根據自身的業務功能進行靈活選擇,比如,如果只是一個簡單的數據清洗作業(Job),可以只有Map 過程,而沒有Reduce 過程;也可以將多個Job 串聯在一起,形成一個復雜的計算邏輯,將JobA的輸出作為JobB 的輸入,JobB 的輸出作為JobC 的輸入直至整個任務完成[10].
本課程推薦系統主要實現兩個功能,分步驟實現,首先計算出課程與課程間的相似度,然后根據用戶的訂單及評分數據,找出課程相似度比較高的課程列表進行推薦.以下為具體實現過程.
首先,獲取用戶對某一課程的評價信息,主要是評分數據,這一信息可以在訂單表中獲取.通過Sqoop 數據導入導出工具,按指定要求增量或者全部導出所有數據到HDFS 指定目錄,這里只導出用戶ID、課程ID 和評分數據.數據集如表1 所示.

圖2 單個MapReduceJob 完整執行過程

表1 課程評分表
然后,運行指定的MapReduce 程序,讀入上述數據集,建立用戶對課程的評分矩陣并把計算結果存入相應目錄中.用戶對課程評分矩陣如圖3 所示.

圖3 用戶對課程評分矩陣
評分矩陣的行為課程ID,列為用戶ID,評分矩陣中的數值代表該ID 用戶對該ID 課程的評分數據,如果數據為0,則表示該ID 的用戶尚未對該課程進行評價.從該矩陣列方向看,每一列在MapReduce 程序中可以用一行字符串101:5,102:0,103:-3,104:4.5,105:0,106:4,107:4 表示.按照上述方式處理矩陣,圖3 用戶評分矩陣的5 列就可以由5 行類似的字符串來構成.那么第一個MapReduce 程序的功能就是將關系型評分矩陣按照列維度進行數據轉換操作.
其次,讀入評分矩陣,計算出課程的同現矩陣[11],如圖4 所示.

圖4 課程同現矩陣
課程同現矩陣的行為課程ID,列也為課程ID,矩陣的值表示兩個課程同時被用戶評分的次數,例如104 和105 這個課程組合被3、5 兩個ID 的用戶評價過,那么在矩陣中104 和105 所對應的數值就是2.如果兩個課程同時被多個用戶購買并評價過,那么這兩個課程在很大程度上是相似課程,同時被購買并評價的次數越多,即課程同現矩陣中數值越大,根據協同過濾算法的定義,這兩個課程的相似度就越高.從列方向上看,這個同現矩陣的每一列在MapReduce 程序中可以通過簡單的字 符 串102:101 3,102:102 3,102:103 2,102:104 2,102:105 1,102:106 1,102:107 0表示,x*y的同現矩陣就由x個以上的字符串(y行)組成.可以看出,課程和課程的同現矩陣需要另外一個MapReduce 任務來完成,它是將第一個MapReduce 任務的輸出作為輸入進行計算的.
最后,計算課程相似度并產生最終推薦結果,推薦結果等于用戶對課程的評分矩陣*課程同現矩陣.課程的同現次數*用戶對各個課程的評分,反應出用戶對課程的評分.
例如,計算用戶2 對105 課程的喜好度,那么必須找到和105 課程相似的課程,課程之間的相似度體現在同現度上,同現度越高,相似度越高.比如101 課程和105 課程的同現度為4,說明101 課程和105 課程相似,用戶2 對105 課程的評分為2,表示用戶2 對105 課程的喜好度,101 課程和105 課程的同現度*用戶2對101 課程的評分可得到用戶2 對105 課程的喜好度權重值,將用戶2 對各課程評分權重相加,最終計算出用戶2 對105 課程的喜好度.第三個MapReduce 任務的功能就是實現評分矩陣和同現矩陣的相乘,并輸出結果.推薦結果如圖5 所示.

圖5 推薦結果
個性化課程推薦系統開發完成后,部署在學校數據中心的服務器上,學生可以通過互聯網或校園網訪問使用該系統.為了解學生使用該系統的實際效果,設計了在線問卷調查系統,經統計共874 名學生參與問卷調查.調查數據顯示:71%的學生認為該系統可以滿足自己的個性化需求,感到“非常滿意”;23%的學生認為對自己選課有所幫助,感到“滿意”;6%的學生認為該系統的個性化課程推薦對自己幫助不大,感覺“一般”;沒有同學感到“不滿意”.系統滿意度調查如圖6 所示.

圖6 推薦系統滿意度調查
隨著在線教育體系的不斷發展和完善,線上教學模式必將成為今后學生學習知識和技能的一個重要途徑,而在線教育平臺如何滿足學生用戶個性化需求將是一個值得研究的課題.本文采用協同過濾推薦算法,根據學生對課程的評分數據和對課程的歷史評價數據,了解學生感興趣的課程特征,使用MapReduce 離線計算框架計算出課程之間的相似度,從而實現了個性化的課程推薦功能,在很大程度上滿足了學生的需求.后期將在業務系統中采集學生的個人愛好、喜歡的講師授課風格等更多個性化特征數據并應用于算法模型中,進一步提高推薦系統的精準性.