:::

AI解籤不用1秒,廟公要失業了嗎?Weka的中文自動評分:預測詩籤的等第 / Automatic Chinese Text Scoring in Weka: Rating Fortune Slips

image

人工智慧要為非結構性的文本型資料評分,要評到精準是很難,但如果只是簡單地給個評分的話,其實是非常簡單的事情,不需要寫任何程式碼。繼我之前寫的「Weka試跑文本評分」,這次我一樣直接使用Weka來為「雷雨詩籤百首」中的籤文與等第建模,做到Weka看到「一舟行貨好招邀 積少成多自富饒 常把他人比自己 管須日後勝今朝」就知道是「上吉」。此外,還能透過特徵選取(select attributes)功能來篩選出影響等第的籤文關鍵字喔。


原理 / Philosophy

image

(圖片來源:籤詩網)

「籤詩寫了什麼事情會影響它的等第呢?」

在實作之前,我必須要先說明一下這篇實作預測的關鍵原理。

這邊的籤詩是指「一見佳人便喜歡 誰知去後有多般 人情冷暖君休訝 歷涉應知行路難」,而等第則是代表這篇籤文的等級,就是「下下」。前者在資料探勘中是作為特徵(attributes)輸入,而後者則是資料探勘要預測的類別(class)。跟「用Weka分類模型來預測未知案例」這篇不一樣的是,詩籤的等第是有大小之分的連續變項(numeric),而普通的分類則是名義變項(nominal)。這種為非結構性的資料進行評分的研究,通常會叫做自動評分(automatic scoring)或自動評等(automatic rating)。

Weka,呃,或是我標題寫的人工智慧、深度學習、資料探勘、統計什麼的,各種技術在進行預測的時候,都必須要先有一些預設的假設。特別是對這種非結構性的文本資料進行預測時,每個人採用的假設會不盡相同,做到最好的預測技術會針對文本資料的共同特性融入大量的領域知識(domain knowledge)。例如新托福利用電腦評分時,會針對語法正確性、語句的正式與否、文體風格多變性、文章組織架構、前後邏輯發展是否通順、使用語彙的難度、單詞的解釋性等等專門為了托福作文規則而設計的評分,但這些規則在其他文本跟不同的評分目標來說,不一定適合。

這篇為了展示一個通用的原則,我只用了非常簡單的假設:「籤詩如果寫了某些關鍵字,它就會影響籤詩的等第」。雖然這假設很單純,但卻可以應用在各種的場合。舉例來說,國家考試在評分考生的問答題時,最先注重的就是考生是否有寫出該題的關鍵字;研究者在為討論區留言編碼時,也常會以關鍵字來作為選擇編碼的主要依據。

當然,這並不是說「是否出現某關鍵字」之外的其他特徵就不重要。文句前後的邏輯、轉折語句的使用、隱喻與反諷等文句實際上也會影響評分結果。但這篇只是為了展示一個簡單的做法,我們就不要把假設想得這麼複雜,就用「籤詩如果寫了某些關鍵字,它就會影響籤詩的等第」吧。

詩籤資料 / Data: Fortune slips

image

這篇使用的詩籤資料來自「雷雨詩籤百首」。我把它整理成Google試算表的格式,請從下面下載:

這份試算表有兩個欄位:

  • document:記錄籤詩內文,例如「一見佳人便喜歡 誰知去後有多般 人情冷暖君休訝 歷涉應知行路難」。
  • class:籤詩的等第,以數字表示,1表示是「下下」。

原本詩籤的等第都是以「大吉」、「中吉」、「下吉」等文字表示,我以下表將各種等第轉換成數字。數字越大,表示籤越好,反之,最低的1表示「下下籤」,籤運最差。

等第 class
下下 1
下中 2
中下 3
中平 4
中吉 5
上上 6
上吉 7
大吉 8

如果你要參考這篇做類似的文本自動評分,那麼你也要資料整理成這樣的格式喔。資料整理好之後,接下來我們就來實作吧。


Weka解籤:自動評分 / Automatic scoring in Weka: Predicting the rating of fortune slips

image

好的,接下來我們就要用Weka來為這些詩籤建立可預測詩籤等第的模型囉。如果你沒有Weka的話,可以先參考「Weka下載與套件安裝教學」這篇來安裝Weka。

