(閱讀心得)Analyzing Political Parody in Social Media

這篇文章收錄於ACL, 作者是Antonis Maronikolakis, Danae Sanchez Villegas, Nikolaos Aletras , 第一作者Antonis MaronikolakisCenter for Information and Language Processing, LMU Munich, Germany服務, 其餘第二作者, 服務於Computer Science Department, University of Sheffield, UK , 第三作者是Daniel Preotiuc-Pietro, 服務於Bloomberg, 本文僅為個人閱讀後分享, 並加上個人看法, 若有侵權請告知。

原論文詳見https://arxiv.org/abs/2004.13878

本文發表的比較早, 詳細時間應該是2020年, 對比2021、2022提出的應用, 難免較顯微簡單, 而本文的啟發點, 應該來自於Bloomberg, 也就是大名鼎鼎的彭博社, 因為我早期對於判斷假新聞、假消息, 有濃厚的興趣, 故針對這類型文章做了些閱讀, 至於在這方面的應用有什麼優缺點, 則容我以下敘述。

Introduction

Parody是一個歷史悠久的藝術活動, 人們透過裝扮、模仿知名人物的語氣、外表, 說一些不是知名人物會講的話, 表現在電視節目、卡通、漫畫等, 來嘲諷或是幽默一下, 現今, 很多電視節目上都還有類似的表演, 譬如台灣的全民大悶鍋; 相同的, 在Twitter也有類似的活動, 人們會創一些帳號, 並假裝是知名人物譬如川普、歐巴馬等, 時不時依照新聞或是現況發表些搏君一笑的twit, 本意就是為了幽默而已, 或許很難想像, 基本上這些發文都會屬於非正式、天馬行空的言論。

相較於知名人物如川普、歐巴馬等人的發文, 若是正式帳號, 往往會採用比較正式的敘述和文筆, 來陳述理念或是對於現實的想法。

當然在Twitter上, Parody帳號和正式帳號是會做一些區隔的, 譬如Parody帳號通常會用Parody結尾, 如ObamaParody_, 或是像nicedonaidtrump, 會在帳號介紹時註明自己是Parody帳號, 否則就會被Twitter刪除。

而本篇論文主要是做些牛刀小試, 希望能透過資料訓練, 用來判斷Parody帳號和正式帳號的發言, 如同前面提到, 兩者帳號發文文體通常有一定差距, 故特徵比較明顯, 是有機會分辨的。

當然, Parody的本意只是為了搏君一笑, 希望不會有人出來賞巴掌。

Parody和Real帳號的發言差別

Task & Data

在本文, 作者也是用了相當簡單明瞭的做法, 應用Twitter提供的資料集, 直接了當地坐了二分類, Parody和Real, 接著進行訓練、驗證和訓練, 基本上都是以80/10/10的方式來切。

此外也做了幾種差異比較, 算是承上, 再往下延伸, 分別依照帳號性別、所在地區來做資料切分, 之所以會這樣做是因為Parody這事情是很多人都會想做的, 譬如俄國人會想坐美國總統的嘲諷, 美國人想做俄國人的。

這裡的地區切分, 是以帳號主人的所在地做切分, 假定你今天申請的是美國總統的Parody帳號, 但你是台灣人, 則你的文章是歸類在台灣(RoW, 英美以外國家), 之所以會這樣切分, 是考量不同地區的人, 文法不盡相同。

另外有趣的是, 也依照性別切分了資料集。

Predictive Models

以下用了幾個模型, 來做訓練和驗證。

  • Linear Baselines
    • LR-BOW
    • LR-BOW+POS
  • BiLSTM-Att
  • ULMFit
  • BERT
  • RoBERTa
  • XLNet

Results

以下是訓練和測試結果, 可以發現RoBERTa 分數最高, 這是可以預期的, RoBERTa是BERT的改進版,通過改進訓練任務和資料生成方式、訓練更久、使用更大批次、使用更多資料等獲得了State of The Art的效果, 換句話說, 就是用更大量、更久的訓練, 讓模型學了更多詞彙。

另外作者嘗試了用男性文章的資料集, 去驗證女性文章的資料集, 除了分數依然是RoBERTa最高外, 可以發現如此切換, 並沒有發現太多的差異, F->M, 指的是用女性文章訓練, 驗證男性文章, M->F則相反, 這裡也可以得到一個結論, 在網路上的文字表述, 男女其實沒有太大的差異, 故也反映在分數上。

