自然語言處理 (NLP) -2 文本摘要Text Summarization 

原本打算只寫一篇就把自然語言處理和文本摘要紀錄完,結果一不留神就寫了一堆,只好再起一篇主要敘述文本摘要(Text Summarization),現今業界也有很多人在做這一塊,但是大家各有不同的做法和看法,所謂文本摘要(Text Summarization),主要是讓機器可以在讀取很多文章、很多串文字後,幫人類彙整出這些文章、文字串的重點,而這些彙整出的重點,可能是比較具象的,譬如文章中很頻繁地提到哪些人事物,或是比較抽象化的,用機器自己的手法產生一段摘要敘述;在經過一些整理後,我條列出目前在文本摘要(Text Summarization)這個領域,主要有幾種常見研究議題如下;

  1. 文本摘要 Text Summarization,主要是讓機器可以在讀入一大篇文章後,輸出這篇文章主要想表達的內容,這類作法有點像是幫文章做一份摘要,讓閱讀的人可以快速且簡單地了解接下來要發生什麼事,而一篇文章通常有起承轉合等,不同類型的文章也會有不同表現手法,譬如新聞類文章的重點多在第一段,但是評論類則會多在中後段,所以實際使用模型學習時,不容易令模型掌握到究竟哪段才是重點!
  2. 文件摘要 Document Summarization,主要是訴求讓機器讀入一份文件,裡面會有多篇文章,接著再把讀入多篇文章後的重點萃取出來,讓使用者知道這份文件裡面有哪些重點,這裡和文本摘要比較不同的是,一份文件不會只有一個重點,且也難以用一段摘要就能表現清楚,不過在一些研究中,Document Summarization通常會和Text Summarization混合在一起,若是有人發現我講錯了,再請跟我說一下,感恩!
  3. 多文件摘要Multi-Documents Summarization,主要是讓機器讀入多份文件,這樣講好像是廢話?但是在多文件摘要時,會先進行分類和歸納,同一類型文章會被歸納成一個叢集(Cluster),而透過機器對於這些文章的理解,進而取出這批文章想要表達的重點,或是找出文章內相異、相同論點等,譬如說,今天有一批研究茶葉種植的文章好了,在多文章摘要時,我們可以看出這一批文章裡面存在著哪些觀點,例如某些文章主張高緯度有著茶葉生長,而某些文章可能主張高緯度對茶葉生長無幫助等。
  4. 觀點摘要 Opinion Summarization,我如果硬要把觀點萃取看成一種摘要,可能有點牽強,但也並無不可,觀點摘要的需求主要來自於社群網路興起後的產物,譬如在Youtube、網路新聞甚至電商平台上等,通常可以看到許多評論Comments,而這些評論大多可以反映群眾對於Youtube或是電商商品本身的看法,通過觀點摘要,我們可以看出一段影片,一則新聞或是一個商品引起的群眾力量,只是不同於前面幾個摘要是化簡為繁,觀點摘要通常是化繁為簡,因為評論通常字數不多,且更口語化,也隱含著更多不同的看法跟理念,當然也有更多時候只是路人起鬨而已;不過在現今的觀點摘要做法,通常是用爬蟲+統計,量化各種看法後,多加整理而成,是否能抽象化成一種概念,以目前來說都是用人工輔助解決居多,如果要讓機器自動產生一個抽象化的理念,就不是那麼容易了。
modern art
要多抽象有多抽象? Photo by Bruno Thethe on Pexels.com

前面講完文章摘要後,我們大可以掌握到這門學科就是把一堆文字轉換成簡短、有效的文字敘述,而目前常見研究論文中,在實現摘要這件事情上,我們主要有兩大步驟要實現;

  1. 文章理解,如何把輸入的文章、文檔轉化成可用資訊片段。
  2. 文字處理,如何把可用的資訊片段,找出潛在的訊息,並進而推導出完整的答案。
  3. 文章生成,如何把推導出的答案,轉化出一串文字,作為完整的說明。

說到這裡,我們不難發現,這幾個步驟似乎和ChatBot差不多? 沒錯,事實也是如此,在我們常見的系統或功能設計中,也不外乎輸入(文章理解)、處理(文字處理)、輸出(文章生成)三個步驟,只是在這裡,我們所面臨的輸入輸出功能,不管是邏輯規劃,功能設計,都比先前我之前遇到的功能設計還要複雜得多,相對要付出的知識成本也比較多就是了。

