五、自然語言處理中的文本分類

文本分類是機器學習在自然語言處理中的最常用也是最基礎的應用,機器學習相關內容可以直接看我的有關scikit-learn相關教程,本節直接涉及nltk中的機器學習相關內容

請尊重原創,轉載請註明來源網站www.shareditor.com以及原始鏈接地址

先來一段前戲

機器學習的過程是訓練模型和使用模型的過程,訓練就是基於已知數據做統計學習,使用就是用統計學習好的模型來計算未知的數據。

機器學習分爲有監督學習和無監督學習,文本分類也分爲有監督的分類和無監督的分類。有監督就是訓練的樣本數據有了確定的判斷,基於這些已有的判斷來斷定新的數據,無監督就是訓練的樣本數據沒有什麼判斷,完全自發的生成結論。

無論監督學習還是無監督學習,都是通過某種算法來實現,而這種算法可以有多重選擇,貝葉斯就是其中一種。在多種算法中如何選擇最適合的,這纔是機器學習最難的事情,也是最高境界。

 

nltk中的貝葉斯分類器

 

貝葉斯是概率論的鼻祖,貝葉斯定理是關於隨機事件的條件概率的一則定理,貝葉斯公式是:

P(B|A)=P(A|B)P(B)/P(A);即,已知P(A|B),P(A)和P(B)可以計算出P(B|A)。

貝葉斯分類器就是基於貝葉斯概率理論設計的分類器算法,nltk庫中已經實現,具體用法如下:


 
  1. # coding:utf-8

  2.  
  3. import sys

  4. reload(sys)

  5. sys.setdefaultencoding( "utf-8" )

  6. import nltk

  7.  
  8. my_train_set = [

  9. ({'feature1':u'a'},'1'),

  10. ({'feature1':u'a'},'2'),

  11. ({'feature1':u'a'},'3'),

  12. ({'feature1':u'a'},'3'),

  13. ({'feature1':u'b'},'2'),

  14. ({'feature1':u'b'},'2'),

  15. ({'feature1':u'b'},'2'),

  16. ({'feature1':u'b'},'2'),

  17. ({'feature1':u'b'},'2'),

  18. ({'feature1':u'b'},'2'),

  19. ]

  20. classifier = nltk.NaiveBayesClassifier.train(my_train_set)

  21. print classifier.classify({'feature1':u'a'})

  22. print classifier.classify({'feature1':u'b'})

 

執行後判斷特徵a和特徵b的分類分別是3和2

因爲訓練集中特徵是a的分類是3的最多,所以會歸類爲3

當然實際中訓練樣本的數量要多的多,特徵要多的多

請尊重原創,轉載請註明來源網站www.shareditor.com以及原始鏈接地址

文檔分類

不管是什麼分類,最重要的是要知道哪些特徵是最能反映這個分類的特點,也就是特徵選取。文檔分類使用的特徵就是最能代表這個分類的詞。

因爲對文檔分類要經過訓練和預測兩個過程,而特徵的提取是這兩個過程都需要的,所以,習慣上我們會把特徵提取單獨抽象出來作爲一個公共方法,比如:


 
  1. from nltk.corpus import movie_reviews

  2. all_words = nltk.FreqDist(w.lower() for w in movie_reviews.words())

  3. word_features = all_words.keys()[:2000]

  4. def document_features(document):

  5. for word in word_features:

  6. features['contains(%s)' % word] = (word in document_words)

  7. return features

這是一個簡單的特徵提取過程,前兩行找到movie_reviews語料庫中出現詞頻最高的2000個詞作爲特徵,下面定義的函數就是特徵提取函數,每個特徵都是形如contains(***)的key,value就是True或False,表示這個詞是否在文檔中出現

那麼我們訓練的過程就是:


 
  1. featuresets = [(document_features(d), c) for (d,c) in documents]

  2. classifier = nltk.NaiveBayesClassifier.train(featuresets)

 

要預測一個新的文檔時:

classifier.classify(document_features(d))

 

通過

classifier.show_most_informative_features(5)

可以找到最優信息量的特徵,這對我們選取特徵是非常有幫助的

 

其他文本分類

文本分類除了文檔分類外還有許多其他類型的分類,比如:

詞性標註:屬於一種文本分類,一般是基於上下文語境的文本分類

句子分割:屬於標點符號的分類任務,它的特徵一般選取爲單獨句子標識符的合併鏈表、數據特徵(下一個詞是否大寫、前一個詞是什麼、前一個詞長度……)

識別對話行爲類型:對話行爲類型是指問候、問題、回答、斷言、說明等

識別文字蘊含:即一個句子是否能得出另外一個句子的結論,這可以認爲是真假標籤的分類任務。這是一個有挑戰的事情

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章