python文本分类_教你用python做文本分类
什么是文本分類
一個文本分類問題就是將一篇文檔歸入預先定義的幾個類別中的一個或幾個。通俗點說,就是拿一篇文章,問計算機這文章要說的究竟是體育,經濟還是教育。文本分類是一個監督學習的過程,常見的應用就是新聞分類,情感分析等等。其中涉及到機器學習,數據挖掘等領域的許多關鍵技術:分詞,特征抽取,特征選擇,降維,交叉驗證,模型調參,模型評價等等,掌握了這個有助于加深對機器學習的的理解。這次我們用python的scikit-learn模塊實現文本分類。
文本分類的過程
首先是獲取數據集,為了方便,我們直接使用scikit-learn的datasets模塊自帶的20類新聞數據集,并且取了其中四個類別的新聞
從datasets獲取到一般都是一個Bunch對象,Bunch是一種類似于python字典的格式,我們拿到任何一個數據集之后都可以探索數據集,輸出Bunch對象的鍵keys看看有什么,看看數據集的描述,數據的內容等等。
接下來就要進行分詞和去停用詞,分詞就是將句子切分成單詞,這些詞語就是后面用來訓練模型的特征。切分成單詞之后就要去除停用詞,停用詞一些無意義的詞,比如‘the’,‘a’這些詞對于文本分類沒有幫助,網上可以找到中英文的停用詞表來幫助去掉停用詞。由于英文句子中的單詞之間有空格,所以英文分詞十分簡單。如果處理的是中文語料,jieba分詞可以幫助我們方便地進行中文分詞。除了分詞之外,中英文文本分類處理基本上是一樣的。
計算機怎么讀懂文本呢,接下來進就需要行文本表示,我們常用向量空間模型(VSM)。簡單的解釋VSM模型,例如,經過分詞后得到文檔1=,標記為1類,文檔2=,標記為0類。我們得到所有文檔共享的一個文檔詞典,那么對應的VSM就可以表示為文檔1表示為[1,2,1,1,0],文檔2表示為[2,1,1,0,1]其中權重是每個詞出現的次數。權重也可以是bool值,出現為1,不出現為0,不考慮出現次數;也可以用tf-idf值表示,tf-idf簡單來說就是存在一個詞語A,它在每篇文檔中出現的次數越多,并且在越少的文檔中出現,那么tf-idf值就越大。VSM模型表示方法的優點就是簡單,便于理解,缺點是丟失了詞與詞之間的前后順序信息。
這里用的是scikit-learn中的feture_extraction.text.CountVectorizer模塊,就是從文本中抽取特征,兩行代碼實現了分詞,去除停用詞,建立VSM模型,得到的X就是VSM模型的矩陣,就是這么方便強大,這里的min_df用來降維,下面會提到。如果是處理中文語料,那么我們就需要提前分詞,去除停用詞,然后就可以用CountVectorize來得到VSM模型的矩陣了。
建立了向量空間模型后,首先面對的問題就是VSM的矩陣維數太大,我們訓練集有2034篇文檔,得到的VSM是2034*33814維,而如果文檔比較多的話,文檔詞典的詞語個數很容易會達到幾十萬個。我們需要進行降維處理,一方面可以讓模型訓練更快,同時也能夠增加模型泛化能力。在文本處理中,常用的降維方法有文檔頻數法(document frequency, df),卡方檢驗,互信息法。df降維認為特征在越多文本中出現,對分類作用越大,實驗證明,df雖然簡單,卻相當有效。我們已經在上面實現了,就是‘min_df=2’這個參數,含義就是若某個詞語只在一篇文檔中出現,我們就把它從文檔詞典中去掉,當然這個值可以設的再大一些。經過df降維后,特征由33814降到了17264維。
卡方檢驗,卡方值描述了自變量與因變量之間的相關程度:卡方值越大,相關程度也越大,所以很自然的可以利用卡方值來做降維,保留相關程度大的變量。用前面的例子,現在文檔詞典是,VSM模型矩陣為[[1,2,1,1,0],[2,1,1,0,1]],對應的類別y為[1,0]。也就是特征A的值為[1,2],來和y[1,0]計算一個卡方值,接下來計算B,C,D,E的卡方值,然后我們選擇前K個卡方值大的變量,進行特征降維。互信息法也是一樣的,互信息描述了兩個分布之間相關程度,只是和卡方的計算公式不同。我們認為和y相關度越大,越有利于分類。
沒有搞懂卡方檢驗和互信息法也沒有關系,scikit-learn為我們提供了模塊可以很方便的進行計算。
接下來就可以訓練模型了,從文本分類實踐來看,最好的文本分類的機器學習算法可以說就是SVM了 。代碼如下:
首先我們對測試集data_test.data建立VSM模型,不用擔心這樣會出什么問題,使用vectorizer.transform(data_test.data)可以保證測試集和訓練集的文檔字典是一致的,用前面的例子來講,訓練集的文檔詞典是,無論測試集中含有什么新的單詞,我們仍然保證測試集的文檔詞典是,這樣才是有意義的。同樣的,對測試集的卡方檢驗也會選出和訓練集一樣的特征。
網格搜索GridSearch調參,聽起來很高大上,其實就是暴力搜索,我們這里為SVC的kernel 和C分別提供了兩個值,那么就會有4個組合,分別進行訓練,挑出最優的。這里的cv就是cross_validate,交叉驗證,cv=5就是5折交叉驗證,后面的score參數說的是我們選出的模型是準確率得分最高的,當然可以有其它評價標準。在scikit-learn中交叉驗證屬于模型選擇模塊,可能有的同學會不理解交叉驗證和模型選擇有什么關系,用這里的5折交叉驗證舉例說明
將樣本分成5份,用涂成紅色作為測試,其余4組作為訓練,模型1是SVC(kerner=’linear’,C=0.1),可以訓練5次,每次訓練都可以得到一個準確率的值,然后對5次求平均就得到了模型1的得分。模型2 SVC(kerner=’linear’,C=1),模型3 SVC(kerner=’poly’,C=0.1),模型4 SVC(kerner=’poly’,C=1)同理。最后我們從這4個種選出得分最高的模型,作為最終的模型,這就是交叉驗證在模型選擇中起到的作用。
最后就是模型評價,一般來說準確率(accuracy)很常用,但是對于不均衡樣本,看準確率實際上沒什么價值。假設測試集有100個樣本10個正樣本,90個負樣本,那即使全部預測為負樣本,仍然能得到90%的準確率,但是這是沒有價值的。我們可以引入精確率(precision),召回率(recall)和f1值來評價分類模型,也可以通過roc曲線和auc的值來分析。
最終得到的結果如下:
總結
如何提升結果呢?我們可以使用2-gram模型,舉例來說,“Don’t tase me, bro” 如果是1-grams, “don’t,” “tase,” “me,” 和“bro.” 如果是 2-grams ,得到“don’t tase”, “tase me”和 “me bro.”這樣保留了相鄰的詞語順序信息,不過這樣會產生更多的特征。還有我們可以把VSM模型中的權值改為bool值,或者tf-idf值,來看看效果是否有提升,這些用scikit-learn都可以很方便的實現。
理解了python文本分類了嗎?
若還有疑問,歡迎在留言板處提問哦!
總結
以上是生活随笔為你收集整理的python文本分类_教你用python做文本分类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中csv库_关于python
- 下一篇: c++ 异步下获取线程执行结果_【分享吧