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

2021-07-28 14:20:07 字數 3417 閱讀 4092

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

# 讀取訓練集

defreadtrain

():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

defchangelistcode

(b):

a =

for i in b:

return a

# 對列表進行分詞並用空格連線

defsegmentword

(cont):

c =

for i in cont:

a = list(jieba.cut(i))

b = " ".join(a)

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 =

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 cost 0.383 seconds.

prefix dict has been built succesfully.

訓練集有 10981 條句子

(7000, 14688)

svc 0.701582516956

set(['neg', 'neu', 'pos'])

基於kNN的文字分類原理以及實現

前兩天寫了 基於libsvm中文文字分類 只是做到了會用的,要做到知其然知其所以然還是很難的。不過svm的應用很廣泛,除了文字分類,比如人臉識別,手寫識別,甚至驗證碼識別都可以搞定。knn k最鄰近 演算法相對而言,就簡單得多了。1,knn演算法就是找到k個最相似的樣本,這些樣本所在的類,就是當前文...

基於DL的文字分類綜述

新聞分類系統可以幫助使用者實時獲取感興趣的資訊。識別新興新聞主題並根據使用者興趣推薦相關新聞是新聞分類的兩個主要應用。主題分析試圖通過識別文字主題來自動從文字中獲取含義。主題分類是主題分析最重要的組成技術之一。主題分類的目的是為每個文件分配乙個或多個主題,以使其更易於分析。問答系統有兩種型別 抽取式...

實現文字分類的過程

資料集的預處理 去停用詞,過濾標點,空格分隔並去掉標點,大小寫統一等 詳細請參考 將原始資料轉換為特徵向量,為了從資料集中選出重要的特徵,有以下幾種方式 特徵工程詳情請見 詞嵌入作為特徵 基於文字 nlp的特徵 主題模型作為特徵 樸素貝葉斯分類器 線性分類器 支援向量機 淺層神經網路 深層神經網路 ...