從上一節提取出的全部特徵中選取出關鍵的特徵,並利用支援向量機對測試樣本做回歸計算,判斷準確率
通過tf-idf計算出來的數值是某個特徵(詞)對於這篇文件的權重,不代表這個特徵(詞)在文字分類中的權重。這很容易理解,比如某乙個特徵(詞)在多個分類中的tf-idf是不一樣的,但是這個特徵對於這個分類問題的權重肯定是乙個定值。
選取重要的特徵的方法可以是:1.)按tf-idf排序從大到小選topn;2)按特徵的普遍性選取(在多個類別中出現過);3)按特徵在不同文件中tf-idf的差距選擇;
我們這次採取結合的形式:在至少2個類別中tf-idf大於0,同時在多個類別中第一名高於第二名10%以上。這麼選擇的原因是:我的總類別一共5種比較少,所以2個類別以上就說明具有普遍性了,你可以根據你的類別數目調整,第一名高於第二名10%表示這個特徵具有一定的區分度。
修改我們的feature_extract.py如下:
def
feature_dump
(): cursor = conn.cursor()
category={}
category[0] = 'istec'
category[1] = 'issoup'
category[2] = 'ismr'
category[3] = 'ismath'
category[4] = 'isnews'
corpus=
for index in range(0, 5):
sql = "select segment from crawlpage where " + category[index] + "=1"
print sql
cursor.execute(sql)
line = ""
for result in cursor.fetchall():
segment = result[0]
line = line + " " + segment
conn.commit()
conn.close()
vectorizer=countvectorizer()
csr_mat = vectorizer.fit_transform(corpus)
transformer=tfidftransformer()
tfidf=transformer.fit_transform(csr_mat)
word=vectorizer.get_feature_names()
print tfidf.toarray()
for index in range(0, 5):
f = file("tfidf_%d" % index, "wb")
for i in np.argsort(-tfidf.toarray()[index]):
if tfidf.toarray()[index][i] > 0:
f.write("%f %s\n" % (tfidf.toarray()[index][i], word[i]))
f.close()
deffeature_extraction
(): d = {}
for index in range(0, 5):
f = file("tfidf_%d" % index, "r")
lines = f.readlines()
for line in lines:
word = line.split(' ')[1][:-1]
tfidf = line.split(' ')[0]
if d.has_key(word):
else:
d[word] = np.array(tfidf)
f.close();
f = file("features.txt", "wb")
for word in d:
if d[word].size >= 2:
index = np.argsort(d[word])
if float(d[word][index[d[word].size-0-1]]) - float(d[word][index[d[word].size-1-1]]) > 0.01:
f.write("%s %s\n" % (word, d[word]))
f.close()
if __name__ == '__main__':
#get_segment();
feature_dump();
feature_extraction();
最終輸出的features.txt中有809個特徵供我們使用,如下:
集群 ['0.027741'
'0.014016'
'0.010606']
分類器 ['0.002870'
'0.045052'
'0.000943']
中心 ['0.008167'
'0.001647'
'0.004274'
'0.006954'
'0.031360']
首席 ['0.003015'
'0.017036']
fit ['0.016885'
'0.000284']
懂得 ['0.035888'
'0.001629'
'0.003064']
密度 ['0.002414'
'0.002106'
'0.015073'
'0.001586']
master ['0.021045'
'0.002002'
'0.000471']
對方 ['0.002414'
'0.020451'
'0.001684'
'0.003569']
物品 ['0.020088'
'0.001158'
'0.001414']
……
利用支援向量機模型可以直接使用scikit-learn,下一節我們再來研究一下scikit-learn的支援向量機怎麼 基於支援向量機的文字分類
基於支援向量機svm的文字分類的實現 1 svm簡介 支援向量機 svm 演算法被認為是文字分類中效果較為優秀的一種方法,它是一種建立在統計學習理論基礎上的機器學習方法。該演算法基於結構風險最小化原理,將資料集合壓縮到支援向量集合,學習得到分類決策函式。這種技術解決了以往需要無窮大樣本數量的問題,它...
利用余弦相似度做文字分類
利用余弦相似度做文字分類 在數學中余弦相似度的公式 cos a,b a b a b 而在文字上,我們的余弦相似度通常是這樣計算而成 文字a,b 共同出現的詞條數目 文字a 出現的詞條數目 文字b出現的詞條數目 處理兩個純文字的相似度可以這樣處理,但對於文字分類來說,我們更多使用的是 訓練集 與 測試...
使用核支援向量機 svm tfidf進行文字分類
文字分類的演算法很多,這裡提供乙個使用svc來分類文字的例子。在乙個分類任務中,我分別使用決策樹和rnn進行分類,表現最佳的是使用svc的分類,所以下面只給出了svc的 import jieba import json from sklearn.datasets import base from s...