楊佳鵬, 俎毓偉, 紀佳琪, 陳麗芳
(1 華北理工大學 理學院, 河北 唐山 063210; 2 河北民族師范學院, 河北 承德 067000;3 河北省文化旅游大數據技術創新中心, 河北 承德 067000)
互聯網技術的發展引發了信息超額問題,從快速增長數據中找到符合需求的信息需要花費大量的時間和精力,而形成的海量數據也促進了大數據分析以及各種推薦系統的發展。 目前隨著人們生活水平的提高,外出旅游已成為一種重要的休閑方式。但由于相關知識和經驗的不足,游客難以對復雜多樣的景點信息做出最優決策,對游客而言,符合用戶特征的大數據推薦系統是一種不錯的選擇[1]。 目前,已有研究人員根據用戶歷史數據及用戶評分構建旅游景點推薦系統,但該系統并不能在流數據上運行,并且推薦結果存在很大差異,不符合用戶需求,具有局限性。 根據用戶意向和景點信息的相似度推薦景點,可以更有效地滿足用戶的特定化需求,對實現智能化生活以及大數據推薦系統具有積極意義。
結合圖神經網絡和用戶情感畫像的協同過濾算法是旅游推薦最常用的方法,研究人員結合圖神經網絡和用戶情感畫像推動了數據分析與信息挖掘快速發展[2-4],然而此類算法無法滿足用戶的特殊需求。 圖神經網絡運用注意力機制[5]獲取景點序列中游客的長短期偏好,根據用戶歷史游玩行為信息推薦景點,而用戶的歷史游玩信息和長短期偏好容易受到客觀環境影響;用戶情感畫像依據景點評分進行推薦,具有很強的主觀性。 因此,該方法無法在流數據上使用,并且不能實時應對用戶需求的變化。
根據用戶評論和評分的協同過濾算法也是一種常用的方法,譚云志等學者[6]提出根據文本評論信息學習項目特征,將不同特征分布及用戶偏好同時引入協同過濾推薦系統中。 楊家慧學者[7]引入巴氏系數[8]減少共同評分的影響,使用Jaccard 系數[9]增加協同過濾的共同評分項占比。 由于不合理因素可能會造成用戶的情感產生一定的偏差,并導致少量用戶打出極端的評分,這就會使推薦結果出現明顯誤差。
針對以上問題,本文提出基于瀑布型融合的旅游推薦系統(WFRA)對用戶的想法進行實時分析,因此在面對用戶興趣突然發生更改的情況時,系統可以分析用戶最新的想法去重新推薦景點,實時更新模型。 在該系統中將構建2 個過濾層。 第一個過濾層采用SimHash 算法,該算法能夠實現大規模文檔相似性的精確檢測,同時在實際應用中對程序運行速度有所保障,能夠對億萬旅游數據進行快速過濾,從而降低后面過濾層的壓力;第二個過濾層采用TF-IDF 和余弦相似度相結合的算法進行過濾,能夠進一步把握語義。 實驗結果表明龐大的旅游數據在經過2 個過濾層篩選后所推薦得到的結果更具有針對性和精準性。
在瀑布型融合模型中,構建了SimHash 算法和余弦相似度算法兩個過濾層。 經過SimHash 算法對海量數據進行降維操作,把文本比較次數從最初的上億次減少到幾百萬次,大大降低了時間成本,該設計思路為海量數據的精準處理提供了創新性的改善策略。
在首層過濾所得數據的基礎上,再選擇余弦相似度算法和TF-IDF 算法進行第二次過濾。 通過程序執行窗口,用戶可以輸入自己想去做的事情,系統會反饋給用戶TOP-100 個推薦結果,其中包含景點所在城市、景點名稱、評分、門票價格、銷量、以及景點所在的省市區等相關信息。 如果用戶想要繼續了解其中某幾個景點的地理位置信息、各省市推薦景點的數量以及平均票價在地圖上的分布情況,可以繼續執行程序,得到相關數據的可視化結果,設計思路如圖1 所示。
根據上述設計思路,將上述的系統架構分為X層,系統架構如圖2 所示。 由圖2 可看到,對系統結構中各層設計,擬展開研究分述如下。

圖2 系統架構Fig. 2 The architecture of the system
(1)Data 層。 Data 層利用Spark 讀取得到的景點數據,存儲在原始旅游景點數據庫中進行備份,以備后續使用,同時創建一個空白的推薦數據庫存儲最終的推薦結果。
(2)處理層。 該系統在處理層搭建了2 個過濾層,根據用戶輸入的文本,過濾層會對數據流進行篩選,每經過一個過濾層,就把推薦結果存入推薦數據庫中,作為下一個過濾層的輸入。
(3)輸出層。 系統在輸出層輸出最終的推薦結果,用戶可以在推薦結果中選取興趣景點,輸出層會對這些興趣景點做統計分析,并進行地圖可視化來展示景點的詳細信息與位置。
1.3.1 SimHash 算法
Liu 等學者[10]提出SimHash 算法,其主要思想是對特征向量進行降維,利用2 個向量的漢明距離來計算相似度。
Yu 等學者[11]證明,SimHash 算法在處理億萬級別的數據時不僅擁有運行速度優勢,也具有較高的準確性和魯棒性。 該算法不僅大大降低了運行時間成本,也有效地減少了第二過濾層的工作量,使用戶能更快地得到推薦結果。 SimHash 流程如圖3 所示。

