您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“web算法中樸素貝葉斯如何實(shí)現(xiàn)文檔分類”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“web算法中樸素貝葉斯如何實(shí)現(xiàn)文檔分類”吧!
作業(yè)要求:
實(shí)驗(yàn)數(shù)據(jù)在bayes_datasets文件夾中。其中,
? train為訓(xùn)練數(shù)據(jù)集,包含hotel和travel兩個(gè)中文文本集,文本為txt格式。hotel文本集中全部都是介紹酒店信息的文檔,travel文本集中全部都是介紹景點(diǎn)信息的文檔;
? Bayes_datasets/test為測(cè)試數(shù)據(jù)集,包含若干hotel類文檔和travel類文檔。
用樸素貝葉斯算法對(duì)上述兩類文檔進(jìn)行分類。要求輸出測(cè)試數(shù)據(jù)集的文檔分類結(jié)果,即每類文檔的數(shù)量。
(例:hotel:XX,travel:XX)
貝葉斯公式:
樸素貝葉斯算法的核心,貝葉斯公式如下:
代碼實(shí)現(xiàn):
第一部分:讀取數(shù)據(jù)
f_path = os.path.abspath('.')+'/bayes_datasets/train/hotel'
f1_path = os.path.abspath('.')+'/bayes_datasets/train/travel'
f2_path = os.path.abspath('.')+'/bayes_datasets/test'
ls = os.listdir(f_path)
ls1 = os.listdir(f1_path)
ls2 = os.listdir(f2_path)
#去掉網(wǎng)址的正則表達(dá)式
pattern = r"(http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*,]|(?:%[0-9a-fA-F][0-9a-fA-F]))+)|([a-zA-Z]+.\w+\.+[a-zA-Z0-9\/_]+)"
res = []
for i in ls:
with open(str(f_path+'\\'+i),encoding='UTF-8') as f:
lines = f.readlines()
tmp = ''.join(str(i.replace('\n','')) for i in lines)
tmp = re.sub(pattern,'',tmp)
remove_digits = str.maketrans('', '', digits)
tmp = tmp.translate(remove_digits)
# print(tmp)
res.append(tmp)
print("hotel總計(jì):",len(res))
for i in ls1:
with open(str(f1_path + '\\' + i), encoding='UTF-8') as f:
lines = f.readlines()
tmp = ''.join(str(i.replace('\n', '')) for i in lines)
tmp = re.sub(pattern, '', tmp)
remove_digits = str.maketrans('', '', digits)
tmp = tmp.translate(remove_digits)
# print(tmp)
res.append(tmp)
print("travel總計(jì):",len(res)-308)
#print(ls2)
for i in ls2:
with open(str(f2_path + '\\' + i), encoding='UTF-8') as f:
lines = f.readlines()
tmp = ''.join(str(i.replace('\n', '')) for i in lines)
tmp = re.sub(pattern, '', tmp)
remove_digits = str.maketrans('', '', digits)
tmp = tmp.translate(remove_digits)
# print(tmp)
res.append(tmp)
print("test總計(jì):",len(res)-616)
print("數(shù)據(jù)總計(jì):",len(res))
這一部分的任務(wù)是將放在各個(gè)文件夾下的txt文檔讀入程序,并將數(shù)據(jù)按照需要的形式存放。數(shù)據(jù)分為訓(xùn)練集和測(cè)試集,而訓(xùn)練集又包括景點(diǎn)和酒店兩類,故數(shù)據(jù)總共分為三類,分三次分別讀取。在訓(xùn)練集的每一個(gè)txt文件中最前端都有一串網(wǎng)址信息,我用正則表達(dá)式將其過(guò)濾掉,后來(lái)發(fā)現(xiàn)此部分并不會(huì)影響最終的結(jié)果。之后將三類文檔依次讀取,將讀取的結(jié)果存放入一個(gè)結(jié)果list中。list的每一項(xiàng)為一個(gè)字符串,存放的是一個(gè)txt文件的去除掉要過(guò)濾的數(shù)據(jù)之后的全部信息。最終得到travel文件夾下共有308個(gè)文檔,hotel文件夾下也有308個(gè)文檔,測(cè)試集共有22個(gè)文檔。
第二部分:分詞,去除停用詞
stop_word = {}.fromkeys([',','。','!','這','我','非常','是','、',':',';'])
print("中文分詞后結(jié)果:")
corpus = []
for a in res:
seg_list = jieba.cut(a.strip(),cut_all=False)#精確模式
final = ''
for seg in seg_list:
if seg not in stop_word:#非停用詞,保留
final += seg
seg_list = jieba.cut(final,cut_all=False)
output = ' '.join(list(seg_list))
# print(output)
corpus.append(output)
# print('len:',len(corpus))
# print(corpus)#分詞結(jié)果
這一部分要做的是設(shè)置停用詞集,即分詞過(guò)程中過(guò)濾掉的無(wú)效詞匯,將每一個(gè)txt文件中的數(shù)據(jù)進(jìn)行中文分詞。首先stop_word存放了停用詞集,使用第三方庫(kù)jieba進(jìn)行中文分詞,將去除停用詞后的結(jié)果最后放入corpus中。
第三部分:計(jì)算詞頻
#將文本中的詞語(yǔ)轉(zhuǎn)換為詞頻矩陣
vectorizer = CountVectorizer()
#計(jì)算各詞語(yǔ)出現(xiàn)的次數(shù)
X = vectorizer.fit_transform(corpus)
#獲取詞袋中所有文本關(guān)鍵詞
word = vectorizer.get_feature_names()
#查看詞頻結(jié)果
#print(len(word))
for w in word:
print(w,end=" ")
print(" ")
#print("詞頻矩陣:")
X = X.toarray()
#print("矩陣len:",len(X))
#np.set_printoptions(threshold=np.inf)
#print(X)無(wú)錫人流多少錢 http://www.bhnnk120.com/
這一部分的任務(wù)是將文本中的詞語(yǔ)轉(zhuǎn)換為詞頻矩陣,并且計(jì)算各詞語(yǔ)出現(xiàn)的次數(shù)。詞頻矩陣是將文檔集合轉(zhuǎn)換為矩陣,每個(gè)文檔都是一行,每個(gè)單詞(標(biāo)記)是列,相應(yīng)的(行,列)值是該文檔中每個(gè)單詞或標(biāo)記的出現(xiàn)頻率。
但我們需要注意的是,本次作業(yè)的詞頻矩陣的大小太大,我曾嘗試輸出整個(gè)詞頻矩陣,直接導(dǎo)致了程序卡頓,我也嘗試了輸出矩陣的第一項(xiàng),也有近20000個(gè)元素,所以如果不是必需,可以不輸出詞頻矩陣。
第四部分:數(shù)據(jù)分析
# 使用616個(gè)txt文件夾內(nèi)容進(jìn)行預(yù)測(cè)
print ("數(shù)據(jù)分析:")
x_train = X[:616]
x_test = X[616:]
#print("x_train:",len(x_train))
#print("x_test:",len(x_test))
y_train = []
# 1表示好評(píng)0表示差評(píng)
for i in range(0,616):
if i < 308:
y_train.append(1)#1表示旅店
else:
y_train.append(0)#0表示景點(diǎn)
#print(y_train)
#print(len(y_train))
y_test= [0,0,0,1,1,1,0,0,1,0,1,0,0,1,0,0,1,1,1,0,1,1]
# 調(diào)用MultionmialNB分類器
clf = MultinomialNB().fit(x_train,y_train)
pre = clf.predict(x_test)
print("預(yù)測(cè)結(jié)果:",pre)
print("真實(shí)結(jié)果:",y_test)
print(classification_report(y_test,pre))
hotel = 0
travel = 0
for i in pre:
if i == 0:
travel += 1
else:
hotel += 1
print("Travel:",travel)
print("Hotel:",hotel)
這部分的任務(wù)是將所有的訓(xùn)練數(shù)據(jù)根據(jù)其標(biāo)簽內(nèi)容進(jìn)行訓(xùn)練,然后根據(jù)訓(xùn)練得到的結(jié)果對(duì)測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè)分類。x_train代表所有的訓(xùn)練數(shù)據(jù),共有616組;其對(duì)應(yīng)的標(biāo)簽為y_train,也有616組,值為1代表酒店,值為0代表景點(diǎn)。x_test代表所有的測(cè)試數(shù)據(jù),共有22組;其對(duì)應(yīng)標(biāo)簽為y_test,亦22組,其值則由我自己事先根據(jù)其值手工寫在程序中。此時(shí)需要注意的是測(cè)試集文件在程序中的讀取順序可能與文件夾目錄中的順序不一致。最后將測(cè)試集數(shù)據(jù)使用訓(xùn)練集數(shù)據(jù)調(diào)用MultionmialNB分類器得到的模型進(jìn)行預(yù)測(cè),并將預(yù)測(cè)結(jié)果與真實(shí)結(jié)果進(jìn)行對(duì)比。
得出運(yùn)行結(jié)果。
到此,相信大家對(duì)“web算法中樸素貝葉斯如何實(shí)現(xiàn)文檔分類”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。