文字分類的python實現-基於SVM演算法
阿新 • • 發佈:2019-01-28
描述
- 訓練集為評論文字,標籤為 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'])