:::

非結構化資料分析:文本分類 / Unstructured Text Analytics: Text Classification

image

這是巨量資料探勘與統計應用課程的投影片「非結構化資料分析:文本分類」。本單元是屬於系列課程中的「資料預測級」中最後一個單元。處理資料類型是為非結構化的資料進行分類,也就是使用類別資料。這邊使用了Jieba斷詞來作文本語義分析,然後使用樸素貝氏多項式文本分類器(NaiveBayesMultinomialText)來為文本進行分類,最後還用特徵篩選(Select attributes)找出關鍵字。到底圖書館員分類編目的核心技能會不會被這篇所講的自動化文本分類機器所取代呢?看完這個單元你就可以知道結果了。本單元使用了二個我自製的工具來搭配Weka實作文本分類,單元內包含了四份實作學習單跟一份測驗,供同學邊看邊練習。這個單元包含了四個實作學習單跟一份測驗,供同學邊看邊練習。


單元大綱 / Outline

  1. 處理非結構化資料:特徵量化
  2. 實作:文本語義分析
  3. 實作:文本分類
  4. 找出分類關鍵字:特徵篩選
  5. 進階的文字向量:TF-IDF
  6. 更進階的文本分類
  7. 結語:圖書館員的危機?
  8. 課堂練習:一般留言還是垃圾留言?

投影片 / Slide

我以Google簡報的檔案匯出成PPTX,再備份到以下位置:

學習單 / Worksheets

image

本單元包含了以下的學習單,請搭配課程投影片一起練習吧。

測驗 / Examine

image

本單元整理了一份測驗,供同學驗證所學:

資料集 / Dataset

image

本單元用到了以下資料:

  • 是籃球還是地球?:這份資料集取自於袁梅宇所著的「王者歸來: WEKA機器學習與大數據聖經」中的例子,這是從維基百科中取籃球Google地球介紹的句子組合而成。這個單元的規劃主要也是受到該書中「文字分類」一節的啟發。我為了教課之便,又增加了些許籃球與Google地球的句子進去資料集中。
  • 一般留言還是垃圾留言?:這份資料取自於本blog「布丁布丁吃什麼?」的留言資料。Blogger內建了相當優良的垃圾留言過濾器,被視為垃圾留言的話,就不會顯示在blog中。我從一般使用者留言跟垃圾留言中取得一些例子,組合成這個資料集。
  • 是唐詩還是新詩?:我從唐詩三百首網站小品欣賞的新詩感覺中取了一些例子組合成這個資料集。就各方面來說,新詩跟唐詩用於文本分類、探勘都是蠻有趣的例子。

線上操作平臺 / Online Workplace

google_drive Alecive-Flatwoken-Apps-Google-Drive-Formschromeweka[3]

本單元的實作需要使用部分雲端服務、我自己開發的工具,以及安裝在本機端的Weka搭配使用。以下的雲端服務建議使用Google Chrome瀏覽器開啟:

文本分類工具 / Text Classification Tools

這次文本分類也會使用到兩個工具,它們必須搭配Weka一起使用。所有的程式碼都已經放在GitHub保存庫,屬於線上中文斷詞工具:Jieba-JS的一部分應用。GitHub網址如下:

