1. 程式人生 > >文字分類的python實現-基於SVM演算法

文字分類的python實現-基於SVM演算法

描述

  • 訓練集為評論文字,標籤為 pos,neu,neg三種分類,train.csv的第一列為文字content,第二列為label。可以單獨使用SVC訓練然後預測,也可以使用管道pipeline把訓練和預測放在一塊。
  • SVC的懲罰引數C:預設值是1.0。C越大,對誤分類的懲罰增大,趨向於對訓練集全分對的情況,這樣對訓練集測試時準確率很高,但泛化能力弱。C值小,對誤分類的懲罰減小,允許容錯,泛化能力較強。
  • 儘管TF-IDF權重有著非常廣泛的應用,但並不是所有的文字權重採用TF-IDF都會有較好的效能。在有些問題上,採用BOOL型的權重(單詞在某個文件中出現記為1,不出現記為0)可以得到更好的效能。通過增加CountVectorizer的引數(binary = True)實現。

實驗

程式碼

# -*- coding: utf-8 -*-
import csv
import jieba
jieba.load_userdict('wordDict.txt')
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline
from
sklearn import metrics from sklearn.grid_search import GridSearchCV # 讀取訓練集 def readtrain(): with open('Train.csv', 'rb') as csvfile: reader = csv.reader(csvfile) column1 = [row for row in reader] content_train = [i[1] for i in column1[1:]] #第一列為文字內容,並去除列名 opinion_train = [i[2
] for i in column1[1:]] #第二列為類別,並去除列名 print '訓練集有 %s 條句子' % len(content_train) train = [content_train, opinion_train] return train # 將utf8的列表轉換成unicode def changeListCode(b): a = [] for i in b: a.append(i.decode('utf8')) return a # 對列表進行分詞並用空格連線 def segmentWord(cont): c = [] for i in cont: a = list(jieba.cut(i)) b = " ".join(a) c.append(b) return c # corpus = ["我 來到 北京 清華大學", "他 來到 了 網易 杭研 大廈", "小明 碩士 畢業 與 中國 科學院"] train = readtrain() content = segmentWord(train[0]) opinion = train[1] # 劃分 train_content = content[:7000] test_content = content[7000:] train_opinion = opinion[:7000] test_opinion = opinion[7000:] # 計算權重 vectorizer = CountVectorizer() tfidftransformer = TfidfTransformer() tfidf = tfidftransformer.fit_transform(vectorizer.fit_transform(train_content)) # 先轉換成詞頻矩陣,再計算TFIDF值 print tfidf.shape # 單獨預測 ''' word = vectorizer.get_feature_names() weight = tfidf.toarray() # 分類器 clf = MultinomialNB().fit(tfidf, opinion) docs = ["在 標準 狀態 下 途觀 的 行李廂 容積 僅 為 400 L", "新 買 的 鋒馭 怎麼 沒有 隨 車 滅火器"] new_tfidf = tfidftransformer.transform(vectorizer.transform(docs)) predicted = clf.predict(new_tfidf) print predicted ''' # 訓練和預測一體 text_clf = Pipeline([('vect', CountVectorizer()), ('tfidf', TfidfTransformer()), ('clf', SVC(C=0.99, kernel = 'linear'))]) text_clf = text_clf.fit(train_content, train_opinion) predicted = text_clf.predict(test_content) print 'SVC',np.mean(predicted == test_opinion) print set(predicted) #print metrics.confusion_matrix(test_opinion,predicted) # 混淆矩陣 # 迴圈調參 ''' parameters = {'vect__max_df': (0.4, 0.5, 0.6, 0.7),'vect__max_features': (None, 5000, 10000, 15000), 'tfidf__use_idf': (True, False)} grid_search = GridSearchCV(text_clf, parameters, n_jobs=1, verbose=1) grid_search.fit(content, opinion) best_parameters = dict() best_parameters = grid_search.best_estimator_.get_params() for param_name in sorted(parameters.keys()): print("\t%s: %r" % (param_name, best_parameters[param_name])) '''

輸出

Building prefix dict from the default dictionary ...
Loading model from cache c:\users\www\appdata\local\temp\jieba.cache
Loading model cost 0.383 seconds.
Prefix dict has been built succesfully.

訓練集有 10981 條句子
(7000, 14688)
SVC 0.701582516956
set(['neg', 'neu', 'pos'])