Hadoop學習筆記 | NJU 大數據實驗課MapReduce 課程設計郵件分類實驗報告

Github源碼地址:https://github.com/courseralxy/MapReduce-Big-Data-Processing/tree/master/final%20project

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

文字版實驗報告:

MapReduce大數據課程設計3:郵件自動分類

牛哥1 161220082 月哥2 161220085 圓哥3 161220083

1(南京大學 計算機科學與技術系,南京  210023)

2(南京大學 計算機科學與技術系,南京  210023)

3(南京大學 計算機科學與技術系,南京  210023)

 

MapReduce Big Data Class Design: Email auto-classification

Brother Niu1 Brother Yue2 Brother Yuan3

1(Department of Computer Science and Technology, Nanjing University, Nanjing 210023, China)

+ Corresponding author: Llf: + 86-1xx-xxxxxxxx: [email protected]

 

2(Department of Computer Science and Technology, Nanjing University, Nanjing 210023, China)

+ Corresponding author: Lxy: + 86-1xx-xxxxxxxx, E-mail: [email protected]

 

3(Department of Computer Science and Technology, Nanjing University, Nanjing 210023, China)

+ Corresponding author: Lxy: +86-1xx-xxxxxxxx, E-mail: [email protected]

 

  1. 郵件自動分類任務簡述
    1. 電子郵件的起源

電子郵件產生於上世紀60年代,早期分時計算機的出現使基於計算機的郵件和消息傳遞成爲可能,早期大型機和小型計算機的大多數開發人員們獨立開發了許多功能類似但通常互相不兼容的郵件應用程序。許多美國大學都是ARPANET的一部分,ARPANET旨在實現系統之間的軟件可移植性。在此情況下,出現了簡單郵件傳輸協議SMTP。在20世紀80年代末和90年代初,政府開放系統互連概況(GOSIP)的一部分專有商業系統或X.400電子郵件系統占主導地位。二十世紀末互聯網的誕生,使得SMTP,POP3和IMAP電子郵件協議成爲標準。

 

早期的電子郵件系統要求作者和收件人同時在線,與即時消息一樣。如今的電子郵件系統基於存儲轉發模型。服務器接受、轉發、傳遞和存儲消息。發件人與收件人不需要同時在線; 他們只需要短暫連接,發送或接收郵件即可。最早的電子郵件僅限於使用ASCII文本進行通信,通過多用途Internet郵件擴展(MIME),才得以發送例如圖片和文檔之類的多媒體介質。

 

    1. 郵件自動分類的重要性

我們常說,技術是一把雙刃劍,電子郵件的出現,極大地豐富了人們交流和聯繫的渠道,但隨之出現的還有大量的垃圾郵件。當今時代,網民們在互聯網上裸奔,黑產通過各類方式收集網民們的電子郵件賬戶,之後將其轉賣給各類公司,這種交易的價格十分廉價,因此一筆信息交易的量級能夠達到百萬級別。公司在獲取到大量郵箱賬戶後,便會向這些郵箱賬戶中頻繁發送推廣郵件,用戶不堪其擾。這些電子牛皮癬極大影響網民心情,甚至還有可能掩埋住重要郵件。除了廣告郵件,還有人盯上了網民的電腦數據,通過發送木馬郵件和釣魚郵件,在粗心的收件人的電腦中植入病毒,竊取個人數據,監控其網絡流量,甚至盜取銀行賬戶密碼使收件人蒙受經濟損失。除了以上兩種最爲常見的垃圾郵件形式以外,還有很多其他種類的新型垃圾郵件,因此垃圾郵件的分類十分重要。

 

伴隨着電子郵件興起的,還有一個叫做“電子郵件破產(email bankruptcy)”的名詞,他是指用戶收到了太多郵件無法一次讀完,如此積壓下去最終達到了人力不可逾越的數量,再也不可能全部讀完。儘管這些郵件都是有用的郵件,但有用也是有級別的,相同的郵件對於不同的用戶可能有不同的優先級,不同的郵件對相同的用戶也有不同的優先級,如何能將郵件按照一定的標準,例如內容或者主題,自動進行歸類,就成爲了一個有價值的研究主題。

 

    1. 郵件自動分類問題抽象