試算表轉ARFF / Spreadsheet to ARFF
ARFF轉CSV / ARFF to CSV

    小結 / In closing

    image

    非結構資料的文本分類會很難嗎?如果你能夠回答上面的問題,那你就已經抓到了文本分類、甚至是所有非結構資料處理的精髓了。

    這個單元的內容所教的文本分類可以用於相當多地方:

    • 顧客意見分類:如果公司時常收到顧客的各種抱怨,先使用文本分類來分類顧客意見,並藉此找出對應的處理方法,這可以加快處理客訴的流程。
    • 學生作文評語:請文本分類先將學生的作文看過一次,並預先挑好要給學生的評語,這可能也是一個不錯的應用。
    • 新聞分類:記者寫了一篇新聞,這到底該分成娛樂類還是政治類呢?用文本分類協助主編作決策吧。
    • 情緒分析:社群媒體上的一篇短文到底是正面情緒還是負面情緒?這是現在文本分析最流行的應用。
    • 決定圖書分類號:圖書館員的核心技能分類編目也可以用文本分類來決定。事實上,圖書分類一直是文本分類研究中許多人爭相挑戰的一項議題呢。

    附帶一提,如果我們這次不是要將文本分成不同「類別」,而是要給予分數這種「連續」資料,那麼這就是文本自動評分的領域。請看「AI解籤不用1秒,廟公要失業了嗎?Weka的中文自動評分:預測詩籤的等第」這篇的做法。

    圖書館員要失業了嗎? / Librarians' crisis ?

    image

    熊貓症候群之後,面對文本分類技術的成熟,我想應該很多人應該會開始擔心,這是否會對圖書館員的核心技能「分類編目」帶來威脅呢?

    image

    就我個人來看,文本分類並沒辦法取代專業的圖書館員,這是可以肯定的事情。如果仔細看過前一個單元的分類與預測跟這個單元的內容,你應該可以發現到資料探勘的分類其實有很多限制。最大的限制在於機器本身並無法解釋資料、無法歸納與發掘資料新的特性,而且分類的有效性幾乎有九成取決於一開始輸入的資料。換句話說,如果沒有圖書館員提供正確與精準的分類資料,文本分類就沒有任何意義。更何況,圖書館廣納百川資訊,蘊含五花八門知識的書籍與論文不斷產生,機器很難動態地學習新知識並將其歸類,只有受過專業訓練的圖書館員才能辦到。

    看到這兒,身為圖書館員的你是不是很開心只想把文本探勘技術一腳踢開,抱著圖書館員的驕傲開心地去睡了呢?

    不!事實上,文本分類並非圖書館員的敵手,而是圖書館員分類編目的幫手!想像一下,如果在作分類編目之前,熟悉文本分類技術的你先把檯面上待編的50本書籍全部用文本分類預測個可能的分類,以此作為分類的參考依據,然後依照Entropy預測亂度結果來決定是不是要認真編這本書,這樣不就能夠省下大量的編目時間,讓你的編目效率突飛猛進嗎?這可不是機器跟人類的對抗,而是機器輔助人類的合作呢!

    image

    不過,如果有一天,當圖書館員完全放棄自己的專業,將分類號的判斷全部來自抄錄編目或交給文本分類機器,那我得說聲抱歉,這樣子的圖書館員真的會被文本分類取代。

    image

    那麼,我們到底該怎麽面對像是文本分類這樣子的人工智慧AI呢?李開復在今年臺大畢業典禮的致辭中歸納了相當發人深省的看法。AI能夠在既有的領域、已知的知識上快速地成為僬僬者,小到搜尋文字找的比人類自己看還快、大到AlphaGo下棋大勝人類棋手。它就像是魔法棒一樣地加快和優化了整個流程。我們應該要掌握AI這隻魔法棒,而在這之後,就如李開復所說:

    「有了AI這支魔法棒,你有責任去解決困難的問題。不要浪費時間做那些機器很快就能勝過人類的事。不要接受沒有挑戰的工作,對自己設定積極而嚴格的學習目標,選定某個具體領域勤下苦工,成為AI無法取代的人才。」(李開復,2017)

    跟大家共勉之!


    本單元所介紹的文本分類就到此為止,這也是這一系列巨量資料探看與統計應用課程的最後一個單元了。不知道看到這邊的你,對於文本分類對圖書館員帶來的衝擊有什麼看法呢?如果你也能夠掌握文本分類這個魔法棒的話,你會想要拿來作什麼事情呢?歡迎在下面的留言處與我分享你的看法,或是在AddThis分享工具按讚分享我的文章到Facebook等社群媒體吧!很感謝你的耐心閱讀,讓我們下次見囉!

    總共7 則留言 ( 我要發問 , 隱藏留言 顯示留言 )

    1. 您好 我有看這篇的文本分析教學有試著自己跑看看
      想做飯店評論預測分析 class:為正向、負向、中性
      使用的分類器是樸素貝葉斯
      但是跑出來的結果很差只有58%的成功率
      可以麻煩幫我看一下問題出在哪嗎?謝謝
      https://upload.cc/i1/2020/06/21/lL9V8w.jpg

      試算表:https://docs.google.com/spreadsheets/d/1Bm4sVJUb-j2SKuY1J-p7XuATfecmH3mftjyhZc7wRGI/edit?usp=sharing

      回覆刪除
      回覆
      1. 想要達到成功率75%以上要怎麼做呢?謝謝

        刪除
      2. 另外可以在推薦2個預測的分類器給我嗎?要可以做正向、負向、中性的 謝謝

        刪除
      3. 你好,

        我有空才能幫你看看喔
        不太能跟你保證何時完成呢

        刪除
    2. 好的 那就等您有空幫忙看一下了 謝謝
      那請問可否先告訴我class類別有3種(正向、負向、中性)是否可以用NaiveBayesMultinomialText分類器做呢?(因為數據不好看 想知道是不是方法用錯了? 謝謝)
      另外還有別種的weka上的分類器可以做嗎?謝謝

      回覆刪除
      回覆
      1. 你好,

        事隔一年之後的回覆。

        我嘗試了以下作法,獲得了81.6425%的正確率
        結果報告如下:
        https://docs.google.com/document/d/e/2PACX-1vQL29xSiebn_bOCZ2RlO8VV0Vj9IrsHkpTrJNnq_ns95kgPIJhguhrasgk7lRxat3lrxw3YsuTDys36/pub

        作法如下:

        #Step 1. 試算表中的資料前處理

        將測試資料刪除,只留下訓練資料

        # Step 2. Weka中的資料前處理 (Preprocess)

        做兩次Filter,作法如下

        a. NonimalToString
        將document轉換成Type: String

        b. StringToWordVector
        將document轉換成文字向量,主要參數如下:
        - attributeIndces: 1 (document)
        - attributeNamePrefix: _ (避免跟class相衝突)
        - outputWordCounts: True
        - wordsToKeep: 10000000 (儘可能保留所有文字)
        這樣會產生詞頻模型

        到這一步為止,資料轉換會變成下面這張表格
        https://pulipulichen.github.io/blog-pulipuli-info-data-2021/05/inn-rating-comment.arff.7z

        # Step 3. Weka中建立分類模型 Classify

        Classifier: weka.classifiers.functions.SMO
        分類器採用預設值,沒有其他設定

        Test options:
        Cross-validation Folds: 10

        分類目標:
        (Nom) class

        # Step 4. Weka中模型結果

        建立模型跟驗證時間大概花費5分鐘

        結果正確率為81.6425%
        F-Measure為0.814

        https://lh3.googleusercontent.com/-XDsrfZ42FMI/YJqS2dyPkNI/AAAAAAAE9oQ/tJJEA71nJKwq1eoxGEX-qr-u6N7kpoJTwCLcBGAsYHQ/s1600/2021-05-11_222030.png

        ----

        也許會有更好的作法,不過我做了第一種作法,結果就達到你想要的75%以上的正確率

        我把可以改善的方向列在下面,你可以自己嘗試看看:
        - 不做斷詞,將單一字作為詞彙。這樣子可以確保特徵數量足夠多
        - 保留標點符號。原本的評論內容就已經很短了,保留標點符號可以讓特徵數量增加。
        - 資料前處理的時候,將詞頻模型改用,而使用TF/IDF模型
        - 用AttribueSelection篩選屬性
        - 選擇其他演算法

        刪除