基於CHI TFIDT 貝葉斯方法的網頁分類器

2021-07-16 15:39:23 字數 4382 閱讀 8181

# -*- 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 理解貝葉斯

首先簡略回顧一下,全概率和貝葉斯。其實這兩者是密不可分的,互相之間是乙個順序問題,全概率反過去就是貝葉斯,這類問題只需要區分清楚是知道原因求結果,還是知道結果尋原因就可以了。全概率公式是計算由諸多原因而導致的某件複雜事情發生的概率,而貝葉斯就是在這件複雜的事情已經發生的前提下,去尋找諸多原因中,某一...