文本分類是機器學習在自然語言處理中的最常用也是最基礎的應用,機器學習相關內容可以直接看我的有關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庫中已經實現,具體用法如下:
-
# coding:utf-8
-
import sys
-
reload(sys)
-
sys.setdefaultencoding( "utf-8" )
-
import nltk
-
my_train_set = [
-
({'feature1':u'a'},'1'),
-
({'feature1':u'a'},'2'),
-
({'feature1':u'a'},'3'),
-
({'feature1':u'a'},'3'),
-
({'feature1':u'b'},'2'),
-
({'feature1':u'b'},'2'),
-
({'feature1':u'b'},'2'),
-
({'feature1':u'b'},'2'),
-
({'feature1':u'b'},'2'),
-
({'feature1':u'b'},'2'),
-
]
-
classifier = nltk.NaiveBayesClassifier.train(my_train_set)
-
print classifier.classify({'feature1':u'a'})
-
print classifier.classify({'feature1':u'b'})
執行後判斷特徵a和特徵b的分類分別是3和2
因爲訓練集中特徵是a的分類是3的最多,所以會歸類爲3
當然實際中訓練樣本的數量要多的多,特徵要多的多
請尊重原創,轉載請註明來源網站www.shareditor.com以及原始鏈接地址
文檔分類
不管是什麼分類,最重要的是要知道哪些特徵是最能反映這個分類的特點,也就是特徵選取。文檔分類使用的特徵就是最能代表這個分類的詞。
因爲對文檔分類要經過訓練和預測兩個過程,而特徵的提取是這兩個過程都需要的,所以,習慣上我們會把特徵提取單獨抽象出來作爲一個公共方法,比如:
-
from nltk.corpus import movie_reviews
-
all_words = nltk.FreqDist(w.lower() for w in movie_reviews.words())
-
word_features = all_words.keys()[:2000]
-
def document_features(document):
-
for word in word_features:
-
features['contains(%s)' % word] = (word in document_words)
-
return features
這是一個簡單的特徵提取過程,前兩行找到movie_reviews語料庫中出現詞頻最高的2000個詞作爲特徵,下面定義的函數就是特徵提取函數,每個特徵都是形如contains(***)的key,value就是True或False,表示這個詞是否在文檔中出現
那麼我們訓練的過程就是:
-
featuresets = [(document_features(d), c) for (d,c) in documents]
-
classifier = nltk.NaiveBayesClassifier.train(featuresets)
要預測一個新的文檔時:
classifier.classify(document_features(d))
通過
classifier.show_most_informative_features(5)
可以找到最優信息量的特徵,這對我們選取特徵是非常有幫助的
其他文本分類
文本分類除了文檔分類外還有許多其他類型的分類,比如:
詞性標註:屬於一種文本分類,一般是基於上下文語境的文本分類
句子分割:屬於標點符號的分類任務,它的特徵一般選取爲單獨句子標識符的合併鏈表、數據特徵(下一個詞是否大寫、前一個詞是什麼、前一個詞長度……)
識別對話行爲類型:對話行爲類型是指問候、問題、回答、斷言、說明等
識別文字蘊含:即一個句子是否能得出另外一個句子的結論,這可以認爲是真假標籤的分類任務。這是一個有挑戰的事情