中文自然語言處理整理

CHEN TSU PEI
NLP-trend-and-review
11 min readDec 8, 2019

從開始接觸自然語言處理(Natural Language Processing)也已經過了一年多了,我想藉由這篇文章來整理一些我學習的資源

更新時間: 2020/05/20

一開始,若是一個完全沒接觸過NLP領域的人,要怎麼開始呢?又該具備什麼樣?讓我們先來聊聊什麼是自然語言吧

自然語言顧名思義,所有我們人類日常生活中使用到「語言」的地方都是自然語言,包括文字、語音等,文字細分下去像是聊天訊息、論壇的留言、新聞、FB貼文,甚至在古文明中刻在石板的文字,也是自然語言,也有很多研究是關於古時候中國使用的文言文、詩詞等等。

在Line上發了一則訊息給朋友,這就是一個自然語言的場域,還有像是智慧音箱跟語音助理等,這些都是自然語言處理可以做到的應用。自然語言處理也可以是一種數據分析的技術,像是在批踢踢上討論熱度、假新聞的分析,只要是牽扯到「文字」「語言」的地方,基本上都能夠被處理,只不過是難易度的差別而已

學習材料

接觸一個新領域時,我們通常需要一些教科書來讓我們有系統地學習,在自然語言中,有兩本聖經級的課本是被大家所推崇的

  1. Speech and Language Processing(Jurafsky)
  2. Pattern Recognition and Machine Learning(Christopher M. Bishop)

不過,閱讀厚厚的原文書是相當累人的,可以先挑一些有興趣的章節,跳過較為艱澀的部分,搭配線上課程來學習,下面是我常常會去看的線上課程

  1. Machine Learning(Coursera, taught by Andrew Ng)
  2. CS224N: Natural Language Processing with Deep Learning(Stanford)
  3. 台大李弘毅老師的Youtube頻道

程式工具

程式的部分,我大部分都是使用Python來撰寫,在深度學習方面的套件及工具大部分也都是支援Python,這邊概略地介紹一些有名的套件

TensorFlow&Pytorch

在深度學習中,基本上就是分Tensorflow跟Pytorch這兩派,近期也都各自推出了新版本TensorFlow 2.0以及Pytorch1.3,我個人是喜歡使用Pytorch,因為它整體的邏輯跟Python較類似,也因此比較容易上手,大家可以找一個適合自己的學習

Google最近釋出一個 trax 的新框架,有興趣的人也能看看

Pytorch-lightning (*update)

pytorch-lightning是一個建立在Pytorch之上的框架,原本使用Pytorch讓我們可以制定模型,不過整個訓練的過程還包含像是Train, Evaluation, Test,還要處理各種超參數、使用GPU或CPU訓練,有些時候甚至還要考慮支不支援float16精度的訓練等等,使用pytorch-lightning讓我們可以制定好這些繁雜的步驟,讓我們可以更方便的訓練並使用模型,不過我目前還沒實際使用的經驗,有待使用過再回來補充

Numpy

Numpy是在Python中進行向量以及矩陣運算相當好用的工具,底層是由c語言所實作,記憶體用量及效能都比用Python內建的list來得好,如果是進行數值運算的話,使用numpy不會是錯誤的選擇,且Numpy跟Pytorch也有非常好的相容性,可直接使用numpy來創建Tensor,也能透過.numpy()轉換回去(tensorflow我較不熟悉)

想要更深入了解為什麼使用Numpy比內建的list好可以參考這篇優質文章

Pandas

Pandas是一個拿來處理CSV檔案常用的工具,在處理文字中常常需要跟CSV檔打交道,有很多資料集也是以CSV為形式,這時候可以考慮使用Pandas作為讀取的工具

scikit-learn

scikit-learn包含一些非監督學習的工具,像是PCA, TSNE等等,也有監督學習的工具像是 SVM

gensim

我使用gensim這個套件主要是它所支援的LDA模型跟word vector詞向量模型,通常訓練或者讀取預訓練的詞向量模型都會使用到這個套件

huggingface/transformers