white printer paper
其實, 一切都是需要設計而已。Photo by picjumbo.com on Pexels.com
文章理解,如何把輸入的文章、文檔轉化成可用資訊片段。

回頭來到一開始的輸入階段,首先我們要把文章輸入到系統中,好讓機器可以理解文章內容,在這裡,現今常見的手法,多是透過一些手法讓機器可以理解文章內容,常見的方法有兩種,萃取式(Extractive)和抽象式(Abstractive)。

萃取式(Extractive)的概念,基本上是文章把文章輸入後,排除掉一些贅字和連接詞,將文章裡的詞彙作權重(Weight)計算Text Ranking之類的,找出排行前幾名的文字,接著用排名來決定哪些文字是重點。

或是用溶蝕(Erosion),逐步消去文章內重要性比較低的文字和段落,只保留重要的段落內容,其實兩者作法相似,但是出發點不同,用權重(Weight)排名找出來的重點會比較片段且雜亂,把文章裡面的詞彙、段落抽取出來,可以看做在一大段文字中,只畫出自己需要的關鍵字;用溶蝕找出來的重點,因為多用排除法,則比較會保留文章原文法。

不懂甚麼是Erosion ? 希望Squid Game這段可以幫助你理解。

–待續

自然語言處理 (NLP) -1 簡述

自然語言處理(Natural Language Processing),一般縮寫成NLP,是人工智慧和語言學的一個分支學科,前面提到的自然語言,指的是人類口說、書寫和理解用的文字;在這領域中,主要探討怎麼讓電腦可以理解自然語言(NLU),讀懂文字後,往下進行相對應流程處理;又有一方面是探討怎麼讓電腦可以做自然語言生成(NLG),可以透過電腦擷取,甚至產生新的文章。

而這門學科也可以和語音、圖像辨識,做為銜接,完成比較全面的應用,譬如執行日常對話,甚至描述所見場景等,對大眾來說,NLP的相關應用還蠻容易引起人們廣泛興趣,比較常見的就是聊天機器人(Chat Bot),聊天機器人本身可以涵蓋幾種技術面向如下;

  1. 自然語言理解,理解使用者輸入的語句和問題。
  2. 文字檢索,理解語句和問題後,在資料庫中進行尋找,找出相應的回應或是解決方式。
  3. 自然語言生成,承上找出的回應或解決方式,因為可能多是片段和連結,必須重新產生成合理的回應方式。

當然在日常我們看到的自然語言理解,多半不會把上述三個面向都做得很完整,我也是偷吃步居多,主要是因為除了文字檢索外,語言理解和處理(生成),都需要面對比較多的學術研究,以我先前使用微信API做的智能機器人來說,我選擇的方式就是擷取輸入關鍵字,接著用關鍵字去檢索可能的資訊,並和用戶再次確認,最後丟出檢索結果。

然臉皮很厚但也算是ChatBot,只是差別在腳踏車和豪華客機的差別就是了,只是那時我也就意識到自然語言理解和生成的難度,才興起想研究的好奇心。

I will be back.

寫到一個段落才發現自己好像有點偏題,花了比較多的篇幅在講NLP,不過想想既然都寫了,還是要說的完整一點才行,前面大致描述了NLP的內容,還有常見應用,以及目前的發展狀況,雖然市面上有很多相關產品出現,但是他們多少存在一些問題,就NLP的相關研究來說,目前最常遇到的痛點如下;

  • 單詞邊界
    • 面對口語時,我們經常需要去界定什麼是獨立的單詞,這樣的情況在漢文中相當常見,譬如這段文字「台南市長今天參加台南市長榮中學畢業典禮」,在文章中,詞與詞之間通常是連貫的,但我們如何找出台南市長、今天、參加、台南市、長榮中學、畢業典禮,就是一個很有趣的研究,目前則大多仰賴字典檔來解決這個問題。
  • 詞義消歧
    • 在文章中,單一個詞通常有多個不同意思,如何消除歧異,讓文章通順,像這類情況我們必須考慮上下文,然後試圖找出一個最通順的解釋。
  • 句法模糊性
    • 這裡指的是自然語言的文法通常很模稜兩可,而我們怎麼在一句模糊的句子中解析出最合理的意思,就很值得玩味,通常需要考慮上下文,但這類難度通常比另一半說「我沒有生氣」還低一點,但是也是相當複雜。
  • 不受規範的輸入
    • 譬如拼寫錯誤,或是不照標準模式,更口語化的輸入,這類問題相當多變,並且不可控,Google或是Office有做輸入校正的功能,多半也是為了解決這個問題,譬如我在搜尋引擎上輸入「image embed free」,我想要的可能是可免費嵌入的圖片,但引擎幫我找出來的可能是免費的嵌入圖片(image type=embed)。
  • 語言行為與計劃
    • 指的是產生文字時,通常需要考慮完整的敘述讓詞意更通順,當然在一般對話中可能不會有此顧慮,但是在回答問題時,我們通常不會只回答「好」、「不」,而是會確實描述好、不好的原因。
