呂 彥,程樹林
(安慶師范大學計算機與信息學院,安徽安慶246133)
隨著Web2.0的深入應用,用戶為互聯網貢獻了大量的文本信息,實現文本自動分類成為組織信息的一種高效方式。因此,文本分類作為自然語言處理領域中的一個重要應用,得到較為廣泛的研究[1-2]。當前,電商平臺商品數量越來越多,需要對商品進行分類,便于尋找自己所需的商品,因此商品自動分類無疑是很好的選擇。商品分類是根據商品的描述,設計一個分類模型,通過現有已知分類標簽的數據進行學習,再利用學習好的模型對新商品進行自動分類。
基于貝葉斯定理和特征條件相互獨立的假設的樸素貝葉斯分類方法可有效地用于文本分類。對于給定的訓練數據集,在基于樣本特征相互獨立的假設下,先學習輸入(特征)/輸出(分類)的聯合概率分布;然后,利用貝葉斯定理計算待分類的數據在各類別下的后驗概率;最后根據最大后驗概率原則輸出分類結果。由于分類模型簡單、易于理解、學習速度快、效果好,且方便在分布式環境下實現并行化學習和分類[3],以及可以實現實時分類的特點,因此基于貝葉斯的分類方法在各種文本分類應用中較為廣泛。樸素貝葉斯分類方法對維度過高的情況,有時分類效果不是很理想。而在基于商品描述的文本分類問題中,商品描述相對較短且特征詞較為集中。因此,適合使用樸素貝葉斯分類方法進行商品的自動分類。本文針對第十屆中國大學創新創業大賽的第А01問題“網絡零售商品分類【浪潮】”,研究樸素貝葉斯理論構建商品自動分類模型,以其提供的50萬條商品數據集進行實驗,應用Python語言和模型庫實現商品的自動分類。
第十屆中國大學創新創業大賽的第А01問題“網絡零售商品分類【浪潮】”數據集包含了50萬條已標記的數據,原始數據集中每件商品僅給出了描述信息以及商品所屬的類別,示例如圖1所示。

圖1 數據集示例截圖
原始數據不能直接用來分類,需要進行數據預處理。(1)使用Python的pandas庫中pandas.DataFrame.drop()方法濾除缺失的數據。由于樸素貝葉斯是一個概率分類器,想要計算出某詞匯描述屬于各分類的概率,需要通過正則表達式對商品描述信息進行分詞處理,即將所有商品描述信息去除所有的非文字部分后利用jieba分詞器對商品描述信息進行詞語切分,如圖2所示。(2)清除中文停用詞,這些停用詞對商品描述信息本身并沒有多大意義。部分清除后的商品描述信息如圖3所示。

圖2 切詞后數據集示例

圖3 清除停用詞后商品描述信息示例
數據集中商品描述為短文本,經過切詞后得到商品的特征信息。采用sklearn庫中的CountVectorizer類進行特征詞的量化計算。CountVectorizer是一個文本特征提取方法,其思想是先根據訓練集中所有樣本,不考慮其出現順序,只將訓練文本中每個出現過的詞匯單獨視為一列特征,構成一個詞匯表(Vocabulary List),該方法又稱為詞袋法(Bag of Words)。然后,使用Python中的fit_transform函數將特征詞的信息轉換為詞頻矩陣。
設根據商品描述提取n個特征詞,且有K個商品類別,則輸入空間X??n定義為n維向量的集合,輸出空間Y={y1,y2,…,ym}為分類標記形成的集合,所有類別值形成類別空間C={c1,c2,…,cK},則N個樣本元素的訓練數據集表示為

