1. 程式人生 > >基於樸素貝葉斯分類器的文字分類

基於樸素貝葉斯分類器的文字分類

  1. 實驗要求
  2. 題目要求

1、用MapReduce演算法實現貝葉斯分類器的訓練過程,並輸出訓練模型;

2、用輸出的模型對測試集文件進行分類測試。測試過程可基於單機Java程式,也可以是MapReduce程式。輸出每個測試文件的分類結果;

3、利用測試文件的真實類別,計算分類模型的PrecisionRecallF1值。

2.實驗環境

實驗平臺:VMware Workstation10

虛擬機器系統:Suse11

叢集環境:主機名master  ip:192.168.226.129

從機名slave1  ip:192.168.226.130

  1. 貝葉斯分類器理論介紹

貝葉斯分類器的分類原理是通過某物件的

先驗概率,利用貝葉斯公式計算出其後驗概率,即該物件屬於某一類的概率,選擇具有最大後驗概率的類作為該物件所屬的類。

應用貝葉斯分類器進行分類主要分成兩階段。第一階段是貝葉斯統計分類器的學習階段,即根據訓練資料集訓練得出訓練模型;第二階段是貝葉斯分類器的推理階段,即根據訓練模型計算,進行分類。

貝葉斯公式如下:

IMG_256

其中AB分別為兩個不同的事件,P(A)A先驗概率P(A|B)是已知B發生後A條件概率,也由於得自B的取值而被稱作A後驗概率。而上式就是用事件B的先驗概率來求它的後驗概率。

  1. 貝葉斯分類器訓練的MapReduce演算法設計

3.1貝葉斯文字分類流程圖

3.2

貝葉斯文字分類詳細步驟

整個文件歸類過程可以分為以下步驟:

    1. 測試資料打包。將訓練資料集中的大量小文字打包為SequencedFileMapReduce程式)。
    2. 文件統計以及單詞統計。將1中輸出的SequencedFile作為輸入,分別進行文件個數統計DocCount(MapReduce程式)和各個分類下單詞個數統計WordCount(MapReduce程式)
    3. 測試資料打包。將測試資料集中的大量小文字打包為SequcedFileMapReduce程式)。
    4. 文件歸類。將2中輸出的文件統計和單詞統計的結果,分別計算文件的先驗概率和單詞在各個分類下的條件概率,然後將3中輸出的SequencedFile
      作為輸入,計算測試文字屬於各個分類的概率,並選擇其中最大概率的分類作為該文件的所屬分類。

3.3具體演算法設計

一個Country有多個news.txt,一個news有多個word

我們所設計的演算法最後是要得到隨機抽取一個txt文件,它最有可能屬於哪個國家類別,也就是我們要得到它屬於哪個國家的概率最大,把它轉化為數學公式也就是:

         3-1

為了便於比較,我們將上式取對數得到:

       3-2

其中Num(Wi)表示該txt文件中單詞Wi的個數;P(C|Wi)表示拿出一個單詞Wi,其屬於國家C的後驗概率。根據貝葉斯公式有:P(C|W) = P(W|C)*P(C)/P(W),其中:

P(W|C):國家Cnews中單詞W出現的概率,根據式3-2,不能使該概率為0,所以我們約定每個國家都至少包含每個單詞一次,也就是在統計單詞數量時,都自動的加1,就有:

     3-3

P(C):國家C出現的概率(正比於其所含txt檔案數);

P(W):單詞W在整個測試集中出現的概率。

根據上面的貝葉斯公式我們設計的MapReduce演算法如下:

  1. 按比例選取測試文件,其比例大致為國家包含文件數的相對比例;
  2. Map操作:一一遍歷文件,得到<<C, Wi> , 1>
  3. Reduce操作:

合併<<C, W> , 1>得到國家C中含有單詞Wi的個數<<C, Wi> , ni>+1,記為N(C,Wi)

得到國家C中含有的單詞總數,記為N(C)

得到測試集中單詞W的總數,記為N(W)

再由得到測試集的單詞總數,記為N

則可求得P(W|C) = N(C,W)/N(C)P(C) = N(C)/NP(W) = N(W)/N

3.4MapReduceData Flow示意圖

  1. 原始碼清單

本實驗中的主要程式碼如下所示

4.1 SmallFilesToSequenceFileConverter.java     小檔案集合打包工具類MapReduce程式

4.2 WholeFileInputFormat.java     支援類:遞迴讀取指定目錄下的所有檔案

4.3 WholeFileRecordReader.java支援類:讀取單個檔案的全部內容

4.4 DocCount.java    文件統計MapReduce程式