Step 1. 準備訓練集 / Generating train set

這篇做法跟「不寫程式也能預測未知!用Weka分類模型來預測未知案例」類似,但我們並不準備真的處理建模、預測兩步驟,而單純只是要建立一個可預測的模型。因此我們不需要測試集(test set),只需要用來建模的訓練集(train set)。做法如下:

  1. 先下載「詩籤與評分 blog」的CSV格式:詩籤與評分 blog - data.csv
    image
  2. Weka Spreadsheet to ARFF網頁中的Input裡的上傳檔案欄位,選擇該檔案。
    image[20]
  3. 按「Train Data Set」下載檔案:train_set-詩籤與評分 blog - data.arff
    image

Weka Spreadsheet to ARFF網頁如下:

這個工具內含了Jieba斷詞器,籤詩會被用空格斷開成為多個關鍵字。舉例來說「一見佳人便喜歡 誰知去後有多般 人情冷暖君休訝 歷涉應知行路難」一詩會被斷詞為「一 見 佳人 便 喜歡 誰知 去 後 有 多 般 人情冷暖 君 休 訝 歷 涉 應 知 行路難」,而每一個關鍵字都會被視為可能影響等第的屬性,用來預測最後的等第資料。

Step 2. 資料前處理:文字向量化 / Preprocess: StringToWordVector

image

再來我們開啟Weka的Explorer,載入資料,然後使用過濾器Filter的「Weka.filters.unsupervised.attribute.StringToWordVector」,不設定任何參數,直接按下「Apply」按鈕。這時候左下角的Attributes會從原本的「document」跟「class」兩個屬性,變成有1078個含「class」的屬性。這就是把「document」屬性中的文字,以空格斷開成為多個屬性。

image

按下「Edit」按鈕可以開啟檢視資料的Viewer視窗,No. 4的案例原本籤詩是「一見佳人便喜歡 誰知去後有多般 人情冷暖君休訝 歷涉應知行路難」,經過斷詞處理後,該籤詩包含了「一」這個關鍵字,因此「一」的屬性被標示為「1」,表示該籤詩有「一」這個關鍵字。但該籤詩裡面並沒有出現「一卷」這個關鍵字,因此「一卷」關鍵字屬性被表示為「0」,表示該籤詩沒有「一卷」這個關鍵字。

Step 3. 建立預測模型 / Build prediction model

2017-09-18_162000

接下來切換到「Classify」頁籤。在這裡我們有蠻多步驟要處理,以下請一步一步仔細作喔:

  1. Classifier: 選擇「weka.classifiers.functions.SMOreg」,這是SVM演算法的迴歸模式,可以用來預測連續變項。特色是速度快、對非線性資料預測準確。這裡可以替換成「MultilayerPerceptron」 (多層次感知機,等於基本的類神經網路)、「LinearRegression」(多元線性迴歸,統計通常都用這個來做),只是「SMOreg」速度最快,所以我們先用這個來作吧。分類器的參數可以先不用設定。
  2. 預測目標選擇「(Num) class」。
  3. 按下「Start」。
  4. 右方「Classifier output」出現結果。

結果中我們最容易解釋的是「Mean absolute error  1.5562」這一項,這表示Weka透過10疊交互驗證之後預測結果,預測錯誤的分數差平均為1.5562分。換句話說,如果拿這個模型去預測籤文,預測結果可能會跟實際等第誤差1.5個等第。

附帶一題,結果中「Time taken to build model: 0.09 seconds」的意思是SMOreg只要0.09秒就能建好模型,這篇標題的不到1秒就是這樣來的。

Step 4. 檢視預測結果 / Predicted result

接下來我們要更進一步來看看到底Weka都預測了什麼。

image

在左下角的「Result list」中,選擇輸出的預測結果,按右鍵,選擇「Visualize classifier errors」。

image

再按下「Save」,保存一份ARFF檔案。

然後使用上面的「Weka ARFF to CSV」將ARFF轉換成CSV檔案。

image

我把轉換後的結果上傳到Google試算表,供大家參考。

