劉昌澍,李 響,詹瑾瑜,江 維,李博智,曹 揚,楊 瑞
(1.電子科技大學 信息與軟件工程學院,四川 成都 610054;2.中電科大數據研究院有限公司,貴州 貴陽 550022;3.提升政府治理能力大數據應用技術國家工程實驗室,貴州 貴陽 550022)
隨著人民生活水平的提高,國內旅游產業蓬勃發展。2018年國內旅游人數55.39億人次,比上年同期增長10.8%。初步測算,全年全國旅游業對GDP的綜合貢獻為9.94萬億元,占GDP總量的11.04%[1]。但遺憾的是,由于利益的驅動、市場監管不足、導游職業素質較低等原因,近些年頻頻出現不合理低價競爭、隨意加點和強制消費等導游違規現象,負面報道層出不窮,嚴重影響了導游的社會形象與誠信度[2]。近年來,隨著網絡技術的發展,旅游業開始和互聯網產業結合,出現了像去哪兒、途牛、攜程等在線旅游平臺,產生大量如評論、推薦等文本數據。這些文本數據中包含對于導游違規行為的負面評論或投訴。如何更好地利用這些數據實現對導游行為的監管,進一步完善規范旅游市場,一直是有關部門關注的話題。旅游評論等文本信息可以利用自然語言處理相關技術進行文本信息挖掘,并有大量范例可供參考借鑒。Kamran Kowsari等人[3]對經典文本分類任務的流程定義,介紹了文本預處理和文本特征抽取的方法并對包括SVM、KNN、決策樹等機器學習算法進行比較。Zhang Lei等人[4]在文本分類的基礎上進一步挖掘情感分析問題,并比較了包括CNN、RNN、LSTM和HAN等基于深度學習的state of art模型。同時,文本分類或情感分析可以用來處理負面評論或投訴信息,在中文語境下也有一些實際應用案例。例如,梁昕露等人[5]針對電信行業的客戶投訴系統,提出了使用向量空間模型做文本特征,用SVM做分類器的分類方法,在13萬條測試數據上取得了70%以上的準確率。但是該方法存在準確率在分類上并不均衡的問題。余本功等人[6]使用BTM和Doc2vec模型構建較低的SVM輸入空間并引入了集成學習的思想,提出了基于nB-SVM的投訴識別方法,一定程度上改善了由于數據不均衡引發的問題。近年來隨著深度學習領域的快速發展,出現了很多深度學習方法在中文文本分類及投訴處理的實踐。例如,鄭誠等人[7]等人提出了BLSTM_MLPCNN神經網絡模型,并將字符級向量聯合詞向量作為BLSTM的輸入,在5個英文標準數據集上進行實驗中均取得了較好的效果。萬圣賢等人[8]提出了包括MaxBiLSTM和ConvBiLSTM的雙向LSTM模型,更加高效地提取中間文本特征,該方法在公開數據集上取得了較好的效果。段立等人[9]針對95598客服投訴工單,提出了基于XGBoost的分類歸檔的方法,準確率在83%~91%左右,有較好的效果。文獻[10]提出基于word2vec和雙向LSTM的情感分類深度模型,解決社交網絡文本傳統情感分類模型存在先驗知識依賴以及語義理解不足的問題。
該文主要研究導游違規行為的識別檢測問題,首先構建了基于文本卷積神經網絡(TextCNN)的旅游評論情感分析模型,采用預先訓練的旅游話題詞向量表示整段文本,使用多種尺寸的卷積核捕捉文本序列中上下文之間的關聯,通過池化、全連接等操作得到文本對應的特征表達并判斷情感傾向,達到從旅游評論中精準識別出導游相關的負面評論的目的。然后提出了基于輕量級梯度提升決策樹(LightGBM)的導游違規行為分類模型,利用提升(boosting)的方法組合決策樹,在訓練過程中根據梯度差異給予不同樣本不同的權重,實現對導游違規行為的準確分類,為旅游監管提供參考依據。進行了多組對比實驗評估模型性能,實驗結果表明,提出的方法可以有效從大量旅游評論中檢測出導游違規行為及其類別,準確率達到91.57%。
基于TextCNN和LightGBM的導游違規行為檢測系統的框架如圖1所示,可以處理來自在線旅游平臺的文本信息。

