自然語言處理 (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)上,後面會隨著進度來更新。