倒是當用地區別來訓練Model, 然後再進行驗證時, 明顯可以看出一些差異, 且確實表現在BERT、RoBERTa和 XLNet之上, 這也說明了英美地區、和其他地區發文的用字遣詞是有差異的。

Error Analysis

本文提到的方法, 簡單粗暴, 並且稍微比較了一下幾個差異, 但也點出了單純用Model來區分Parody的缺陷, 以下為例, 歐巴馬的官方發文通常不甚正式, 而Model也因此沒法分辨出其文章和Parody文章的差別。

另一個例子, 當Parody的發文文體比較正式, Model也無法分辨出和正式文章的差異。

簡單來說, 想要透過單純Model來分別文體, 通常需要建立在兩分類具備一定特徵, 而且需要有一定差異, 才能獲得不錯的效果, 另一方面, 如果把Model加大、加強或許是可行的, 但卻是一條無止盡的路, 因為人會演化, 廢文也會越來越不容易察覺。

(閱讀心得)MSˆ2: A Dataset for Multi-Document Summarization of Medical Studies

這篇文章收錄於EMNLP 2021, 作者是Jay DeYoung,  Iz Beltagy,  Madeleine van Zuylen,  Bailey Kuehl,  Lucy Lu Wang , 第一Jay DeYoung於Northeastern University服務, 其餘都是第二作者, 服務於Allen Institute for AI , 本文僅為個人閱讀後分享, 並加上個人看法, 若有侵權請告知。

原論文詳見 https://arxiv.org/abs/2104.06486

Introduction

本文屬自然語言處理(NLP)類應用, 基於醫學領域撰寫, 並以文獻探討中的Systematic review發想, 嘗試將多文本摘要(Multi-Documents Summarization)應用到Systematic review之上, 透過訓練, 讓模型可以做多文本摘要, 而後用模型(Model)來取代原本的Systematic review工作。

何謂Systematic review?在醫學領域, 系統綜述(Systematic review)是文獻探討的一種,針對特定研究主題的所有報告、文件蒐集整理起來,並將之識別、評論, 主要是了解和主題相關的概念、理論、研究方法、實證資料,讓研究人員可以進行引用、思考、批判和評估; 然而, 做系統綜述需要花費大量時間研讀,每篇review約莫需花費1-2年時間, 甚至最長到8年; 也就所以, 作者嘗試減少在這類工作上所需花費的時間成本。

簡單說, 系統綜述(Systematic review)本質就是把相同研究主題的文章, 透過人工去整理, 歸納後, 產出一篇文章, 內容記錄和此主題有關的回顧和探討, 也就所以文章上會引用、引用多篇不同來源文章。

Dataset

在本文中, 首先需整理資料集, 而作者使用的手法是採用前人已經做好的Systematic review, 來反推出每篇綜述引用、摘要的文章, 每篇Systematic review都引用一篇到多篇文章(Documents), 透過整理, 完成了擁有來源文章(Documents)、摘要結果(Systematic review)的資料集, 用以訓練、驗證、測試模型的訓練狀況。

在本文中, 用REVIEW表示既有的系統綜述(Systematic review), 用STUDY表示引用、依據的研究文章,是意圖如下, 可能有點醜。

使用幾個步驟來找出合適的REVIEW作為資料集

  1. 在Semantic Scholar上找出title或是abstract含有” systematic review”關鍵字的文章, Semantic Scholar Allen Institute for AI開發並於2015年11月公開發布的人工智慧支持的學術出版物搜索引擎, 它使用自然語言處理方面的先進技術為學術論文提供摘要。
  2. 只保留有在PubMed 收錄, 且是生物醫學領域的文章 ,PubMed是主要用於檢索MEDLINE資料庫中生命科學和生物醫學參照文獻及索引的免費搜尋引擎。本系統屬於美國國立衛生研究院下屬的國家醫學圖書館維護的Entrez資訊檢索系統的一部分。 自1971年至1997年,MEDLINE資料庫主要通過大學圖書館等學術機構存取。
  3. 找出這些文章引用的研究文章, 但只保留研究類型為臨床實驗之類的文章(MeSH), MeSH的介紹可以參考此連結, 主要是PubMed提供的查詢規則。。
  4. 使用分類模型, 再做一次過濾。