圖1 導游違規行為檢測系統框架
首先對來自游客的導游相關評論進行文本預處理,包括分詞以及去停用詞。然后將進行詞嵌入,將文本轉化為向量,構建模型的輸入。再使用TextCNN對輸入文本的特征進行抽取與分類,根據情感傾向,從導游相關評論中識別出負面評論。最后使用基于Boosting方法的LightGBM分類框架,對導游相關的負面評論進行違規行為檢測與分類。導游違規行為有以下5類:(1)強迫消費;(2)毆打辱罵游客;(3)擅自更改行程;(4)餐飲/住宿條件與合同不符;(5)不具備相關從業資格。
2.1.1 TextCNN建模
TextCNN[11]采用多個尺寸不同的卷積核來提取文本信息,能夠更好地捕捉到上下文之間的關聯。該文構建的基于TextCNN的導游負面評論識別模型如圖2所示,主要包括嵌入層、卷積層、池化層、全連接層和輸出層[12]。

圖2 基于TextCNN的導游負面評論識別模型
(1)嵌入層。
嵌入層(輸入層)將一段文本轉換為一個maxlen×dim的二維矩陣,maxlen指輸入文本可包含的詞語數量最大值。該文統計去掉停用詞之后的游客評論文本序列的長度,共計76%長度在50以內,17.6%在50和100之間,5.8%在100之上。因此選定maxlen為100,長度不足的進行補齊,長度超過的進行截取。
設xi為某一個詞對應的長度為dim的word2vec[13-14]詞向量,通過將文本序列中每個詞對應的詞向量連接起來,就可以得到整個文本序列的詞向量表達矩陣:
X=x1⊕x2⊕···⊕xmaxlen
(1)
(2)卷積層。
在卷積層對上一層的輸出進行卷積運算,得到多個尺寸不同的特征圖(Feature Map)。卷積運算的過程可以表達為:
(2)
其中,cj指卷積運算得到的一個特征,b為偏置,W為卷積核矩陣,f為一個非線性函數。多個尺寸不同的卷積核在游客評論文本上形成多個跨度不同的滑動窗口,用來計算各個窗口內的單詞之間的聯系,如圖3所示。

圖3 提取旅游評論特征的滑動窗口
經過卷積層一個高度為h的卷積核產生一個特征圖(feature map)C:
C=[c1,c2,…,cmaxlen]
(3)
(3)池化層與全連接層。
在池化層,將特征圖作為輸入,進行維數降低。該文使用1-max-pooling的方式處理特征圖,從中選取最大值。全連接層將池化結果拼接起來,從而得到了一段文本的特征。
(4)輸出層。
通過sigmoid函數得到導游評論中游客各種情感傾向的概率,并在輸出層輸出:
(4)
構建深度學習模型之后,首先設定模型的損失函數為binary_crossentropy。
(5)