近年來(2018~)ELMo, BERT, GPT相繼發表,儼然為NLP開啟了一個新的時代,huggingface為Pytorch的廣大使用者包裝好使用這些模型的介面,甚至也提供轉換TensorFlow Checkpoint成為可讀取的Pytorch模型的腳本,非常推薦能夠到huggingface的網站探索一下,除了BERT以外,目前也支援像XLNet, ALBERT, DistilBERT等更多大型預訓練模型

matplotlib

matplotlib是一個繪圖套件,在論文中見到的圖表像是折線圖、熱度圖、散佈圖等,常常都是藉由這個套件所繪製而成。除了matplotlib以外,像是plotly, tensorboard也是常見用於深度學習的視覺化套件

Jieba

Jieba是一個大家提到中文一定會提到的分詞工具,提供自定義詞表,是個簡單好上手的中文分詞工具,不過,中文分詞工具網路上可以找到很多種,誰的效果比較好是眾說紛紜,也有論文提出中文不分詞也能達到相當好的表現,大家可以視情況使用

OpenCC

OpenCC是一個用來繁簡轉換非常好用的工具,可以直接透過終端機指令來操作,裡面也有做一些中港臺不同用語之間的轉換,像是巴士轉成公車等,有了這個讓我們也得以使用各種簡體中文的語料了

經典論文

這邊主要是以我自己閱讀過的論文為主,難以兼顧到每個研究分支

LDA(2003): Latent Dirichlet Allocation — Journal of Machine Learning

Siamese Network(2005): Learning a Similarity Metric Discriminatively, with Application to Face Verification

Word Vector(2014): Distributed Representations of Words and Phrases and their Compositionality

TextCNN(2014): Convolutional Neural Networks for Sentence Classification

S2S(2014): Sequence to Sequence Learning with Neural Networks

ConvS2S(2017, Facebook AI): Convolutional Sequence to Sequence Learning

Transformer(2017, Google): Attention is All You Need

ELMo(2018): Deep contextualized word representations

BERT(2018, Google): BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

Transformer-XL(2019, CMU, Google Brain): Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context

以上這些論文,是我個人主觀認為經典的好論文,像是2014年的詞向量,提出之後讓我們可以基於預訓練的詞向量來進行下游任務,是非常大的突破,而Seq2Seq則是為文本生成開啟了序章,尤其是在像是機器翻譯或者QA問答中是非常重要的里程碑。其他還有相當相當多的重要且經典的論文,雖然我沒有列在其中,但大家還是可以視研究需求去閱讀,像是Distilling蒸餾模型、CRF條件隨機場、Dropout、Pointer Network等等,這個領域其實說來博大精深,有語言學的觀點(像是文法樹、Propbank),有統計的觀點,有機器學習的觀點,也有深度學習的觀點,要說是說不完的,就視每個人的研究需求去學習!

應用展示

看到這邊你可能想說,我都還沒開始,你用那麼多文鄒鄒的術語我怎麼懂?這個小節讓我們實際看一下NLP可以有什麼應用,跟目前能做到的程度

推薦的網站

有許多成熟的企業或網站,將他們的成果整理得很好來展示,可以直接在網路上線上試試很多NLP的功能,對於初學者來說,可以先看看實際上NLP個個任務所做出來的成果會是如何?這邊列出幾個我較為熟悉的

OpenAI

OpenAI致力於發展各種AI的應用,近年的有名的GPT2就是他們所提出的,GPT2堆疊了好幾層的解碼器(Decoder),在自動產生文本上達到非常好的效果,曾經一度OpenAI還不敢釋出模型,因為害怕會被拿來惡意使用,不過現已經釋出最大的模型(GPT-2-large)

AllenAI(AI2)

AI2也是一個相當知名的NLP研究組織,在他們網站上也提供DEMO可以體驗各種成果,像是閱讀理解(Reading Comprehension)、指代消解(Coreference Resolution)等等,AllenAI也發表過多篇知名的論文,像是:Deep contextualized word representations,非常建議可以去讀看看