給定訓練集是新聞郵件訓練集,共有20種類別,每個類別都有自己的名稱(文件夾名稱),每個文件夾內有大量的郵件,郵件以文本形式呈現。因此本任務是一項文本分類任務,給定一段文本,判斷其類別,類別共20種。

 

同一封郵件,其內容或許不僅僅是隻屬於某個類別,也可能屬於多個類別。在實際應用場景中考慮到用戶可能由於對於某種郵件有錯誤的認知,而去錯誤的分類文件夾中尋找,如果能將同一封郵件分到多個可能的郵箱,那麼可以大大加快用戶尋找到該郵件的速度。基於這個想法,我們提出了另外一種性能度量方式:前K類命中率。前K類命中率是指,將郵件屬於所有類別的可能性大小進行排序,取可能性最大的K個,將該郵件同時分到這K個類別中,計算測試樣例中前K個類別含有正確類別的比例。KNN作爲一個經典的機器學習分類模型,恰好契合我們的前K類命中率的想法,並且KNN易於並行化實現,因此作爲我們首選的分類算法。

 

由於數據集中每一封郵件都是一個長字符串,而且其長度不一,無法直接作爲KNN的輸入。即使採用一些方法對短文本進行補齊和截斷,將字符串的Unicode碼當作是數值輸入也是毫無意義的,因此應當對短文本進行一定的處理,將處理後的數據作爲機器學習算法的輸入,也就是要對數據進行向量化。向量化比較好的一種方式是TF-IDF,產生one-hot編碼,並且TF-IDF簡單、高效、易並行。

 

爲了更加客觀地評價KNN最終的分類效果,我們使用樸素貝葉斯進行類比實驗,並使用準確率(Accuracy)作爲評估指標,看KNN的表現是否能夠超過樸素貝葉斯。需要注意的是樸素貝葉斯用到的向量化並非TF-IDF,而是基於統計詞頻的CountVectorize模型。

 

  1. 郵件自動分類任務方法

這一節詳細講述了詞頻、TF-IDF、KNN、樸素貝葉斯的原理。

    1. 詞頻

對文本進行向量化的一個直觀的方法是使用字典統計詞頻。例如,“我愛你,中國”這句話中,包含“我”、“愛”、“你”和“中國”這四個詞,這句話的詞頻就是“我”:1,“愛”:1,“你”:1,“中國”:1。而“世界是我們的,也是你們的,但終究是你們的”詞頻是“世界”:1,“是”:2,“我們”:1,“的”:3,“也”:1,“你們”:2,“但”:1,“終究”:1。

 

    1. TF-IDF

僅僅通過詞頻的方式將文本轉換成向量會出現一個問題,在長度長的短文本中,詞頻會比長度短的短文本高得多,但是這兩條短文本表達的都是同樣的意思。如果採用one-hot編碼,這個詞袋模型並不能考慮詞與詞之間的順序,並且這個模型的假設是詞與詞相互獨立,但一個句子是一個序列,前後詞是相互影響的,除此以外,通過one-hot編碼得到的樣本特徵矩陣是稀疏的,因爲中文詞庫非常大,然後數據集又是短文本,因此每條數據的詞量很少。

 

TF-IDF是information retrieval領域中常用的文本表示方法,由TF和IDF兩部分構成。

 

TF爲詞的詞頻,計算方式如下

 

 

IDF逆文檔頻率。在一條短文本中,幾個詞出現的次數可能是相同的,但是它們各自對於這個句子的“重要性”是不一樣的,即如果某個詞比較少見,但是在一條文本中多次出現,那麼它很可能就反映了這條文本的特徵IDF就是要給予最常見的詞(停用詞等)最小的權重,給予較常見的詞(如“中國”)較小的權重,給予少見的詞較大的權重,這個權重就叫做Inverse Document Frequency(逆文檔頻率,縮寫爲IDF),計算方式如下

 

 

