基於sklearn的文字特徵提取與分類
阿新 • • 發佈:2019-01-04
文章開的比較久但內容沒怎麼寫,不好意思!
題目是80萬條簡訊作為訓練資料,10%的垃圾簡訊(label = 1),90%正常簡訊(label = 0),然後在20萬條資料作為測試物件,找出垃圾簡訊與正常簡訊。我最終的評分是0.985,相對於第一0.997還是有很大差距,排名59/339。具體競賽內容可以參考中國好創意比賽官網。
文字分類大致可以分為:出本處理,特徵提取,特徵選擇,分類,預測幾個步驟,其中前三步佔用80%的工作量。
1.文字處理
分詞,去除停用詞等。文字處理要做的內容很多,如果需要請參考其他文獻。
分詞我採用結巴分詞,有比較好用的python包,Python中文分片語件 以供參考
去除停用詞需要根據實際情況作考慮,一般情況是需要的。
文字處理後,得到的應該是每條簡訊對應的分詞表,如:原”商業祕密的祕密性那是維繫其商業價值和壟斷地位的前提條件之一“經過處理後為”商業祕密 祕密性 維繫 商業價值 壟斷 地位 前提條件 之一 “
核心程式碼:
2.特徵提取,特徵選擇# (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 stop
這裡呢就需要參考上面的提到的兩個參考博文了,具體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.分類,預測
這個不多說,常見的方法就那麼幾種,相差不會很大。如果需要達到很高的分數還需要演算法上的修改優化。
4.改進
由於垃圾簡訊中存在特殊字元,比如,三角/方框/繁體字等,在預處理時可以建立所有文件的異常符號詞庫,作為字典,對結果肯定有提升.
參考比賽第一名的ppt,對我來說參考意義也蠻大,需要的可以在我的資源點選開啟連結檢視.
本人的工程程式碼以及資料請到我的github主頁下載點選開啟連結