Huggingface.co

前面我們也有提到huggingface.co所提出的transformers套件,我對他們的認識是從去年底開始,由於他們編寫了Pytorch版本來使用Transformer、BERT這樣的模型,迅速打開知名度,目前他們也提供了很多成熟技術的Demo。另外,他們有一間子公司Sam:),主要是提供旅遊助理(Travel Assistant)的服務,是非常值得參考的聊天機器人案例,可以到他們的官方網站了解更多

中研院 CKIP LAB

如果想看一點中文的案例,台灣在NLP上也是有相當多成果的,在中研院CKIP LAB也有提供DEMO像是中文實體判別(Chinese NER)、中文斷詞系統(Tokenization)等

騰訊AI LAB

中國在自然語言處理這塊,是不可忽視的一大巨人,近年來可在各大Coference上看到他們很多研究成果,騰訊AI LAB雖然沒有提供DEMO網頁可以參考,但可以看到他們的一些研究成果,像是我Review的這篇論文。值得一提的是,在聊天機器人這塊領域,也許是因為中國市場很大,需求也多,如果是研究這方面的可以多往中國的論文或資源去找

資料集

巧婦難為無米之炊,對於NLP的研究者來說,文字就是我們的米

自然語言中,雖然算法、模型很重要,但沒有資料驅動還是什麼都做不了,尤其是文字不像圖片一樣不分國界,每個地方用的語言不同,所需要的資料也就不同,英文因為是世界語言,加上論文的發表大部分以研究英文為主,所以資料當然是最多,不過幸運地,中文的語料也算蠻多的,這邊列出幾個好用的中文資料集或預訓練模型

NLP-Chinese-Corpus

NLP_Chinese-Corpus 是在github上由brightmart開源的中文語料統整,裡面包含了一些維基百科、新聞、社區問答等語料,比較多是通用型的中文語料,可以當作詞向量訓練的材料,或者其它應用

PTT-Gossiping-Corpus

PTT-Gossiping-Corpus是由zake7749在github以及Kaggle上提供的繁體中文問答語料集,一個問句對應到一句鄉民回答,對於想實作中文Sequence2Sequence的朋友,會是蠻不錯的實驗語料

圖片截自zake7749/Gossiping-Chinese-Corpus 中的範例說明

Wiki-corpus

繁體中文的語料,通常就會想到PTT以及中文維基百科,而現在獲取中文維基百科的手段有很多種,維基百科本身也有提供API,大家可以視個人需求來拿到資料

Tencent AI LAB

騰訊AI實驗室非常佛心的釋出相當多有用的中文資料集,像是Dialogue Research中包含一些在聊天機器人領域上實用的中文語料,有興趣的朋友可以參考我這篇論文的介紹:Improving Open-Domain Dialogue Systems via Multi-Turn Incomplete Utterance Restoration

此外,騰訊AI也有提供預訓練的中文詞向量模型,有興趣的朋友也能試試看

BERT

BERT就像詞向量模型一樣,需要大量的語料進行預訓練,好處是我們這種一般大眾可以直接使用一些科技巨擘所釋出的預訓練模型,像是Google, HuggingFace, 還有一些開源的github項目都有提供中文的BERT預訓練模型

結語

如果你很努力地看完這篇文章,但裡面有太多東西記不起來的話,沒關係!直接開始動手做吧!也許可以從最簡單的中文文本分類開始,遇到卡頓的地方也許這篇文章提供的一些資源或建議可以成為你參考的方向

這篇文章雖寫得有點倉促混亂,不過大致上我把一些常用到的工具以及重要的知識都盡量寫進文章了,若有遺漏也歡迎大家補充,之後這篇文章一定還會持續修訂,我希望能夠以概論的感覺能夠提到各個任務下的基本理論。如果文章裡面有寫錯的地方或者大家有想補充的點,也歡迎留言或寄信告訴我!

--

--

CHEN TSU PEI
NLP-trend-and-review

這邊停止更新了!麻煩移駕到https://tsupei.github.io,有持續更新更多NLP的文章唷!