javascript code
Photo by Markus Spiske on Pexels.com

綜合前述,不難發現自然語言處理(Natural Language Processing)還有很長的路要走,其實NLP的發展非常早,至少在50年代就有類似研究,是關於俄文和英文之間翻譯的議題(你沒看錯,翻譯也是其中一環),做法也從最早的Rule based轉變為機器學習,慢慢地也從Rule Driven進階到Data Driven;NLP的研究主題其實包山包海,而我自己的研究主題則多著重在文本摘要(Text Summarization)上,後面會隨著進度來更新。

機器學習常用衡量指標Precision, Recall, F1-score

前面說完了一個大概, 基本上也底定了我想研究人工智慧的方向, 接著我想從基礎知識開始記錄起, 我是個怪人, 對於有興趣的東西不希望太過不求甚解, 反倒比較期望了解他的原理, 期待能擦出一些不同的火花。

實際上我在這裡提到的指標, 會包含Accuracy、Precision、Recall 、 F1-score

正如前面講到, 機器學習的目標, 就是希望透過擷取到的資料特徵, 來預測目標的模樣, 那想當然我要知道模型(Model)好不好, 就會去判斷他預測的準不準, 而想知道準不準, 想當然就會像考試一樣, 每題都會有正確答案, 然後我們來看看模型預測的答案和我正確答案相差多少, 比如說, 我的正確答案是True ( O ), 而模型預測卻是False (X), 那他就錯了一題, 而 我的正確答案是True ( O ), 而模型預測也預測 True (O), 那他就對了一題。

有趣的是, 從以上我講的爛例子, 模型不一定預測都對, 有可能他預測是 True , 但實際答案是 False , 也可能他預測是 True , 但實際答案是 True , 綜合不同預測結果, 可以得到四種結果, 也就是混淆矩陣 Confusion Matrix。

實際 True實際 False
預測 TrueTP
(True Positive)
FP
(False Positive)
預測 FalseFN
(False Negative)
TN
(True Negative)
Confusion Matrix

如果還是很混淆, 不然用個很貼近生活的例子來看好了, 相信很多人經過一段時間的新聞洗禮後, 對這些詞都很熟悉才對….。

實際陽性實際陰性
快篩陽性確診 TP
(True Positive)
偽陽 FP
(False Positive)
快篩陰性偽陰 FN
(False Negative)
未感染 TN
(True Negative)
COVID快篩結果

在往下寫之前, 我們需要先搞清楚指標的用途, 在深度學習中, 指標往往是用來衡量一個模型預測的準確度, 而用準確度得到指標後, 我們的功課就會開始著重在怎麼樣去提升指標的數值。

假設今天我們將一群人抓過來逐個檢測, 一個是陽性(Positive), 一個是陰性(Negative), 在我們的測試結果就只有這兩種,再從中去抓出偽陽(Fasle Positive)和偽陰(False Negative) 的人, 最終就會形成像上面的圖, 也就是混淆矩陣(Confusion Matrix), 那綜合以上4種狀況, 我們可以得出幾種指標。

Accuracy, 算是比較常見的指標, 主要是把正確找到的陽性 (TP) 數量, 正確找到的陰性(TN) 數量, 兩者相加後, 來除以所有的檢驗個數, 公式如下;

Accuracy =( TPs+TNs ) / Total N.

換句話說, 假設今天檢驗100人, TP 有 20人, TN 有5人, 那 Accuracy 就是0.25。

超低, 算出來是這樣沒錯,只是要澄清, 這個超低主要是因為你有75人混在FP、FN裡面, 可見這預測模型是有問題的, 但這是一個最大而化之的方法, 而我們沒辦法從這指標去衡量偽陽(Fasle Positive)和偽陰(False Negative) 的狀況, 只能知道哪些陽性和陰性是真的被抓出來了, 只能去改善衡量的標準, 但沒法從根本去減少偽陽和偽陰。

