文字分類學習筆記(5) KNN

2021-07-10 05:18:35 字數 3287 閱讀 2198

knn分類器實現,執行極慢不推薦;

#coding=utf-8

from numpy import *

from scipy import sparse,io

from sklearn.datasets import load_files

from sklearn.cross_validation import train_test_split

from sklearn.feature_extraction.text import countvectorizer

from sklearn.feature_extraction.text import tfidfvectorizer

from sklearn.feature_selection import selectkbest, chi2

from sklearn.*****_bayes import multinomialnb

from sklearn.linear_model import logisticregression

from sklearn import neighbors

from sklearn import metrics

from operator import itemgetter

import warnings

warnings.filterwarnings("ignore")

defcalculate_result

(actual,pred):

m_precision = metrics.precision_score(actual,pred)

m_recall = metrics.recall_score(actual,pred)

m_acc = metrics.accuracy_score(actual,pred)

print

'predict info:'

print

'accuracy:'.format(m_acc)

print

'precision:'.format(m_precision)

print

'recall:'.format(m_recall)

print

'f1-score:'.format(metrics.f1_score(actual,pred))

deftext_classsfier

(train_dir,test_dir):

#load datasets

doc_train = load_files(train_dir)

doc_test = load_files(test_dir)

#切分資料集,由於有單獨的測試集,故省略

#doc_terms_train, doc_terms_test, doc_class_train, doc_class_test = train_test_split(doc_train.data, doc_train.target, test_size = 0.2)

#呼叫vectorizer提取文字特徵

#bool型特徵(one-hot)

#count_vec = countvectorizer(binary = true,decode_error='replace')

#tf-idf特徵(詞頻)

count_vec = tfidfvectorizer(min_df=1,decode_error='replace')

doc_train_bool = count_vec.fit_transform(doc_train.data)

doc_test_bool = count_vec.transform(doc_test.data)

#呼叫knn分類器**分類

predicted =

test = doc_test_bool.toarray()

for i in doc_test.target:

print i,

print

for i in xrange(shape(test)[0]):

x = classify(test[i], doc_train_bool.toarray(), doc_train.target,10)

print x,

#計算分類準確度資訊

calculate_result(doc_test.target,predicted)

#儲存分類結果

file_o = open('result_knn.txt', 'w')

file_o.write(str(predicted))

#knn分類器,使用歐式距離度量,未使用kd樹

defclassify

(inx, dataset, labels, k):

datasetsize = dataset.shape[0]

diffmat = tile(inx, (datasetsize,1)) - dataset#將陣列a作為元素構造m行n列的陣列

#以矩陣為單位計算距離

sqdiffmat = diffmat**2

sqdistances = sqdiffmat.sum(axis=1)#(axis=1)按行累加

distances = sqdistances**0.5

sorteddistindicies = distances.argsort()#每個元素的排序序號

classcount = {}#sorteddistindicies[0]表示排序後排在第乙個的那個數在原來陣列中的下標

for i in range(k):

voteilabel = labels[sorteddistindicies[i]]

classcount[voteilabel] = classcount.get(voteilabel,0) + 1

#獲取key對應的value,沒有key返回0

sortedclasscount = sorted(classcount.iteritems(), key=itemgetter(1), reverse=true)#按照value逆向排序

return sortedclasscount[0][0]

if __name__ == '__main__':

text_classsfier('training','test')

執行結果:

accuracy

:0.811

precision

:0.816

recall

:0.811

f1-score

:0.808

文字分類學習(一) 開篇

今天開始,就要認真開始對待文字分類,在此之前只是稀疏的看過一些部落格,了解一下貝葉斯分類。之所以要學習文字分類,是因為我做的畢業設計就是關於文字分類和機器學習的。突然感覺到時間不太夠用了,而擺在我面前的實際上是乙個很浩大的工程,不得不抓緊時間開始研究。至於為什麼畢業設計會選擇文字分類演算法,因為覺得...

文字分類學習(一) 開篇

今天開始,就要認真開始對待文字分類,在此之前只是稀疏的看過一些部落格,了解一下貝葉斯分類。之所以要學習文字分類,是因為我做的畢業設計就是關於文字分類和機器學習的。突然感覺到時間不太夠用了,而擺在我面前的實際上是乙個很浩大的工程,不得不抓緊時間開始研究。至於為什麼畢業設計會選擇文字分類演算法,因為覺得...

文字分類學習(六) AdaBoost和SVM

直接從特徵提取,跳到了boostsvm,是因為自己一直在寫程式,分析垃圾文字,和思考文字分類用於識別垃圾文字的短處。自己學習文字分類就是為了識別垃圾文字。中間的部落格待自己研究透徹後再補上吧。因為獲取垃圾文字的時候,發現垃圾文字不是簡單的垃圾文字,它們具有多個特性 1.種類繁多,難有共同的特徵。涵蓋...