兩者相乘就得到了這個詞向量化中的TF-IDF值,如下圖所示

 

 

TF-IDF的原理可以說類似於信息學中的信息熵,TF-IDF值與該詞在文章中出現的頻率成正比,與該詞在整個語料庫中出現的次數成反比,因此可以很好地提取文本關鍵詞,用於表示文本內容

 

    1. K近鄰 K Nearest Neighbor Classifier
      1. 概述

KNN是機器學習中一種常用的監督學習方法,其原理是給定測試樣本,基於某種距離度量找出訓練集中與測試樣本最靠近的k個訓練樣本,然後基於這k個鄰居的信息來進行預測。通常,在分類任務重可以使用投票法,即選擇這k個樣本中出現次數最多的類別標記作爲預測結果;在迴歸任務中則可以使用平均法,即將這k個樣本的實值輸出標記的平均值作爲預測結果。除以此外,還可以基於距離遠近進行加權平均或加權投票,距離越近樣本權重越大。

 

      1. 距離度量方式

以下有多種距離度量的方式,本次實驗中採用的最適合文檔分類問題的餘弦距離。

        1. 歐氏距離

歐氏距離是最爲常見的距離度量方式,全稱是歐幾里得距離或歐幾里得度量,指的是在歐幾里得空間中,兩點間的直線距離,也成爲向量的自然長度,計算公式如下:

 

 

可見,歐式距離即兩個向量差值的二範數

 

        1. 曼哈頓距離

曼哈頓距離源於紐約繁華的曼哈頓街道,指在幾何度量空間對距離進行度量,也成爲棋盤距離,計算公式如下:

 

 

可見,曼哈頓距離即兩個向量差值的一範數

 

        1. 餘弦距離

餘弦距離也成爲餘弦相似度,是用向量空間中兩個向量夾角的餘弦值作爲衡量兩個個體間差異的大小。相比前面兩種距離度量方式,餘弦距離更加註重兩個向量在方向上的差異,而非在距離或長度上,其計算公式如下:

 

 

    1. 樸素貝葉斯
    2. 概述

貝葉斯算法的核心基於著名的貝葉斯公式,它把計算“具有某特徵的條件下屬於某類的概率”轉化爲計算“屬於某類的條件下具有某特徵的概率”,即後驗概率等於先驗概率乘以調整因子。在樸素貝葉斯算法中,首先預估一個先驗概率,然後加入實驗結果,看這個實驗到底是增強還是削弱了先驗概率,由此得到更接近事實的後驗概率。

 

樸素貝葉斯方法給予隨機變量獨立性假設,這種假設非常適合處理文本分類問題。以樸素貝葉斯的觀點,句子中兩詞之間的關係是相互獨立的,即一個詞的特徵向量中每個維度都是相互獨立的。

 

樸素貝葉斯方法的主要流程如下:

  1. 訓練數據生成訓練樣本集,即TF-IDF過程
  2. 對每個類別計算概率
  3. 對每個特徵屬性計算所有類別下的條件概率
  4. 對每個類別計算以上兩者相乘的值
  5. 取4中最大的類別作爲樣本所屬類別

 

    1. 拉普拉斯修正

在訓練集中,很多樣本的取值可能並不在其中,但是這不併代表這種情況發生的概率爲0,因爲未被觀測到,並不代表出現的概率爲0 。在概率估計時,通常解決這個問題的方法是要進行平滑處理,常用拉普拉斯修正。

 

樸素貝葉斯中先驗概率的計算公式爲:

 

 

類的條件概率計算公式爲:

 

 

經由拉普拉斯修正後,

先驗概率計算公式變爲:

 

 

類的條件概率計算公式變爲:

 

    1. 多項式模型

樸素貝葉斯常見有兩種模型,多項式模型(multinomial model)即詞頻型和伯努利模型(Bernoulli model)即文檔型。二者的計算粒度不一樣,多項式模型以單詞爲粒度,伯努利模型以文件爲粒度,因此二者的先驗概率和類條件概率的計算方法都不同。郵件分類任務中通常多項式模型能取得更好的效果,本次實驗中採用的即是多項式模型。

 