換句話說, 今天你觀察模型的主要訴求是希望能抓得越精確越好, 那你就可以用 Accuracy 來做為衡量指標, 但因為模型任務不盡相同, 所以用 Accuracy 並不會是一個最完善的解法。

Precision(準確率)就會從另一個角度來看這4種狀況, 主要是把真陽性(TP)和偽陽(FP)的個數聯合起來做運算,公式如下:

Precision =( TPs) / TPs+FPs

這個指標先把真陽性(TP)去和真陽性(TP)和偽陽(FP)總和做相除, 說起來很混亂, 但是可見當Precision指標越來越大時, 代表模型預測到的偽陽性就越來越少, 趨近於1時, 代表偽陽的個數超級少, 也意味我們模型排除假陽性的能力強, 假設今天你想要改善或是觀察模型的假陽性狀況時, 就可以用這個指標做為衡量標準。

譬 譬如你要做一個人臉辨識的門鎖功能, 這時你就要思考怎麼把假陽性降到最低, 當降到最低時,才能有效避免門鎖誤辨認, 就放行讓他人通過。

Recall(召回率), 也是做了跟Precision相似的事情, 只是算式不同, 邏輯意義也不相同,在這裡主要是把真陽性(TP)和真陽性(TP)和偽陰(FN)相加去做相除。

Recall =( TPs) / TPs+FNs

在Recall裏面, 若是當FN越來越少時, 則指標也會越來越大, 也就是說, 真陽性的比例會越來越高, 指標越來越大時, 代表模型預測到的偽陽性就越來越少, 趨近於1時, 代表偽陰的個數超級少, , 也意味我們模型排除假陰性的能力強,假設今天你想要做的是改善模型的假陰性狀況時, 就會需要用這指標來衡量。

譬如你要評估一個模型能否有效抓出網路惡意攻擊時, 這時你就要思考怎麼把假陰性降到最低, 當降到最低時, 能找到的惡意攻擊自然是最有效的。

F1-score則又是另一個更進階的衡量指標了,主要是把Recall和Precision做加權平均,這樣的好處可以調和前述兩個指標, 因為若是 Recall、 Precision 其一偏小, 就無法同時兼顧兩種指標, 故進行調和後, F1的變化依然會在0~1之間, 而越趨近1 ,代表模型越穩健, 評估能力也越好。

F_{1}=2\cdot \frac{precision\cdot recall}{precision+recall}

淺談人工智慧和學習

休息了一小段時間, 總是該開始寫些我真正想要的東西, 當時選擇到研究所進修, 主要就是對深度學習這個領域相當感興趣, 也嘗試過自行摸索, 但總感覺就是少了些什麼, 後來我覺得, 也許就是少了一個有脈絡的學習吧?!接下來我會開始從比較細節的知識開始整理起, 畢竟這才是我真正想要從研究所帶走的東西。

先岔個題, 聊聊我曾嘗試做過的搞怪玩意兒, 我在前公司主要是負責產品研發, 那時我深深為人工智慧著迷, 所以我很想看看能不能在既有產品上加入點「智能」成分, 當時我負責研發的系統是BPMN流程服務, 那是一個基於工作流程而生的引擎服務, 你可以利用這工具來設計任何符合你工作環境需求的工作流程, 在您身處的環境中, 也許就是公文簽呈、製造流程等, 搭配ERP你可以做到出庫、投料甚至接單生產等自動化, 可以說, 流程引擎將串起你工作環境中的每個節點。

而我希望可以讓流程自動轉送到更正確的地方, 甚至於, 加速每個節點的處理速度, 於是乎, 我會開始記錄每個節點處理不同工作的效率和時間, 接著我會把這些紀錄做萃取和計算, 以此了解每個節點對這工作的重視度, 預測負責人的心理, 得出一套行為模式, 在引擎接到工作後, 以此行為模式來判斷該如何加快節點的處理速度, 避免無意義的閒置。

man wearing blue crew neck top
Photo by Startup Stock Photos on Pexels.com

