1. 程式人生 > >基於sklearn的文字特徵提取與分類

基於sklearn的文字特徵提取與分類

文章開的比較久但內容沒怎麼寫,不好意思!

題目是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 stop
2.特徵提取,特徵選擇

這裡呢就需要參考上面的提到的兩個參考博文了,具體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主頁下載點選開啟連結