在多項式模型中, 設某文檔d=(t1,t2,…,tk),tk是該文檔中出現過的單詞,允許重複。我們默認採用哪個拉普拉斯修正,則先驗概率和類條件概率計算如下:

 

先驗概率P(c) = 類c下單詞總數 / 整個訓練樣本的單詞總數

 

類條件概率P(tk|c)=(類c下單詞tk在各個文檔中出現過的次數之和 + 1) / (類c下單詞總數 + |V|)

 

其中V是訓練樣本的單詞表(即抽取單詞,單詞出現多次,只算一個),|V|則表示訓練樣本包含多少種單詞。 P(tk|c)可以看作是單詞tk在證明d屬於類c上提供了多大的證據,而P(c)則可以認爲是類別c在整體上佔多大比例(有多大可能性)。

 

樸素貝葉斯模型進行預測的方法是計算不同類的後驗概率Ppost,取其中最大者的類作爲預測的類別。後驗概率的計算方式如下:

 

由於P(X)的大小是固定不變的,因此在比較後驗概率時,只比較上式的分子部分即可。

 

  1. 郵件自動分類任務技術細節
    1. 數據預處理

數據預處理主要包括標點符號去除、停用詞及數字去除和類別轉化三部分。

 

      1. 標點去除

在使用StringTokenizer對輸入value進行切分前,會先將句子中的標點符號去掉。標點符號只考慮了標準鍵盤上出現的中英文標點符號。考慮到總量並不算很多,就沒有采用正則表達式進行匹配。程序在setup中首先將儲存有這些標點符號的文件讀入爲一個ArrayList<String>數組中,稱爲標點符號表。對於每一個輸入value,使用String的replace方法,遍歷標點符號表,對value.toString()結果執行replace(“<標點符號>”,” ”)

 

      1. 停用詞去除

停用詞表精選了英文中常見的800多個詞彙,還包含0~9這是個數字。使用StringTokenizer對輸入value進行切分以後,對於切分出的每個單詞,判斷其是否在停用詞表中,如果在停用詞表中,將這個詞拋棄;只有不在停用詞表中的詞纔會被map操作發射出去

 

      1. 類別轉換

所有郵件按其歸屬的文件夾名來劃分類,map發射出去的時候回以文件夾名來表示它屬於的類。

 

    1. 詞頻統計與TF-IDF值

TF值計算、IDF值計算和TF-IDF值計算分別由三個不同的Job組成。

      1. TF值計算
        1. Mapper

Mapper主要有setup、map和cleanup組成。在setup中,讀入標點符號和常見詞這兩個停用詞表,將value中的標點符號、數字和常見詞進行去除。之後的map操作中,使用StringTokenizer將value切分成詞彙,然後發射<文件名+詞彙,1>,並對總詞彙進行計數。cleanup中發射<文件名+”!”,總詞數>。

        1. Combiner

Combiner繼承Reducer類,由reduce方法組成。因爲”!”在 ASCII 碼錶中排在所有英文字母之前,因此Combine操作首先收到的就是總詞數,然後對相同詞彙的數量進行累加,之後除以總詞數,就得到了詞彙的TF值,發射<文件名+詞彙,TF值>

        1. Partitionr

Partitioner繼承HashPartitioner類,重載了getPartition方法。由於key是文件名+詞彙組成,因此同一個文件的不同詞彙並不會被放到同一個Reducer上進行reduce,因此需要把文件名作爲key進行Partition。直接取文件名,然後調用父類的getPartition方法,將key改爲文件名,其他參數原封不動地傳進去即可。

        1. Reducer

Reducer主要有setup、map和cleanup組成。我們希望將同一個文件的詞彙的TF值還寫到同一個文件中,並且文件名還與原先文件名保持一致,因此輸出的format採用了MultipleOutputs類,setup和cleanup就是用於MultipleOutput實例的初始化和清理。在Reduce中,調用MultipleOutputs類的write方法,將詞彙及其TF值寫入與原先文件同名但不同文件夾的中間結果文件中。

        1. 類別