最後輸出的結果,我們主要看的是前面三欄:

  • id:詩籤的編號。雖然原本的「詩籤與評分 blog」並沒有編號欄位,但處理過程中程式會幫你加上一個id,讓資料分析比較容易進行一些。舉例來說,第四個輸入的詩籤是「一見佳人便喜歡 誰知去後有多般 人情冷暖君休訝 歷涉應知行路難」,預測結果是「1」(下下),這就是id = 4這一列的資料了。
  • predictedclass:Weka預測該籤詩的結果,以id = 4為例,是4.596342分。
  • class:原本資料的等第換算成的分數,以id = 4為例,是1 (下下)。

從id = 4的籤詩「一見佳人便喜歡 誰知去後有多般 人情冷暖君休訝 歷涉應知行路難」來看,原本是「1」下下籤,Weka卻預測為「4.6」靠近「中吉」的分數。結果並不是很理想。

Step 5. 評估預測結果 / Evaluating predicted result

image

若仔細看看每一個預測結果,會發現Weka大多預測分數都落於3~5分之間,位於最低1分與最高8分的中間。這可能是因為大多數詩籤也都是在中間分數,導致訓練出來的模型也大多落於中間的緣故。這個模型難以預測極端的等第,像是「大吉」或「下下」,而中間的等第如「中下」、「中平」或「中吉」就還可以接受。

但這個結果也不能說是預測器真的很準,可能也只是剛好碰巧剛好遇到這個數字。這就很像是選擇題每一題都選「C」,搞不好成績還比認真作答但答錯的人還高分一樣。

我這一篇並不是要做一個很準的文本評分,只是要簡單地做一個自動評分功能,因此做到這樣其實就已經完成本篇的目標了。如果要讓評分更準的話,我們還有幾個方向可以去考慮:

image

  1. 演算法的方面:我們可以試著調整演算法來改善預測的成果,例如選用其他的核(kernel)。或是使用其他演算法,像是多層次感知機或是線性迴歸,甚至是Weka的深度學習。上圖改用線性迴歸來建模之後,平均錯誤就從1.5562降低到了1.4946囉。
  2. 文本處理的方面:我們可以納入「詞頻」、「字的先後順序」等因素,讓Weka有更多特徵可以進行預測。
  3. 領域知識的方面:如果我們對籤文有更多瞭解的話,就可以設定更多的規則,例如籤文在開頭講到「好」通常是「不好」的籤,在最後才講「好」則等第通常是中上的程度。

找出影響等第的關鍵字 / Keyword Selection

如果我們的假設是「籤詩如果寫了某些關鍵字,它就會影響籤詩的等第」,那麼影響詩籤等第的關鍵字,到底是什麼呢?接下來我們就用Weka的特徵選取(Select attributes)來找出這個答案吧。

Step 1. 準備訓練集 / Generating train set

跟前面一樣。

Step 2. 資料前處理:文字向量化 / Preprocess: StringToWordVector

跟前面一樣。

Step 3. 特徵選取 / Select attributes

image

前面的第三步使用的是分類器,這邊我們則是要進入到「Select attributes」使用特徵選取功能。一進入特徵選取的分頁,Weka會預設使用CfsSubsetEval評估器與BestFirst搜尋方法。CfsSubsetEval評估器使用相關分析的方式,找出屬性本身與分類結果(class)最相關、屬性與其他屬性最不相關的屬性。BestFirst是貪婪演算法的爬山法,它會儘可能找出局部最佳結果,速度快,但不能從整體大局找到最佳結果。

需要手動操作的地方有下面兩個:

  1. 分類目標要選擇「(Num) class」
  2. 按下「Start」

右邊Attribute selection output就會顯示分析結果。Weka挑出了50個關鍵字,如下所示:

一卷
一旦
一般


五十
交情

人物

菩提
誰知





image

其中我們以「誰知」這個關鍵字來看看。包含「誰知」的詩籤有兩個,個別是:

  • 一見佳人便喜歡 誰知去後有多般 人情冷暖君休訝 歷涉應知行路難 (下下)
  • 憶昔蘭房分半釵 而今忽把信音乖 痴心指望成連理 到底誰知事不諧(下下)

看來出現「誰知」這個關鍵字的時候,恐怕都不是什麼好籤呢。

