基於sklearn的文本特征提取與分類
本文呢是根據自己參加中移動垃圾短信基於文本內容識別競賽而寫的基於文本內容識別競賽,由於比賽結果不太好,就記錄一下用sklearn做文本特征提取這一塊吧,當時也參考許多的博文,如Featureextraction - sklearn文本特征提取 和應用scikit-learn做文本分類 以及文本挖掘之特征選擇(python 實現) 等文章。
題目是80萬條短信作為訓練數據,10%的垃圾短信(label = 1),90%正常短信(label = 0),然後在20萬條數據作為測試對象,找出垃圾短信與正常短信。我最終的評分是0.985,相對於第一0.997還是有很大差距,排名59/339。具體競賽內容可以參考中國好創意比賽官網。
文本分類大致可以分為:出本處理,特征提取,特征選擇,分類,預測幾個步驟,其中前三步占用80%的工作量。
1.文本處理
分詞,去除停用詞等。文本處理要做的內容很多,如果需要請參考其他文獻。
分詞我采用結巴分詞,有比較好用的python包,Python中文分詞組件 以供參考
去除停用詞需要根據實際情況作考慮,一般情況是需要的。
文本處理後,得到的應該是每條短信對應的分詞表,如:原”商業秘密的秘密性那是維係其商業價值和壟斷地位的前提條件之一“經過處理後為”商業秘密 秘密性 維係 商業價值 壟斷 地位 前提條件 之一 “
核心代碼:
# (i not in stopWords) and def cutWords(msg,stopWords): seg_list = jieba.cut(msg,cut_all=False) #key_list = jieba.analyse.extract_tags(msg,20) #get keywords leftWords = [] for i in seg_list: if (i not in stopWords): leftWords.append(i) return leftWords #獲取停用詞表 def loadStopWords(): stop = [line.strip().decode('utf-8') for line in open('../data/stopWord.txt').readlines() ] return stop2.特征提取,特征選擇
這裏呢就需要參考上麵的提到的兩個參考博文了,具體API的用法可以參考sklearn官網 這裏使用的是tfidf特征
核心代碼舉例,具體參考附錄的完整工程:
#navie bayes classifier def nbClassifier(trainData,testData,trainLabel,testLabel): vectorizer = CountVectorizer(binary=True) fea_train = vectorizer.fit_transform(trainData) fea_test = vectorizer.transform(testData); # tv=TfidfVectorizer()#該類會統計每個詞語的tf-idf權值 # fea_train = tv.fit_transform(trainData) #return feature vector 'fea_train' [n_samples,n_features] # fea_test = tv.transform(testData); print 'Size of fea_train:' + repr(fea_train.shape) print 'Size of fea_test:' + repr(fea_test.shape) print fea_train.nnz print fea_test.nnz clf = MultinomialNB(alpha = 0.01) clf.fit(fea_train,np.array(trainLabel)) pred = clf.predict(fea_test) totalScore(pred,testData,testLabel)
3.分類,預測
這個不多說,常見的方法就那麼幾種,相差不會很大。如果需要達到很高的分數還需要算法上的修改優化。
工程代碼請到我的github主頁下載點擊打開鏈接
最後更新:2017-04-26 17:31:25