基本上可以看到前4個步驟, 除了交代資料來源外, 再來就是盡量篩選資料, 清洗資料後, 並透過控制研究主題、類型, 讓文章維持一定的品質, 再來MeSH則是要反查出引用的文章, 在做完上述動作後, 再用第5步驟的分類模型篩選, 會剩下20K 的Reviews, 也就是20K左右的摘要文章。

往下講到第5步驟, 透過分類模型篩選文章, 再次過濾, 篩選合適的Review

  1. 5個相關背景的學生從220 review abstract中標記3000個句子,標記成9個類別。
  2. 2個相關背景的學生針對上述標記再做一次校正。
  3. 類別標記中, 研究問題,是為BACKGROUND; 研究結果是TARGET, 不相干的或是太細節資訊的則為OTHER, 是將文章內的句子大略分為9類, 但在訓練時只留下3類, 可以減少訓練時的複雜度, 和花費的時間。
  4. 使用SciBert進行Fine-tune後, 得到一個分類用的Model,並用Model來標記剩下的資料集(20K), 也就是說接下來把每篇文章內的句子丟進Model分類, 可以得到每篇文章中, 每段句子屬於哪一類, 當然文章會先被移除掉贅字, 連接詞等, 然後分句進行預測。

承上, 作者發現, 模型在分辨BACKGROUND時的F1則是94.1, 效果很好, 可以直接使用; 分辨TARGET的F1則是77.4, 效果較差, 會影響資料集的可靠性, 所以另外以人工對剩下資料集(2K)進行校正。

BACKGROUND、OTHER、TARGET的範例

而作者如何進行篩選呢? 作者在170K個REVIEW中挑出220 篇來做為訓練樣本, 但為了避免資料量過大, 作者選擇只用了文章的abstract來標出訓練資料, 接著用訓練完的Model去篩選剩下的每篇REVIEW, 若是文章都沒找出分類為TARGET的句子, 則直接捨棄, 主要是考量若文章內沒有分類為TARGET類型的句子, 則代表該篇文章可能沒有結論、或是結論和原本的訓練文章相差過遠。

以此脈絡來看, 一開始用來標記句子類型的REVIEW, 必須具備一定的代表性, 且最好有不同的敘事句型, 這樣才能確保Model預測可以更精準更多樣化。

Experiment

接著開始訓練摘要模型, 承上, 我們已經用分類模型找出文章裡面屬於BACKGROUND、TARGET的句子, 故在此會用分類模型來把剩下文章內的BACKGROUND、TARGET句子都找出來, 在訓練摘要模型時, TARGET是主摘要目標, BACKGROUND則是輸入的多文本, 而為了讓輸入更複雜化點, 每個BACKGROUND會串接上該句子所在的文章Abstract, 這樣的好處是可以讓模型學到更多變化形態的句子, 而這些句子都會指向同一個摘要TARGET。

但是問題來了, 不同REVIEW是可能對應到多篇文章的, 以上述規則來做, 也就所以, 不同的TARGET, 有機會對應到同一篇BACKGROUND串接上該句子所在的文章Abstract, 這意味著一篇文章可能對應到兩種REVIEW上, 這對現有模型來說, 是會影響最終判別結果的。

在本文則用了兩種Model來訓練分類模型, 以前面論點來說, 一般BART上, 訓練資料互相影響的問題會比較嚴重, 而用LonformerEncoderDecoder(LED), 透過比較大的輸入維度, 則把一個BACKGROUND串接多篇有關的文章, 加入訓練, 各文章間相互影響會比較小, 相反的, 各文章間反而可以相互認識, 效果會更好, 多樣性更好。

訓練摘要模型的兩種方法

然而實際訓練出來的效果卻沒相差太多, 推測, 也許是因為各文章Abstract的文字數量不一致, 反而重點更混淆了? 詳細可能性需要再想想。

在本文原本提出的方法, 是想希望可以訓練一個模型, 並產生一篇摘要, 且可以正確產生多樣論點, 這是個很有趣的議題, 因為現行摘要的手法多會產生同一種論點的議題, 這是基於詞彙、詞頻計算得到的結果, 以現有框架來說還有一段路要走, 故本文最後放棄多樣相異論點這件事情, 選擇釋出資料集, 在後面, 多樣相異論點這議題, 仍會有一段路要走。

