溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

web算法中樸素貝葉斯如何實(shí)現(xiàn)文檔分類

發(fā)布時(shí)間:2021-12-16 09:38:42 來(lái)源:億速云 閱讀:176 作者:iii 欄目:編程語(yǔ)言

本篇內(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)

  貝葉斯公式:

  樸素貝葉斯算法的核心,貝葉斯公式如下:

web算法中樸素貝葉斯如何實(shí)現(xiàn)文檔分類

  代碼實(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í)!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

web
AI