除了以上操作外,還需註明郵件所屬類別。我們將郵件所述類別通過job的setProfileParams方法提前寫入,然後將其加到文件名的前面,用#符號分隔開來。

 

      1. IDF值計算

IDF計算會讀取所有文件,文件數量經由文件系統操作統計,之後通過job的setProfileParams方法提前寫入,在map和reduce操作中統計詞彙數量和計算IDF值。

      1. Mapper

Mapper只有一個map操作,發射<詞彙,1>。

      1. Reducer

Reducer中對詞彙數量進行累加,之後從Context取得文件總數計算詞彙IDF值,然後將詞彙及其IDF值寫入IDF結果文件。除此以外,還可以加一個Combiner,把Mapper的結果先進行一次累加,減小數據傳輸量。

 

      1. TF-IDF值計算
        1. Mappper

Mapper由setup和map組成。setup中讀取存放IDF計算結果的文件,將詞彙與其IDF值分別存放於一個字符串數組和一個浮點數數組的相應位置。map操作中,讀入TF文件,之後找到其IDF值進行計算,然後發射<詞彙,詞彙的TF-IDF值>

        1. Reducer

Reduce操作與TF的job類似,也是按照文件名將TF-IDF向量寫入。除了將文件中出現的TF-IDF值寫入,沒出現的詞認爲其TF-IDF值爲0,也要寫入文件。TF-IDF值的寫入順序與IDF中間結果文件的順序相同,因此在最後的TF-IDF文件中,只有向量值,沒有詞彙,減小了數據量。也方便了後續的計算

    1. KNN

KNN原理如2.4所述,此處不再贅述。KNN的計算僅需重寫Mapper,核心就是計算距離,然後根據K值篩選。Map操作首先在setup方法中,將已經計算好的訓練集文檔的TF-IDF值讀入內存。考慮到訓練集的規模和文檔向量的稀疏特徵,採用hashmap儲存。在map方法中,計算每一個訓練集樣本與測試樣本之間的距離,根據預先設定的K值,始終保留K最近鄰,保存在長度爲K的數組中。在計算完所有訓練集樣本與該測試樣本的距離後,採用投票法,根據K近鄰中最多的類別,判斷測試樣本的類別,然後發射<測試樣本文件名, 類別>

    1. CountVectorize

 

CountVectorize是進行樸素貝葉斯之前的預處理步驟,分爲Count、ListWords、Vectorize三個階段。

      1. Count
      2. Mappper

Mapper主要有setup、map組成。在setup中,讀入標點符號和常見詞這兩個停用詞表,將value中的標點符號、數字和常見詞進行去除。之後的map操作中,使用StringTokenizer將value切分成詞彙,然後發射<文件名+詞彙,1>, 用以統計單個文件的詞彙出現頻數。

      1. Combiner & Partitioner

Combiner將相同詞彙的頻數加起來,Partitioner階段將key拆分,只保留文件名,從而將相同鍵值的鍵值對發送到同一個reduce服務器上。

      1. Reducer

使用MUltipleOutputs類,將不同郵件的詞彙統計存放到不同的文件中,輸出的文件名由郵件的類和郵件本身的名字組成,即“類別#原文件名”,以便後續的步驟。輸出的內容爲<詞彙, 頻數>。

 

      1. ListWords
      2. Mappper

讀取Count步驟的生成的訓練集的文件,遇到一個詞就發射<詞,詞頻>。

      1. Reducer

將接收到的鍵值對中的值加起來,形成一個詞出現的總次數,然後輸出鍵值對<單詞,次數>。

 

      1. Vectorize
      2. Mappper

首先在setup函數中把上一個步驟生成的wordlist加載,便於獲得詞彙的索引值寫入向量。並且發送一個總詞數和總詞彙數鍵值對<”!”, wordcount: wordTypes>。