透過特徵選取的分析,我們就能夠從不同的角度深入分析文本內容,可以試著從這種方法來解釋文本與評分結果之間的關係喔。


小結 / In closing

大概在兩年前的時候,有位老師在問:「能不能在數位學習平臺中作一個簡答題自動評分的功能呢?」

許多人都覺得自動評分是非常困難的技術,需要大量的領域知識才能真的做出來。現在深度學習流行之後,又有許多人試著從文本的字句前後關係、段落等不同特徵跟類神經網路結合,搭造出非常複雜的網路結構來進行評分,如此高的技術門檻又讓許多不熟程式碼的入門者立刻打退堂鼓。

但如果我們要求不要這麼多,只是要一個可以評分的功能,那就像這篇講的,其實並沒有很複雜。

沒有完美的評分者 / No perfect scorer

不過我們要換個角度來談這個問題。其實,我個人覺得並沒有完全正確的評分,而我們也不可能完全依賴這樣的評分器。

這個原因並不只在於被誇大的人工智慧跟真正的人類仍有距離,還包括了人對分數高低過於敏感的問題。人們很在意量化的數值,特別是自己預期的數值跟別人量化數值有所落差時,人們會覺得非常反感。所以只要這種人工智慧評分有任何失誤,人們就會將問題放大,並極力反對這種評分機制,還能從中獲得「人類才有真正的智慧」的優越感。更何況,別說是人工智慧這種機器評分了,連老師真人評分,還不是常常遇見家長跑來報怨評分不公的問題。

完美的自動評分很難存在在真實社會中,不過卻常常出現在理論的論文裡。不過,許多論文研究大多都對同一份文本改進評分機制,這可能也會帶來過擬合(overfitting)的問題。換句話說,就是同樣方法可能不能適用於其他文本。從另一個方面來看,即使英文權威的托福使用了機器輔助作文的評分,他還是得要搭配一位真人,採一機一人評分方式進行。擁有英文領域知識的托福況且如此,沒有領域知識的程式技術研究者,更應該謹慎看待自動評分技術的結果,不可過於依賴。

關於標題 / About title

喔、對了,最後一提的是這篇的標題:「AI解籤不用1秒,廟公要失業了嗎?Weka的中文自動評分:預測詩籤的等第」。這是嘗試使用聳動駭人的內容農場標題法的結果。

很多新聞一提到人工智慧,都喜歡把它跟極少的成本(時間、輸入資料)、某行業的失業一起擺在標題。但若仔細看一看內文,卻又覺得標題也太過誇大其詞,不是準備資料的成本其實沒有標題寫的這麼簡單(我這篇作下來也不只1秒好嗎),就是人工智慧(其實就是指這篇用到的分類器),所做到的事情只有將案例分成「A」或「B」其中一類,並不能作更多事情,自然也不可能真的完全取代職業本身。

我瞭解新聞記者為了吸引目光而難免誇大其詞,不過還是勸大家先看一下「AI新聞那麼多,但來亂的也不少!這位人工智慧教授說出新聞報導中對人工智慧的5大誤解」這篇中紐約大學教授Julian Togelius對於人工智慧新聞的評論,稍微拿捏一下新聞記者報道跟實際發展的一些落差,這可能會讓許多人工智慧驚慌者稍微冷靜一點吧。

不過,會不會有讀者只看了標題,內文太過複雜而看不下去(我估計這兒有六成讀者都是如此),但是卻跑過來跟我說:「欸你害廟公失業,會遭受天譴耶」這種話呢?我還真的開始擔心了……

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

  1. 後來在整理的時候,才發現詩籤資料竟然有很多是重複的 OAO"

    整理了不重複版本
    https://docs.google.com/spreadsheets/d/1wPIPxbG_Kry06RK0AnSGvWZPCEvnJK2TL65kP9mnbEc/edit?usp=sharing

    還有斷詞的版本
    https://docs.google.com/spreadsheets/d/1ZyJV14y2C4flxedBGPUZ0dv1axYN5COLXABKUz9eVT8/edit?usp=sharing

    回覆刪除
  2. 欸你害廟公失業,會遭受天譴耶! (硬要留言

    回覆刪除