綜合上述行為, 基礎的人工智慧, 不外乎就是以下這樣:

  1. 收集資料(Gathering data )
  2. 準備數據(Preparing that data)
  3. 選擇模型(Choosing a model)
  4. 訓練機器(Training)
  5. 評估分析(Evaluation)
  6. 調整參數(Hyperparameter tuning)
  7. 預測推論(Prediction)

當然人工智慧的領域相當廣泛, 從最廣最廣的層面來看, 就包含了「時間序列與預測」、「圖像辨識」、「音訊處理」、「自然語言處理」、「動態影像處理」等 。

時間序列與預測, 就是我最早最早做出來的土炮預測, 我們針對歷史數據作趨勢分析, 接著做預測分析、風險分析, 甚至推薦引擎等應用。

圖像處理, 則是專做靜態影像的處理, 最常見就是人臉辨識、圖像辨識和機器視覺等, 我也曾嘗試用CNN做了一個模型, 也曾達到不錯的效果。

音訊處理, 則是專做聲音資料處理, 每段聲音其實都有自己的波形, 而這波型就是一個特徵, 最常看到的應用就是語音識別、情感分析和語音搜尋等, 而我們常看到的Siri, 或是先前轟轟烈烈的「甘安捏」,也都有音訊處理的影子存在, 可以特別注意, 影片剪輯的都是同一人講的「甘安捏」。

自然語言處理則是專門處理字詞的領域, 甚至可以往下分為自然語言理解 (NLU), 自然語言生成 (NLG), 而NLU可以再往下分到情感分析、文章摘要, NLG則專注在文本生成。

動態影像處理, 想像一段動態影像, 他其實是由一堆的靜態影像處理, 但你得記住上一個動作和下一個動作的關係, 可以做到動態預測, 近期也有人開始做Deep Fake影像識別, 當然Deep Fake也是動態影像的一塊。

而人工智慧, 其實又不完全是真正擬人智慧, 往下還可分為機器學習和深度學習, 以下是我從網路上找來的介紹圖, 清晰且彼此的關係更能一目瞭然。

從上可以看到AI是個很廣很大的領域, 而機器學習只是其中一個分支, 深度學習則又是機器學習底下的一個分支, 再補充網路上找來的概要。

以下節錄自Wikipedia

Artificial intelligence (AI) is intelligence demonstrated by machines, as opposed to the natural intelligence displayed by humans or animals. Leading AI textbooks define the field as the study of “intelligent agents“: any system that perceives its environment and takes actions that maximize its chance of achieving its goals.

Machine learning (ML) is the study of computer algorithms that improve automatically through experience and by the use of data.

Deep learning (also known as deep structured learning) is part of a broader family of machine learning methods based on artificial neural networks with representation learning. Learning can be supervisedsemi-supervised or unsupervised.

簡單來說, AI就是透過機器去達到任何智慧化的目標, 這也是最廣泛的定義, 也是市面上最常見到的詞彙, 傳統上我們用Rule based來實現這個願景, 當然大多智慧化的工具也以此為基礎去發展,而將來我們力求越少Rule越好, 畢竟Rule是永遠寫不完的, 又或者說, Rule是很主觀的, 我們要怎麼讓Rule更客觀?

也就所以ML(Machine Learning)開始嶄露頭角, 就以上對機器學習(ML)的定義, 我們開始透過資料收集, 特徵分析, 來得到更好的Rule, 再用這些Rule來改善我們的工作, 在這裡最重要的特點, 就是我們用資料來驅動我們的方案。

那又為什麼有DL(Deep Learning)深度學習?因為我們希望可以減少特徵分析這個行為, 因為特徵分析是費時又費工的, 且也帶有一定的主觀成分, 故我們希望讓模型(Model), 基本上是多層的類神經網路, 來自動得到特徵, 並將特徵學習起來, 好作為預測依據, 當然深度學習又可以分為非監督式、監督式學習, 差別就在我們怎麼去提示模型取得特徵。

landscape man people sand
Photo by Kureng Workx on Pexels.com

綜合以上, 我的土炮嘗試是屬於機器學習的一環, 我利用傳統的方法把每個節點的使用歷程記錄下來, 然後設定一定的Rule來分析和萃取歷程, 在用分析萃取完的結果來預測這個節點將來要怎麼面對剩下的工作; 在進入研究所後, 我開始接觸深度學習, 並以自然語言處理作為研究主題, 往後則將開始記錄在這門研究上我需要用到的知識和技術。

我們要過的精彩, 肯定得充滿期待。