其中,任意的(xi,yi)和(xj,yj)兩個元素滿足獨立同分布的條件。若在輸入空間上給定隨機向量xi=(xi1,xi2,…,xin)∈?,則輸出的類標記為y∈Y,P(xi,y)為xi和y的聯合概率分布。
通過對訓練集的學習,得到聯合概率分布P(xi,y),即學習先驗概率分布及條件概率分布。根據學習到的模型計算輸入xi屬于每一種輸出類別的后驗概率分布P(y=ck|xi),選擇最大后驗概率作為最終的輸出,后驗概率最大化表明對于任意輸入xi所得輸出y在所有類別中,期望風險最小化[4],因此樸素貝葉斯分類方法根據后驗概率最大化準則計算最終輸出。
樸素貝葉斯分類模型學習的過程實際上是估計先驗概率和條件概率,即P(y=ck)和P(x=xi|y=ck),可以使用極大似然估計[5]。但極大似然估計可能會出現所估計的概率值為0的情況,這將導致在對新商品進行預測分類時后驗概率的計算產生一定的誤差。因此,本文提出在商品分類時采用拉普拉斯平滑(Laplace Smoothing)修正后驗概率,進而生成樸素貝葉斯分類方法。在估計條件概率時使用貝葉斯估計,則先驗概率的貝葉斯估計為

樣本xi的第j個屬性取值為ajl的條件概率的貝葉斯估計為

其中,λ≥0,當λ=0時為極大似然估計,當λ=1為拉普拉斯平滑的貝葉斯估計,N為商品訓練集樣本個數,K為商品類別個數,Kj為商品第j個特征詞的取值個數,顯然這里Kj=2,即表示存在與否。
針對數據集中的50萬條數據,本文隨機劃分20%為測試集,80%作為訓練集,并進行了5次交叉實驗。Python中運用train_test_split進行數據集的劃分,關鍵代碼如下:
from sklearn.model_selection import train_test_split
#分割數據
x_train,x_test,y_train,y_test=train_test_split(df_train[‘contents_clean’].values,df_train[‘label’].valaues)
為保證每個維度的特征數據方差為1,均值為0,使得預測結果不會被某些維度過大的特征值主導,本文應用了多項式樸素貝葉斯分類算法,即MultinomialNB。實驗環境為Аnoconda3(64)的Jupyter Notebook和Python 3.6,調用之前,通過以下方法引入庫numpy和sklearn:
import numpy as np
from sklearn.navie_bayes import MultnomialNB
實驗中使用到的關鍵分類方法為sklearn.naive_bayes.MultinomialNB(alpha=1.0,fit_prior=True,class_prior=None)。其中,alpha為浮點型,可選項,默認1.0,拉普拉斯平滑參數本文使用了默認值alpha=1.0;fit_prior為布爾型,可選項,默認為True,表示是否學習先驗概率,取False值時表示所有類標記具有相同的先驗概率,本文使用了True;class_prior為類似數組,數組大小為(n_classes),默認None。
劃分好數據集后先運用fit()方法從一個訓練集中學習模型參數,其中就包括歸一化時用到的均值和標準偏差,而測試數據只需要在原先的基礎上進行歸一化,再運用transform()方法對數據進行標準化處理。表1是根據已得到的標準化數據,采用多項式貝葉斯分類器進行擬合后的預測結果。5次預測精度相當,最終平均精度為0.731,預測效果較好。

表1 實驗預測結果
在電子商務時代,商品的自動分類具有重要的研究意義和實際應用價值。本文針對商品描述的特點,提出使用基于多項式樸素貝葉斯方法對商品進行自動分類,并在一個具有50萬條數據的真實數據集上進行了驗證。實驗結果表明,樸素貝葉斯分類效率較為穩定,預測準確率較高,且對缺失數據不太敏感。但由于樣本特征屬性之間相互獨立是樸素貝葉斯方法的前提,使得樸素貝葉斯分類方法在滿足該條件的數據集上分類效果較好,而對于不滿足此條件的數據集上分類效果欠佳。因此,在實際應用過程中,當特征屬性個數非常多、屬性之間的相關性比較大時,不建議使用樸素貝葉斯分類方法。