# -*- coding: utf-8 -*-
import jieba
import nltk
import os
import time
from math import log
import json
#該資料夾下宗共有9個資料夾,分別儲存9大類的新聞資料
floder_list = os.listdir(floder_path)
class_list =
nclass = 0
n = 100
train_set =
test_set =
all_words = {}
#用於記錄chi公示中的a值
a = {}
#記錄每個檔案的處理事件
process_time =
tfidf = {}
#讀取停詞表
stop_words_file = open('stop_words_ch.txt', 'r')
stopwords_list =
for line in stop_words_file.readlines():
#遍歷每個類別資料夾
for i in range(len(floder_list)):
new_floder_path = floder_path + '/' + floder_list[i]
#files中儲存每個類別檔案的具體檔案列表
files = os.listdir(new_floder_path)
#class_list用於儲存0-8九個新聞類別
a[nclass] = {}
tfidf[nclass] = {}
j = 0
#最多讀取100個檔案,或者全部奪取
nfile = min([len(files), n])
for file in files:
if j > n:
break
starttime = time.clock()
#標誌位,用於表示這個檔案中是否已經出現過某個單詞。以防止重複計算//取xiao
#讀取檔案內容
fobj = open(new_floder_path + '/' + file, 'r')
raw = fobj.read()
tfidf[nclass][j] = {}
#使用結巴分詞把檔案進行切分
word_list = list(jieba.cut(raw, cut_all =false))
for word in word_list:
if word in stopwords_list:
word_list.remove(word)
#word_set用於統計a[nclass]
word_set = set(word_list)
for word in word_set:
if a[nclass].has_key(word):
a[nclass][word] += 1
else:
a[nclass][word] = 1
#統計所有類別所有檔案出現的詞頻,並儲存在all_words裡面。
for word in word_list:
if word in tfidf[nclass][j]:
tfidf[nclass][j][word] += 1
else:
tfidf[nclass][j][word] = 1
if all_words.has_key(word):
all_words[word] += 1
else:
all_words[word] = 1
#將每個類別中的nfile個檔案進行訓練/測試集劃分,比例是3:7.分別存放於train_set/test_set
if j>0.3*nfile:
else:
fobj.close()
j+=1
end_time = time.clock()
#記錄每個檔案處理時間
#列印中間結果資訊。
print
"folder ", i, "-file-", j, "all_words length = ", len(all_words.keys()), \
"process time:", (end_time - starttime)
nclass += 1
#用於儲存chi公式中的b值
b = {}
for key in a:
b[key] = {}
for word in a[key]:
b[key][word] = 0
for kk in a:
if kk != key and a[kk].has_key(word):
b[key][word] += a[kk][word]
'''執行到這裡我們就已經將所有檔案進行了預處理。獲得了以下幾個重要的全域性變數
1,process_time:儲存所有檔案的處理時間
2,train_set:儲存訓練檔案樣本集。每乙個元素(word_list, class_list[i]),即乙個檔案的單詞表(結巴分詞之後)和其類別
3,test_set:儲存測試檔案樣本集。每乙個元素(word_list, class_list[i]),即乙個檔案的單詞表(結巴分詞之後)和其類別
4,all_words:所有出現過的單詞及其出現頻率。
'''#根據詞頻對all_words進行排序
all_words_list = sorted(all_words.items(), key=lambda e:e[1], reverse=true)
word_dict =
#def word_dict_with_chi_use_stopwords():
for i in range(0, 9):
chi = {}
for word in a[i]:
chi[word] = (a[i][word]*(800 - b[i][word]) - (100 - a[i][word])*b[i][word])^2/((a[i][word]+b[i][word])*(900 - a[i][word] - b[i][word]))
a = sorted(chi.iteritems(), key=lambda t: t[1], reverse=true)[:150]
b =
for aa in a:
word_dict.extend(b)
word_features = set(word_dict)
print len(word_features)
defdocument_features_tfidf
(document, cla, num):
document_words = set(document)
features = {}
for word in word_features:
if word in document_words:
features['contains(%s)' %word] = tfidf[cla][num][word]*log(900/(a[cla][word]+b[cla][word]))
else:
features['contains(%s)' % word] = 0
return features
deftextclassification_tfidf
():#計算訓練/測試資料集中所有文件對應的特徵向量和類別。
train_data = [(document_features_tfidf(d, c, b), c) for (d, c, b) in train_set]
test_data = [(document_features_tfidf(d, c, b), c) for (d, c, b) in test_set]
print
"train number:", len(train_data), "\n test number:", len(test_data)
#訓練分類器
classifier = nltk.*****bayesclassifier.train(train_data)
#計算準確度
test_error = nltk.classify.accuracy(classifier, test_data)
print
"test_accuracy:", test_error
return test_error
test_error = textclassification_tfidf()
其實還有乙個很怪異的現象,沒有使用tfidf的時候準確率比使用了之後還要高,我猜是****寫錯了,後面找找再來改吧。 貝葉斯方法
貝葉斯推斷及其網際網路應用 q 已知某種疾病的發病率是0.001,即1000人中會有1個人得病。現有一種試劑可以檢驗患者是否得病,它的準確率是0.99,即在患者確實得病的情況下,它有99 的可能呈現陽性。它的誤報率是5 即在患者沒有得病的情況下,它有5 的可能呈現陽性。現有乙個病人的檢驗結果為陽性,...
貝葉斯 01 初識貝葉斯
分割線 分割線 分割線 分割線 分割線 分割線 分割線 分割線 分割線 分割線 分割線 分割線 分割線 最先知道貝葉斯公式還是四年前的概率論和數理統計課上,時間也很久了,具體內容早已經忘記,不過畢竟曾經學過,重新看過還是得心應手的。大概用兩三篇的內容來介紹一下貝葉斯,以及機器學習中很重要的一部分 樸...
貝葉斯 02 理解貝葉斯
首先簡略回顧一下,全概率和貝葉斯。其實這兩者是密不可分的,互相之間是乙個順序問題,全概率反過去就是貝葉斯,這類問題只需要區分清楚是知道原因求結果,還是知道結果尋原因就可以了。全概率公式是計算由諸多原因而導致的某件複雜事情發生的概率,而貝葉斯就是在這件複雜的事情已經發生的前提下,去尋找諸多原因中,某一...