2.1.2 TextCNN參數設置
該文使用Keras框架搭建神經網絡。設定dim為300并在嵌入層使用預先訓練的旅游話題詞向量做權重。
在卷積層,設置了4種不同高度的卷積核(2,3,4,5),每個卷積核的寬度和詞向量的dim長度相等。每種卷積核各自設置100個filter,設定非線性函數為Relu函數,將分別輸出99×1,98×1,97×1,96×1的四種特征圖。在全連接層使用dropout和l2正則化的方式抑制訓練過程中的過擬合程度。
2.2.1 LightGBM建模
文中數據集本身存在數據不平衡的問題。采用集成學習通過集成元分類器分類結果的方式提升模型的泛化能力,進而提升分類器的性能[15]。LightGBM[16]采用基于Boosting方法的分類框架,可以更好地適應不平衡數據。
該文采用簡單數據增強EDA[17]的方式改善數據分布。具體措施包括:同義詞替換、刪除個別詞語、交換詞語在句子中順序、隨機插入新詞等。
(1)導游投訴文本向量化。
首先進行中文分詞和文本預處理(去停用詞),可以將一段短文本S處理成一段長度為n詞語序列:
S=s1+s2+…+sn
(6)
令vi為si在旅游話題詞向量中對應的詞向量,則可以計算得到短文本S的向量化表示V:
(7)
(2)計算梯度與生成決策樹。
LightGBM組合多個回歸決策樹T以得到最終的結果[18]:
(8)
其中,ft(x)指單個決策樹模型。LightGBM訓練過程中添加決策樹時第t步的損失可以表示成如下形式:
(9)
當損失函數L為均方函數時,采用損失函數的負梯度作為殘差r的近似值:
(10)
導游違規行為檢測的決策樹生成算法如算法1所示:
算法1:導游違規行為檢測決策樹生成算法。
輸入:模型訓練數據D={(x1,y1),(x2,y2),…,(xn,yn)}
輸入:樹的最大深度d
1:best_spilit_point ← 0
3:t←0
5:while(t 6: best_split_point←find_best_spilit() 7: 在best_split_point根據leaf_wise策略分裂決策樹 9:t++ 10:end while 其中,首先輸入導游違規行為數據集和樹的最大深度;在第4行設定導游違規行為檢測樹的目標函數,包括對違規行為進行預測產生的損失與樹的復雜度。在第6~9行計算目標函數,確定梯度下降的方向,計算最優切分點best_split_point并按照leaf_wise策略分割導游違規行為檢測決策樹并完成模型的更新。 (3)減少采樣與劃分最優節點。 LightGBM使用單邊梯度下降算法(gradient-based one side sampling,GOSS),減少計算量。GOSS使用梯度作為樣本權重,重點關注梯度較大的導游違規行為樣本[19]: (11) (12) 其中,n為使用樣本總數,gi為損失,Al、Ar、Bl和Br為劃分在節點左右的樣本。 在減少采樣的基礎上計算信息增益并劃分最優節點的算法如算法2所示: 算法2:最優節點劃分算法find_best_split。 輸入:訓練數據X,Y 輸入:大梯度樣本采樣率a,小梯度樣本采樣率b 1:gain_list←{} 2:sorted←降序排列(X) 3:topN←a×len(X) 4:rand(N)←b×len(X) 6:top_set←sorted[:topN] 7:rand_set←隨機選取(sorted[topN:],randN) 8:used_set←top_set+rand_set 9:forjin X.features: 10: gain←增益計算(j,used_set) 11: gain_list.append(gain) 12:end for 13:gain_max←max(gain_list) 14:ind←gain_list.index(gain_max) 15:return ind, gain_max 其中,首先輸入導游違規行為訓練數據集和樣本采樣率;第1~8行先按照梯度降序排列導游違規行為樣本,再根據大梯度樣本采樣率a和小梯度樣本采樣率b重新組合需要遍歷的樣本,從而減少樣本數量,第9~14行計算導游違規行為樣本各個屬性上的信息增益,并得到最大信息增益。 2.2.2 LightGBM建模 該文使用Python3.7環境下的LightGBM API進行模型的搭建和訓練。模型的超參數將會影響模型預測的準確率。為了取得更好的效果,在訓練過程中不斷對超參數進行尋優,最后得到的一組較好參數如表1所示。 表1 LightGBM主要超參數 該文設計并實現了基于TextCNN和LightGBM的導游違規行為檢測模型,能夠完成對旅游評論的負面評論識別和導游違規行為檢測。進行了多組實驗評估所提出的模型和方法,并與其他主流算法和模型進行了比較。 實驗的硬件是:CPU為Intel i7 9700K,內存為16G RDD4,顯卡為兩塊Nvidia RTX 2080ti,運行環境為Linux操作系統(Ubuntu 16.04.6)。全部實驗代碼由Python3.7編寫。神經網絡由Keras框架搭建,使用TensorFlow作為框架后端。 當前關于導游違規行為的識別暫無公開數據集,該文使用爬蟲構建數據集,使用的實驗數據來源有:(1)去哪兒網獲取的成都、北京、上海和廣州等地的景點評論信息;(2)人民網315旅游投訴平臺的投訴信息。并對這些實驗文本進行數據清洗,篩選出和導游相關的評論信息。 使用準確率(precision)、召回率(recall)、F1-score和正確率(accuracy)等指標評估模型性能。 3.2.1 導游負面評論識別模型評估與分析 選取獲取的共13 000余條評論進行實驗,包括好評(正面)7 000余條,差評(負面)6 000余條,如表3所示。按照0.8的比例劃分訓練集和測試集。在訓練集中,劃分出20%的數據做驗證集。 數據集的預處理使用Keras自帶的Tokenizer轉化為序列。為了抑制過擬合程度加入dropout層(設置值為0.5)并添加l2正則化(值為0.001)。 基于TextCNN的導游負面評論識別模型在驗證集上的準確率可以達到91.62%,損失為0.25。在測試數據中的正面評論數據和負面評論數據上準確率分別為0.916 4和0.919 7,召回率分別為0.906 5和0.928 3,F1-score分別為0.911 4和0.923 9。 通過準確率、召回率和F1-score在相同數據集上對基于TextCNN導游負面評論識別方法、基于CNN的導游負面評論識別方法、基于RNN的導游負面評論識別方法、基于LSTM的導游負面評論識別方法和基于FastText的導游負面評論識別方法進行比較,如圖4所示。綜合比較5種方法,文中方法的準確率(0.916 2)、召回率(0.918 2)、F1-score(0.198 1)均高于其他方法,在驗證集上的表現更加優秀。 圖4 不同導游負面評論識別方法比較 3.2.2 導游違規行為檢測分類模型評估與分析 經過簡單數據增強后共獲得訓練數據9 000余條,包括對強迫消費/參加自費項目行為的投訴2 280條,對擅自變更行程行為的投訴1 910條,對餐飲/住宿條件與合同不一致行為的投訴1 570條,對不具備從業資格行為的投訴1 096條,對毆打/辱罵游客行為的投訴2 286條。按照0.8的比例劃分訓練集和測試集,并在訓練過程中在訓練集中按照0.8的比例抽取數據進行驗證。基于LightGBM的導游違規行為檢測分類模型訓練過程中,該文設定迭代500次。 基于LightGBM的導游違規行為檢測分類模型在投訴信息的測試集上的正確率可以達到88%,表2列出了該模型在測試集上各類別上的表現。使用準確率、召回率和F1-score在相同數據集上對基于LightGBM的導游違規行為檢測分類方法、基于XGBoost的導游違規行為檢測分類方法、基于邏輯斯特回歸的導游違規行為檢測分類方法和基于SVM的導游違規行為檢測分類方法進行比較,如圖5所示。 表2 基于LightGBM的導游違規行為檢測模型各類別F1-score 圖5 不同導游違規行為識別方法比較 由圖5可知,文中方法的準確率最高,略高于XGBoost和Logistic Regression,SVM最差。 因為該文使用的數據集本身存在不平衡的特點,在參考F1-score外同時使用ROC曲線對不同方法進行評估,如圖6所示。一個分類器的ROC曲線越靠近左上方,分類效果越好。 圖6 不同導游違規行為識別方法ROC曲線 由圖6可知,LightGBM和XGBoost的AUC面積最大,略高于Logistic Regression,SVM的AUC面積最小。考慮到LightGBM算法本身由XGBoost改進而來,在準確率相當的情況下訓練時間更短(LightGBM訓練需要59.12 s,XGBoost訓練需要307.97 s)且內存占用更低,在文中的應用場景下LightGBM更加優秀。 由表2可知,由于“強迫消費”和“毆打/辱罵游客”這兩類數據中,帶有強烈特征的描述詞匯較多,模型識別效率較高。而在其他類別中,由于特征詞匯較少,且樣本數據存在一定的數據不均衡的問題,模型容易產生誤判,F1-score會稍低。 文中方法應用到了實際的旅游大數據系統中,進行了相應的系統測試。使用的實際系統數據中包含導游相關的好評以及各類差評各480條。系統測試數據表明,文中方法可以達到91.57%的準確率(precision)、91.64%的召回率(recall)、91.17%的F1-score和91.46%的正確率(accuracy)。該系統對導游違規行為檢測識別的示例如表3所示。文中方法適合于旅游大數據場景,能準確有效地識別檢測出導游違規行為。 表3 導游違規行為識別結果示例 采用文本分類解決了從旅游評論文本中識別出檢測導游違規行為的問題,構建了基于TextCNN的導游負面評論識別模型,進行了旅游評論的情感分析,識別出負面評論,再送入基于LightGBM的導游違規行為檢測分類模型,實現對導游違規行為的檢測與分類。通過和其他的主流模型的對比,該模型具備更好的性能,能夠兼顧識別檢測的準確率和召回率,降低正常行為被誤判的可能性,適合于對旅游評論文本的導游違規行為進行檢測。實驗表明,提出的基于TextCNN和LightGBM的導游違規行為檢測方法應用在實際旅游大數據系統中可以得到91.57%的準確率。構建的系統具備較高的可擴展性。在從旅游評論中檢測出負面評論后,對導游違規行為分類進行了初步探索。下一步還可以探索其他方面的投訴信息,進一步完善面向旅游市場的大數據智慧監管體系。



3 實驗分析
3.1 實驗設置和數據來源
3.2 模型性能評估




3.3 系統測試

4 結束語