4.5 WordCount.java  單詞統計MapReduce程式

4.6 DocClassification.java  測試文件分類MapReduce程式

詳細程式碼如下:

4.1 SmallFilesToSequenceFileConverter.java其中MapReduce關鍵程式碼如下:

publicclassSmallFilesToSequenceFileConverterextendsConfiguredimplementsTool {

staticclassSequenceFileMapperextendsMapper<NullWritable, BytesWritable, Text, BytesWritable> {

privateStringfileNameKey;//被打包的小檔名作為key,表示為Text物件

privateStringclassNameKey;//當前文件所在的分類名

@Override//重新實現setup方法,進行map任務的初始化設定

protectedvoidsetup(Contextcontext)throwsIOException, InterruptedException {

           InputSplitsplit=context.getInputSplit();//context獲取split

           Pathpath= ((FileSplit)split).getPath();//split獲取檔案路徑

fileNameKey=path.getName();//將檔案路徑例項化為key物件

classNameKey=path.getParent().getName();

       }

@Override//實現map方法

protectedvoidmap(NullWritablekey, BytesWritablevalue, Contextcontext)

throwsIOException, InterruptedException {

//注意sequencefilekeyvaluekey:分類,文件名  value:文件的內容)

context.write(newText(classNameKey+"/"+fileNameKey),value);

       }

    }

}

4.2 WholeFileInputFormat.java其中關鍵程式碼如下:

publicclassWholeFileInputFormatextendsFileInputFormat<NullWritable, BytesWritable> {

/**

     *<p>方法描述:遞迴遍歷輸入目錄下的所有檔案</p>

     *<p>備註:該寫FileInputFormat,使支援多層目錄的輸入</p>

     * @authormeifyDateTime 2015113下午2:37:49

     * @paramfs

     * @parampath

     */

voidsearch(FileSystemfs, Pathpath) {

try{

if(fs.isFile(path)) {

fileStatus.add(fs.getFileStatus(path));

           }elseif(fs.isDirectory(path)) {

              FileStatus[]fileStatus=fs.listStatus(path);

for(inti= 0;i<fileStatus.length;i++) {

                  FileStatusfileStatu=fileStatus[i];

                  search(fs,fileStatu.getPath());

相關推薦

基於樸素的中文文字分類(python實現,非呼叫)

本文將用樸素貝葉斯原理做一箇中文文字分類器。樸素貝葉斯完全可以勝任多分類任務。為了方便,這裡就先做個2分類的。理論部分:https://blog.csdn.net/montecarlostyle/article/details/79870860 我們事先準備兩

Python--基於樸素演算法的情感分類

環境 win8, python3.7, jupyter notebook 正文 什麼是情感分析?(以下引用百度百科定義) 情感分析(Sentiment analysis),又稱傾向性分析,意見抽取(Opinion extraction),意見挖掘(Opinion mining),情感挖掘(Sentiment

Python實現基於樸素的垃圾郵件分類

聽說樸素貝葉斯在垃圾郵件分類的應用中效果很好,尋思樸素貝葉斯容易實現,就用python寫了一個樸素貝葉斯模型下的垃圾郵件分類。在400封郵件(正常郵件與垃圾郵件各一半)的測試集中測試結果為分類準確率95.15%,在僅僅統計詞頻計算概率的情況下,分類結果還是相當不

《機器學習實戰》基於樸素分類演算法構建文字分類的Python實現

Python程式碼實現:#encoding:utf-8 from numpy import * #詞表到向量的轉換函式 def loadDataSet(): postingList = [['my','dog','has','flea','problems','help','please'],

基於樸素分類文字分類

實驗要求題目要求 1、用MapReduce演算法實現貝葉斯分類器的訓練過程,並輸出訓練模型; 2、用輸出的模型對測試集文件進行分類測試。測試過程可基於單機Java程式,也可以是MapRe

基於樸素分類文字分類演算法(上)

轉載請保留作者資訊: 作者:phinecos(洞庭散人)  Preface 本文緣起於最近在讀的一本書-- Tom M.Mitchell的書中第6章詳細講解了貝葉斯學習的理論知識,為了將其應用到實際中來,參考了網上許多資料,從而得此文。文章將分為兩個部分,第一部分將介紹貝葉斯學習的相關理論()。第二部

(資料探勘-入門-8)基於樸素文字分類

主要內容: 1、動機 2、基於樸素貝葉斯的文字分類器 3、python實現 一、動機 之前介紹的樸素貝葉斯分類器所使用的都是結構化的資料集,即每行代表一個樣本,每列代表一個特徵屬性。 但在實際中,尤其是網頁中,爬蟲所採集到的資料都是非結構化的,如新聞、微博、帖子等,如果要對對這一類資料進行分類,應該怎麼辦

基於樸素分類的 20-news-group分類及結果對比(Python3)

之前看了很多CSDN文章,很多都是根據stack overflow 或者一些英文網站的照搬。導致我看了一整天最後一點收穫都沒有。 這個作業也借鑑了很多外文網站的幫助 但是是基於自己理解寫的,算是一個學習筆記吧。環境是python3(海外留學原因作業是英文的,渣英語見諒吧)程式碼最後附上。 M

kaggle | 基於樸素分類的語音性別識別

概要: 本實驗基於kaggle上的一個資料集,採用樸素貝葉斯分類器,實現了通過語音識別說話人性別的功能。本文將簡要介紹這一方法的原理、程式碼實現以及在程式設計過程中需要注意的若干問題,程式碼仍然是用MATLAB寫成的。 關鍵字: MATLAB; 語音性別識別

MINIST | 基於樸素分類的0-9數字手寫體識別

概要: 本實驗基於MINIST資料集,採用樸素貝葉斯分類器,實現了0-9數字手寫體的識別。本文將簡要介紹這一方法的原理、程式碼實現以及在程式設計過程中需要注意的若干問題,程式碼仍然是用MATLAB寫成的。 關鍵字: MATLAB; 影象處理; 數字手寫體識別

資料探勘:基於樸素分類演算法的文字分類實踐

前言:   如果你想對一個陌生的文字進行分類處理,例如新聞、遊戲或是程式設計相關類別。那麼貝葉斯分類演算法應該正是你所要找的了。貝葉斯分類演算法是統計學中的一種分類方法,它利用概率論中的貝葉斯公式進行擴充套件。所以,這裡建議那些沒有概率功底或是對概率論已經忘記差不多的讀者可

基於樸素的文本分類(附完整代碼(spark/java)

ava -s for 轉換成 模型保存 ext js rgs cti txt 本文主要包括以下內容: 1)模型訓練數據生成(demo) 2 ) 模型訓練(spark+java),數據存儲在hdfs上 3)預測數據生成(demo) 4)使用生成的模型進行文本分類。 一

基於樸素算法的情感分類

set 求最大值 記錄 變焦 def ... rop ros 結果 環境 win8, python3.7, jupyter notebook 正文 什麽是情感分析?(以下引用百度百科定義) 情感分析(Sentiment analysis),又稱傾向性分析,意見抽取(Opi

基於樸素分類演算法實現垃圾郵箱分類

貝葉斯決策理論 在機器學習中,樸素貝葉斯是基於貝葉斯決策 的一種簡單形式,下面給出貝葉斯的基本公式,也是最重要的公式: 其中X是一個m*n的矩陣,m為他的樣本數,n為特徵的個數,即我們要求的是:在已知的樣本情況下的條件概率。 )表示

基於樸素的關於網際網路金融新聞分類(python實現)

        中國網際網路金融發展迅速,2014年是中國網際網路金融起步的一年,但在短短的一年時間內,網際網路金融創業者們融資額度一再創高,雨後春筍般湧現出各類網際網路金融產品讓使用者眼花繚亂,隨著創業門檻的降低,在即將到來的2015年,網際網路金融必將在中國掀起熱潮。

基於樸素的新聞分類

貝葉斯理論 在我們有一大堆樣本(包含特徵和類別)的時候,我們非常容易通過統計得到 p(特徵|類別) . 大家又都很熟悉下述公式: #coding: utf-8 import os import time import random import

&lt;Machine Learning in Action &gt;之二 樸素 C#實現文章分類

options 直升機 water 飛機 math mes 視頻 write mod def trainNB0(trainMatrix,trainCategory): numTrainDocs = len(trainMatrix) numWords =

樸素進行新聞主題分類,有程式碼和資料,可以跑通

folder_path = '/Users/apple/Documents/七月線上/NLP/第2課/Lecture_2/Naive-Bayes-Text-Classifier/Database/SogouC/Sample' stopwords_file = '/Users/apple/Docume

【python與機器學習入門3】樸素2——垃圾郵件分類

參考部落格:樸素貝葉斯基礎篇之言論過濾器 (po主Jack-Cui,《——大部分內容轉載自                   參考書籍:《機器學習實戰》——第四章4.6

基於樸素的垃圾郵件過濾

1.文字切分  #對於一個文字字串,可以使用Python的string.split()方法將其切分 mySent = 'This book is the best book on python or M.L. I have ever laid eyes upon' word