最後附上資料集的截圖, 如有需要引用資料集, 請到原文詢問作者。

綜合以上, 本文最後的摘要分數其實不差, 關鍵在於資料清洗階段, 作者就用分類模型把容易造成混淆的REVIEW清洗掉了, 而標出了BACKGROUND, 建立起兩端關聯, 也提升了摘要的精準度。

Structured form

本文還提到另一種思路, 我個人覺得很有趣, 以傳統的文本摘要來說, 我們評估的手法是用Maximum Likelihood Estimation(MLE), 計算摘要在原文摘要中出現的概率, 藉以得到一個值, 也是目前最常用的計算方法, 乍看下合理, 但實際上, 摘要在原文摘要中出現次數多, 並不代表他能精確抓到原文摘要的內容, 充其量只能說Model做摘要時有摸到這個點, 但未必能精準表達出原文精隨(聽起來真玄)。

於是本文提到一個論點, 參考Nutribullets Hybrid: Multi-document Health Summarization想法, 一篇文章是否可以轉為由幾個關鍵字組成的結構格式呢? 換句話說, 就是把一篇文章, 轉換成像表格一樣, 在此概念下, 文章內的句子可以轉為切成各個顆粒, 而每個顆粒可以分為P、I、C、O, 這樣的手法, 若應用在固定敘事格式的文章上, 或許是個不錯的方法。

  • P, Population: who is studied?
  • I, Intervention: what intervention was studied?
  • C, Comparator: what was the intervention compared against?
  • O, Outcome: what was measured?

Evidence Inference, 摘要衡量指標

經過這轉換, 每篇文章、摘要, 都可以被轉換成許多組的P、I、C、O, 而這個轉換的過程, 本文是借重Evidence Inference 2.0: More Data, Better Models的Model和Dataset, Dataset是找出可以被歸類為P、I、C、O的關鍵字, Model的部分, 則是一個預訓練模型, 主要是評估P、I、C、O的關鍵字, 是屬於哪個分類, 分類共有increases, no_change, decreases }等3類。

值得注意的是, 在文章內實際會用到的關鍵字組合, 只有I、O, 主要是P, who is studied對於摘要結果影響不大, 意思是說美國學者、台灣學者研究出來的結果一樣重要; 而C, what was the intervention compared against? 加入後, 基本上就不容易切詞、分辨, 故作者捨棄了這兩分類。

故作者用PICO把文章結構化之後, 基本概念如下圖, 從輸入、輸出到實際摘要, 都可以轉為PICO格式。

PICO在文章轉換示意

作者提出一個評估指標, 以摘要模型產生出來的REVIEW, 和實際預期REVIEW, 都能萃取出符合PICO格式的集合, 接著用PICO分類Model, 去計算這些集合會落在哪個分類中, 譬如increases, no_change, decreases }等3類, 並表示為(1,0,0), (0,1,0),(0,0,1); 生成摘要的I/O Pairs(Q), 和真實摘要的I/O Pairs(P), 計算Jensen-Shannon Distance (JSD). 越小越好, 代表PQ距離越相近。

值得思考的是, 如果依賴PICO的規則, 則產出的摘要, 將會很大程度依賴其準確度, 在實際應用上, 是否能切確表達出真實意涵, 依舊無法說得準, 且PICO的分類模型將會決定摘要品質, 但可以確定是摘要結果將會更往關鍵字推進, 而非仰賴抽象化的摘要文字。

Table-to-table task

以前述為基礎, 作者延伸思考, 若是PICO可以衡量摘要和真實摘要(Ground Truth)的之間的距離, 那是不是也能衡量STUDY和REVIEW的距離?也就所以往下提出了分別對摘要前文章、摘要結果個別做PICO後, 再去計算兩者距離, 並產出了以下結果, 但是和我前述想法一樣, 產出結果受到PICO規則影響, 但作為一個度量標準, 是有可能實現的, 也能某個程度體現STUDY和REVIEW間的關係, 這樣的做法某程度上也是MLE, 只是轉換成用關鍵字製成的表, 再用表去計算兩者相進度而已。