圖3 SimHash 流程Fig. 3 SimHash process
1.3.2 余弦相似度算法與IF-IDF
在第一層過濾掉了大量景點后,第二過濾層采用余弦相似度算法,通過提取關鍵詞進一步精簡文本信息,從而提升系統的效率。 假定用戶輸入的特征向量a為[x1,y1],某個景點的介紹、即向量b為[x2,y2],那么能將余弦定理改寫成式(1):
余弦的這種計算方法對n維向量也成立。 假定A和B是2 個n維向量,這里A是[A1,A2,…,An],B是[B1,B2,…,Bn] ,則A與B的夾角θ的余弦為式(2):
利用式(2),就可得到A與B的相似度。 綜上所述,本文在第二層使用的余弦相似度算法和TF-IDF算法的步驟如下:
(1)用TF-IDF 算法計算詞頻向量找出每段文本的關鍵詞。
(2)將每段文本取出的若干個關鍵詞合并成一個文本庫,計算每段文本對于該文本庫中關鍵詞的詞頻,并使用相對詞頻可以避免文本長度的差異。
(3)獲得兩段文本各自的詞頻向量。
(4)計算兩段文本的余弦相似度。
本文對原始數據集進行初步整理得到34 個省市的景點數據。 其中包括省市、景點名稱、星級、評分、票價、銷量、簡介以及所在省/市/區,北京市部分景點數據見表1。

表1 北京市部分景點數據Tab. 1 Data of some scenic spots in Beijing
傳統的數據庫[12]在應用上存在著一定技術瓶頸,主要表現在2 個方面:
(1)MySQL 等數據庫的數據處置能力有限,數據量的大幅度增加會使Join、GroupBy、OrderBy 等操作速度受到很大的限制,有可能出現資源成本過高從而導致運行失敗的情況;其次,將數據存儲轉移到分布式系統的代價太大。
(2)無法進行跨數據源的訪問。 比如,對Hive Table 和MySQL 的數據混合進行查詢。 大多數做法是將數據源進行轉移。 過程中涉及的技術應用包括Sqoop[13]、Hive[14]外表等,不過這些技術需要很高的時間成本,且Sqoop 在對特殊字符的處理中也存在著問題與不足。
Spark 作為開源的大數據處理平臺[15],通過將Resilient Distributed Datasets 以分布式的形式存儲在集群的內存中和將計算壓力轉移到Hadoop 集群中來提高執行效率。 利用Spark 讀取整理好的數據集并進行預處理操作,清洗不符合要求的數值;通過高德地圖API 和Echarts 將景點的地理位置轉換為經緯度坐標,以利于后續進行可視化處理。
為了能夠更具有針對性地向用戶推薦旅游景點,開發了基于瀑布型融合的旅游推薦系統。 用戶輸入自己的想法,便可以得到系統推薦的景點,用戶還可以從推薦結果中選擇興趣景點,并查看其詳細信息和地圖上的具體位置。 本文主要通過應用不同的算法搭建過濾層對用戶期待體驗的文本描述和景點信息進行匹配來挖掘用戶感興趣的景點。
(1)打開并運行旅游景點推薦程序,會有文字提示用戶輸入想要去做的事情,例如:用戶輸入:我突然想去泡個溫泉,最好是專門的中心。 用戶在輸入想做的事情后按下回車鍵,系統會反饋給用戶100 個推薦結果。 根據推薦結果可知,該算法反饋給用戶推薦景點的針對性較強,具有較高的精準性。
在得到TOP-100 個景點的數據后,將其按照省市分類得到各省市興趣景點的數量及票價的平均值,如圖4、圖5 所示。

圖4 各省市興趣景點的平均票價Fig. 4 Average ticket prices for attractions of interest in various provinces and cities

圖5 各省市興趣景點的數量Fig. 5 Number of attractions of interest in each province and city
(2)用戶還可以選擇興趣景點所對應的序號,得到其在地圖上具體地理位置的分布情況,以及清晰、直觀的3D 可視化結果。
(3)用戶可以選擇繼續獲取各省市興趣景點的數量以及平均票價的相關信息,最終以地圖和柱狀圖的形式進行可視化。 如果想了解某個省市的興趣景點分布數量以及平均票價,只需將鼠標移動至該省市的柱子上,就會動態展示相關信息。 其中,lng和lat分別表示該省市的經緯度,alt表示該省市所包含興趣景點的個數,value表示該省市興趣景點的平均票價。
本文提出的基于瀑布型融合的旅游景點推薦系統在測試中具有很強的針對性和較高的精準度。 其本質是根據用戶的想法,對各旅游景點的信息進行過濾,在每一個過濾層除去不符合條件的景點,篩選出更符合用戶意愿的景點。 該系統不僅能夠更好地滿足用戶的個性化需求,還能靈活地應對用戶興趣更改的情況,達到實時分析的效果,在某種程度上實現智能化旅游推薦,使用戶能夠在任何時候都能得到符合當下內心想法的推薦結果,使旅游推薦更加智能化。 由于在處理海量旅游景點數據過程中,第一過濾層采用SimHash 算法降低了整個算法的時間成本,并使程序的運行速度得到明顯提升,整個算法的結構體系具有很強的實用性。
在后續的研究中,可搭建并行過濾層分別針對不同特征屬性進行過濾篩選,并根據數據集的大小、算法的時間復雜度、系統運行效率,以及利用景點與景點之間的相似度進行橫向推薦等多個角度進行改進,從而獲得更加智能的推薦結果。