在map階段,讀取Count階段生成的每一個文件,取得一個詞在某一個郵件中的頻數,在詞彙表中找到這個詞的索引值,然後發射<詞所在文件,詞#詞的頻數>。其中詞所在的文件會標註出該郵件屬於訓練集還測試集。

對於訓練集中未出現在詞典中的詞,將其直接拋棄不作爲特徵向量。

      1. Reducer

這裏爲了區分訓練集向量和測試集向量,這裏也使用了MultipleOutputs類來進行輸出,同時也使用本身的context變量來輸出<wordount: wordTypes>到文件中。對於其餘的鍵值對,因爲相同的文件會被分配到同一個Reducer中,所以用一個vector來存放所有該文件的詞向量;當屬於其他文件的鍵值對到來時,就輸出當前vector中的內容。

 

 

3.5樸素貝葉斯

  1.  
  2.  
    1.  
    2.  
    3.  
    4.  
      1. 訓練
        1. Mappper

由於採用了多項式模型,在發射鍵值隊時,除了要發送<class#詞索引,詞頻數>之外,還需要累加一個文件中的所有詞彙的詞頻數,再發送<class, 單詞總數>。

        1. Reducer

需要統計的信息有兩種:某個類所有文件包含的單詞總數、屬於某個類的某個詞在該類中出現的次數,因此依然採用MultipleOutputs進行輸出。這裏需要通過鍵值對中的鍵來區分是兩種信息中的哪一種。無論是哪一種,在輸出前都需要將他們收到的鍵值中的值累加起來再輸出。這樣就把模型的基本信息給輸出了。

      1. 預測
        1. Mappper

和Knn一樣,預測只需要重寫Mapper。首先在setup步驟先讀入需要的三個文件:vectorize步驟中生成的記錄總詞數和總詞彙數的文件、訓練模型步驟中生成的兩個文件。

將輸入的樣本的特徵提取出,然後依次計算它在每個類下的概率,選擇概率最高的類,輸出鍵值對<樣本名字#概率值,預測類>。

 

    1. 準確率(Accuracy)

本次實驗中,我們採取準確率(Accuracy)這樣一個經典的分類效果衡量指標對分類器的表現進行評估,準確率簡單、高效,易於實現,其計算公式如下:

 

準確率實現在Mapper階段時,對預測的結果進行判斷。如果預測的類別和真正的類別相同,則發射 <T, 1>;否則發射 <F, 1>。在Reduce階段統計T和F的數量,從而根據公式計算出準確率。

 

  1. 結果及實驗對比
    1. KNN(K=10)

首先在集羣上進過了4小時左右的計算,得到TF-IDF表,然後進行KNN的訓練和預測,K值默認爲10。最終的預測結果截圖如下:

 

 

進一步我們計算了預測結果的準確率:Accuracy=0.787。截圖如下:

 

    1. 樸素貝葉斯(採用拉普拉斯修正和多項式模型)

首先算出CountVectorize表,然後採用樸素貝葉斯進行訓練和預測。預測結果截圖如下:

 

 

樸素貝葉斯預測結果的準確率:Accuracy=0.614。截圖如下:

 

  1. 討論與改進
    1. KNN的K值取用

KNN中K值的選取非常重要。如果當K的取值過小時,一旦有噪聲得成分存在們將會對預測產生比較大影響,例如取K值爲1時,一旦最近的一個點是噪聲,那麼就會出現偏差,K值的減小就意味着整體模型變得複雜,容易發生過擬合;如果K的值取的過大時,就相當於用較大鄰域中的訓練實例進行預測,學習的近似誤差會增大。這時與輸入目標點較遠實例也會對預測起作用,使預測發生錯誤。K值的增大就意味着整體的模型變得簡單;如果K==N的時候,那麼就是取全部的實例,即爲取實例中某分類下最多的點,就對預測沒有什麼實際的意義了;K的取值儘量要取奇數,以保證在計算結果最後會產生一個較多的類別,如果取偶數可能會產生相等的情況,不利於預測。

 