最後總結作者提出的幾個要點如下:

  • 雖然生成摘要很通順,也符合主題,但和正確摘要的方向並不理想。
  • 指代問題和PICO的萃取情形,限制了Model在文章上標記的正確性。
  • 摘要的評估指標是個不容易解決的問題, 即便把摘要結果先做分類後再計算, 仍顯不夠真實。

而PICO的標記法, 仍受到指代問題影響, 此外本文提出的手法, 可以有效應用在固定格式和陳述手法的文章, 例如學術研究文章, 但若是要做到更廣幅度的辨認, 則需要應用Retrieval的方法, 才有機會做到 Open Domain文章的處理;此外相異論點的語句仍是一個挑戰, 且面對相異論點, 如何做到兼容, 並產出同時闡述兩論點的結果?

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

使用Python實作Image Enhancement

趁著學期告一段落,工作也在過年前的休息時間,趕快把之前的作業整理出來;這篇文章依然會是先前的影像處理課程所編寫的作業,在這裡不會用到深度學習或機器學習,而是使用傳統的影像處理概念來做,目的是為了瞭解原理。

本篇文章主要是探討如何通過二階微分,將影像邊緣強化。

  • 主要演算法
    1. 原圖雖然用的是彩色影像,但我在程式中有轉為灰階,所以實際增強是針對灰階影像增強。
    2. 把原影像先乘Laplacioan運算子做二階微分,可以得到影像的邊緣。
    3. 接著和原始影像相加,邊緣會被加強,但是因為原圖的雜訊也被放大,所以這裡的圖是有雜訊的加強,得到圖A。
    4. 接著原始影像用Sobel對X和Y做一階微分,可以得到影像邊緣圖B,接著對圖B做去雜訊。
    5. 再來把圖B的像素做標準化,每個像素會被做成0~1的數值,此時在平坦區(比較亮的地方)數值會較大,趨近1,邊緣(比較暗的地方)則趨近0。
    6. 我們把標準化的矩陣和圖A相乘,可以知道原圖依照比例被放大了,原先暗的像素方又變得更黑了,非邊緣的地方則會因為乘趨近1的值,故不太有大變化,結果我們會得到圖C,圖C就是加強後的結果。
  • 程式片段
    1. 先把圖片轉成灰階影像。

2. 定義Laplace運算子遮罩

3. 定義Sobel運算子遮罩,0是dY,1是dX

4. 定義Slide Window Filter降噪

5. 對原本影像乘Laplace運算子,二階微分得到邊緣,接著和原圖相加。

6. 把微分後結果和原圖相加,得到一張銳化的圖。

7. 接著對原圖做Sobel運算子,一階微分先做dX再做dY,然後用OR合成,也可以得到一張圖的邊緣。

8. 接著用Slide Window filter把雜訊降低。

9. 最後我們把這結果做標準化,取得一個0~1的矩陣,然後把矩陣和步驟3的圖相乘,圖的暗部被放暗,亮度則不太改變,因為暗部被變暗了,會感覺到邊緣變得銳利。

  • 測試資料與結果
    1. 原圖,將他模糊後轉成灰階。

2. 做Laplace運算後得到邊緣。

3. 和原圖相加,但感覺到雜訊也放大了

4. 對原圖X、Y做Sobel微分後,做合成,得到一個較為銳利的邊緣。

5. 使用Slide Window Filter把雜訊去掉。

6. 接著把模糊後結果乘上前面的圖,得到邊緣增強的結果。

  • 討論
    1. 把Sobel微分後的結果做標準化後,再乘上和二階微分後的圖,可以有效讓暗部變暗,因為標準化結果介於0~1之間,亮部*1~0.5之間,只會感到些許變暗。
    2. 但是這樣的方法會讓原本的圖變得比較暗,暗部變的更暗,邊緣會更明顯,但亮部受到乘數影響,也明顯感覺到變暗。
    3. 依據課堂上提到一個好處,我們把邊緣做模糊消去雜訊後再做標準化,因為雜訊已經被去掉了,最後再去和圖相乘,可以避免雜訊放大。
    4. 延伸一個思考問題,若是我們處理彩色影像時,對R、G、B個做一次上述步驟的處理,是否也能把彩色影像的影像做增強呢?