我們在實驗中KNN的預測準確率偏低,可能是因爲沒有取到一個合適的K值。因此,我們做了一組實驗,觀察K值對準確率的影響。

K值

準確率

3

0.866

5

0.840

10

0.787

15

0.778

 

可見,在K值較小時,實驗結果就有很大改進。這反映了在現實中存在很多不確定性,分類問題也不是非黑即白的。同一封郵件,其內容或許不僅僅是隻屬於某個類別,也可能屬於多個類別,即一封郵件中包含了多個類別的信息。如果K值取得比較大,可能會有更多訓練數據和郵件中次要的信息進行匹配,導致最終預測的準確率不升反降。從實驗結果開看,K=3時,KNN的準確率最高,達到0.866,算得上是不錯的預測表現。

 

    1. 樸素貝葉斯的改進

實驗中樸素貝葉斯的準確率只有0.614,顯著低於樸素貝葉斯的平均表現。預測完成後,我們檢查了樸素貝葉斯的預測文件,發現大部分測試樣本的後驗概率都是0,導致算法無法進行合理分類。究其原因,是因爲文檔中大部分詞的詞頻都不高,最多的也不超過1000,然而詞典的總詞數是10萬左右,使得詞的類條件概率值非常接近0,最後的計算得到的後驗概率有甚者達到10的-100次方級別。在數據如此小的情況下,計算機無法保持其精度,也就無法比較不同的後驗概率來進行分類判別。

 

鑑於此種情況,我們在每一個類條件概率外加一層log,取其對數值。對數可以將非常接近0的數據映射到差異性比較大的大數上,從而回避了類條件概率趨於0而無法判別的問題。

 

以下是改進後樸素貝葉斯的預測結果截圖:

 

 

改進後樸素貝葉斯結果的準確率:Accuracy=0.897。截圖如下:

 

可以發現樸素貝葉斯的效果取得了非常大的提升,準確率接近0.9,甚至高於KNN。說明樸素貝葉斯確實是一個經典、高效的文檔分類算法,在此類問題中表現非常優秀。

 

    1. 詞向量/文檔向量與LSTM

儘管TF-IDF模型非常適合表示文本特徵,但是它還是沒有利用到詞的順序信息。對於這個問題,更爲合適的一個做法是提取短文本每個詞的詞向量,之後將其補齊和截斷到統一的長度,然後訓練一個長短期記憶網絡LSTM,這樣既利用了詞本身的信息,還利用了詞之間的語序信息,畢竟LSTM生來就是爲處理NLP任務的。鑑於時間關係,我們並沒有實現這一部分代碼。我們預測詞向量模型的改進一定能進一步提高KNN的預測表現。

 

    1. 結論

KNN和樸素貝葉斯都是非常優秀的文檔分類算法,經過我們的改進後,這兩者都有了不錯的準確率。從結果來看,KNN的表現略微低於樸素貝葉斯,可能是因爲詞向量模型採用的是簡單的TF-IDF,並沒有充分利用文本中的語言信息。

KNN和樸素貝葉斯都非常適合用mapreduce的方式進行並行化,能在較短時間內完成對大量數據的處理,最終取得了不錯的成果。

 

  1. 分工情況
    1. 方法確定和問題討論

一同完成

 

    1. TD-IDF

圓哥:主體

牛哥:改進TF-IDF值的最終計算

月哥:提出TF-IDF向量歸一化  

 

    1. CountVectorize

  牛哥:主體

月哥:步驟優化(在vectorize中進行詞彙、詞數統計)

 

    1. KNN和樸素貝葉斯

圓哥:KNN主體

月哥:KNN算法修正

牛哥:KNN內存優化,樸素貝葉斯。

 

    1. 實驗運行與集羣操作

牛哥:將文件IO從本地操作改爲HDFS操作

 

    1. 報告書寫

圓哥:引言,第1~2章、第3.1~3.3、5.3小節

牛哥:3.4、3.5小節

月哥:其他部分、校對

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章