NLP任務概覽
本文為臺灣大學李宏毅老師視頻課程筆記。本課程介紹了 (2020年)NLP 領域常見的 17 種任務。本文只會從輸入輸出的角度概覽多種 NLP 任務,并簡介它們的常見做法,并不會細致地介紹每個任務模型的具體細節。
兩種模式與任務分類
NLP 是一個很廣闊的研究領域,有許多種任務。但是如果簡單地按照它們的輸入輸出來看的話,無外乎以下兩種模式:
- 輸入文本,輸出文本
- 輸入文本,輸出類別
以下我們分別介紹兩種模式種的任務。
輸入文本,輸出類別
輸入文本,輸出類別這一大類又可以分為兩類。第一種是輸入一段文本(token 序列),然后模型輸出一個類別,表示這段文本整體是某種類別。第二種是輸入一段文本(token序列),模型對輸入的每個 token 進行分類,輸出多個類別。
如今,不管是第一種還是第二種,“輸入文本,輸出類別” 這一大類 NLP 任務,通常是用 BERT 模型及其變體來做。
輸入文本,輸出文本
對于輸入文本,輸出文本這一大類,最直覺的想法然就是用 seq2seq model 了。
這里有一個需要注意的點是 NLP 中有的 seq2seq 任務(如摘要等)可以在編解碼器之間加一個 copy mechnaism,允許輸出直接從輸入中 copy 一些內容。
多輸入
之前介紹的都是單輸入的情況,但是在很多任務中,也會有需要輸入多個文本的情況,這時該怎么做呢?常見的做法也是有兩種。
第一種是分別用兩個網絡來處理兩個文本,然后再用一個網絡將他們的輸出進行融合,這兩個網絡之前通常也會加一個注意力機制。
另一種更加直接的做法在近年來比較流行。即將兩個文本直接輸入同一個網絡,但是在他們中間加一個特殊的 token (如圖中的 <SEP>
),以示分隔。
NLP任務匯總
綜上集中分法,可以將 NLP 的任務分為以下 8(+1) 類。接下來,我們將分別介紹表格中的任務。
前處理相關
Part Of Speech (POS) Tagging
將輸入的文本句子中的每個詞語都標注上詞性(動詞/形容詞/名詞)。
輸入:文本
輸出:每個 token 的類別
為什么需要考慮句子中詞語的詞性呢?考慮下面這個句子,句子中出現了兩個 saw,但是它們的詞性明顯是不一樣的,前者是看見,動詞;后者是鋸子,名詞。如果在進行其他下游任務(如翻譯等)之前,就能識別出每個單詞的詞性,作為附加信息輸入到下游任務網絡,無疑會改善網絡的性能。因此,POS 經常用作前處理。
Join saw the saw.
但是,在今天,下游任務模型越來越強大。因此,可能下游任務模型本身就可以自己隱式地進行 POS,作為顯式的前處理的 POS 過程可能已經不再需要了。
Word Segmentation
分詞是中文自然語言處理中很重要的一項任務,因為中文單字本身并不是詞語,我們需要將單字組成的句子劃分為多個詞語。
輸入:文本
輸出:每個 token 的類別
從輸入輸出的角度來看,分詞就是輸入一個文本,輸出每個 token 的類別。這里的類別通常就是一個簡單的二分類,Y 表示當前 token 是一個詞語的結尾,N 則表示不是。
與 POS 類似的,分詞在以前也經常作為下游任務的預處理過程。但是在下游模型越來越強大的今天,分詞預處理也通常不再需要了。
分詞還存在一個問題,就是同一個句子可能有多種不同但是都合理的分詞方法。
Parsing
句法分析(Parsing)有兩種形式,分別是成分分析(constituency parsing)和依存分析(dependency parsing)。它們在輸入輸出形式是一致的,都是輸入一個句子,輸出一個樹。
Parsing 的輸入輸出形式比較特殊,不在我們提到的兩種模式之中。
Parsing 與以上二者類似,經常作為前處理的步驟。但在表達能力更強的大模型時代,單獨進行 Parsing 作為前處理似乎也沒有必要性了。
Coreference Resolution
指代消解是要找出文本中的哪些詞匯指的是同一件東西,尤其是代詞(如 he,she,it 等)所指代的實體。
舉個例子,考慮以下文本:
Paul Allen was born ion January 21, 1953. He attended Lakeside School.
指代消解就是要識別出句中的 ‘Paul Allen’ 和 ‘He’ 指的是同一個人。當然,這是最基礎的指代消解,還有更多更復雜的情況就不一一列舉。
指代消解的輸入輸出形式也比較特殊,不在我們提到的兩種模式之中。
指代消解也常被用作前處理。
Grammar Error Correction
語法錯誤糾正是指對于輸入的含有語法錯誤的句子,模型輸出修改后的正確的句子。
輸入:(可能含有語法錯誤的)文本
輸出:(正確的)文本或修改方式
語法錯誤糾正乍看起來好像任務的形式稍微有點麻煩,因為句子的長短、句子的錯誤類型、修正的方式都有很多種。但實際上,主流的做法是直接將它作為一個 seq2seq 的模型來訓練就好了,輸入有錯誤的句子,輸出正確的句子。
當然,模型也可以輸出對應的修改方式。只要設定一些類別,比如將某個詞刪除/替換,或者在其前后增加某個詞,語法錯誤糾正就成了一個分類的任務。輸入一段有語法錯誤的文本,輸出每個 token(單詞)對應的類別。
輸入文本輸出類別
Sentiment Classfication
情感分類,是指輸入文本,模型輸出這段文本情感是正向的還是負向的。
輸入:文本
輸出:整個文本的類別
是典型的對整個文本進行分類的任務。常用語網絡評論的分類。
Stance Detection
立場檢測,是指給定一個文本和另一個對該文本回復的文本,判斷回復文本對原文本是什么態度。
輸入:兩個文本
輸出:態度(立場)類別
常見的態度有 Support、Denying、Querying、Commenting(SDQC)。
例子:
原文本:李宏毅是個型男
回復文本:他只是個死臭酸宅
在這個例子中,回復文本對原文本的態度就是 Denying。
立場檢測可以用于 Veracity Prediction。
Veracity Prediction
真實性預測,是指給定一個文本,然后模型來判斷這個文本描述的內容是否真實。
輸入:文本(和其他相關文本)
輸出:整個文本的二分類
當然,只看一個文本本身很多時候并不能對其真實性作出判斷。我們通常需要給模型更多的相關信息。
比如下圖中,我們要預測一個 post(網絡po文)的真實性,我們可以提供給模型該 po 文的回復、與該 po 文相關的百科內容等。這里給的回復信息,就可以用上面的立場檢測來判斷其對原文的態度是支持還是否定。
Natural Language Inference
自然語言推理,是指給定一個陳述,再給一個假設,然后基于陳述判斷這個假設是否成立。
輸入:兩個文本(一個陳述和一個假設)
輸出:分類結果
常見的類別有 contradiction(矛盾)、entailment(蘊含)、nertral(中性)。
在下面的例子中,給定的陳述是 “一個人騎在馬上,跳過了一架斷掉的飛機”
給出的假設有三個:
- “一個人在餐館中”,這明顯是不太可能的,一個人在跳飛機,怎么可能同時在餐館中呢。因此應該輸出 contradiction
- “一個人在戶外,騎在馬上”,這是很可能的,因為騎在馬上,大概率是在戶外。因此應該輸出 entailment。
- “一個人正在訓練他的馬,準備參加比賽”,這一條不好判斷,因為雖然確實人是在騎馬,但具體動機無法判斷。因此應該輸出 neutral。
Search Engine
現代搜索引擎當然是很復雜的一個系統,但是如果只從 NLP 模型輸入輸出的角度來說,它基本的能力就是判斷兩個輸入文本的語義是否是相近的。
輸入:兩個文本
輸出:類別(是否相近)
輸入文本輸出文本
Summarization
NLP 中的摘要任務分為兩種,分別是 Extractive 和 Abstractive。
Extractive Summarization
抽取式摘要比較簡單,從原文中選取一些句子作為摘要即可。
輸入:文本序列
輸出:每個 token(句子) 的類別
抽取式的文本摘要的輸入輸出形式很簡單,輸入一篇文章,輸出其中每個句子是否要被抽取作為摘要的二分類結果即可。
很明顯,抽取式摘要的任務比較簡單,但是摘要的質量會也比較差。在中小學做語文摘要作業時老師就警告我們說不要照搬原文中的句子,而要自己總結。
Abstractive Summarization
生成式摘要是指模型不要從原文中照搬句子,而是要看過全文之后用自己的話來對文章進行總結。
輸入:(長)文本
輸出:(短)文本
這是更難但是更有意義的任務。從輸入輸出上來看,輸入一篇文章(長文本),模型要輸出一段摘要(短文章),是典型的 seq2seq 的任務。
需要注意,即使是生成式的摘要,大部分關鍵詞也是來自原文文本的。因此,使得模型能夠直接從輸入文本中 copy 一些關鍵詞,是合理的。
Machine Translation
機器翻譯已經是我們日常生活中非常常見的應用了。除了文字到文字的翻譯,可能還有語音到文字的翻譯,甚至是語音到語音的翻譯。這是因為,很多語言是沒有文字的。
輸入:文本/聲音序列(語言A)
輸出:文本/聲音序列(語言B)
從輸入輸出的形式上來看,機器翻譯也是 seq2seq 的模型。
我們知道,傳統的機器翻譯的訓練,需要兩種或多種語言之間含義相同的成對的語句。這是有監督的學習。這樣如果想做 NNN 種多語言的相互翻譯,需要去標注 N2N^2N2 這樣的數據,但是世界上語言這么多,這實在是費時費力。那么,無監督的機器翻譯是否是可能的呢?即只給定多種語言的大量語料,但是沒有他們之間對應相同語義的成對標注,能否做這種無監督訓練呢?實際上,已經有一些工作在做無監督機器翻譯訓練的研究了。這里也不展開講了。
Question Answering
問答,是指給定一個問題和一些相關的資料,模型需要對問題做出回答。
輸入:多個文本(一個問題和多個相關資料)
輸出:一個文本(答案)
在前深度學習時代,人們會構建很復雜的 QA 系統,其中多個模塊互相配合,最終完成 QA 的任務。
而在深度學習時代,可以用一個模型端到端地完成 QA 的任務,輸入問題和相關資料,輸出答案。也可以看做是一個 seq2seq 的任務。
當然,目前的 QA 任務大部分還是抽取式的,即問題的答案就在資料之中,因此,通常 QA 模型也需要允許 copy。
Dialogue——Chatting Bot
聊天機器人,是無目的地與用戶閑聊(尬聊)。
輸入:多個文本(當前聊天內容、之前聊天內容、其他相關資料)
輸出:文本(聊天內容)
聊天機器人可以與人類進行對話閑聊。它需要根據當前對話和過往對話內容,再結合一些相關的資料(如知識庫等),輸出合理的對話內容。
從輸入輸出的形式上來看,聊天機器人也開始一個 seq2seq 的模型。
Dialogue——Task Oriented
與聊天機器人閑聊不同,任務導向的對話系統并不是無目的地進行對話,而是要根據既定的任務(比如聊天獲取客人的需求信息)進行對話。
輸入:多個文本(當前聊天內容、之前聊天內容)
輸出:文本(聊天內容)
從輸入輸出的形式上來看,任務導向的對話系統與聊天機器人類似。
雖然輸入輸出的形式看起來很簡單,但是目前實際的任務導向的對話系統往往都是分為多個模塊來進行的。比如下圖中的:
- NLU:自然語言理解模塊,對文本進行處理,NLU 一般有 intent classification 和 slot filling
- intent classification 意圖識別,輸入一個文本,輸出一個整體的類別。這個類別表示的是輸入文本的意圖,如詢問信息、提供信息等。
- 我打算九月九日入住 —> 提供信息
- 九月九日還有房間嗎?—> 詢問信息
- slot filling ,輸入一個文本,輸出其中每個 token 的類別,這個類別是根據具體應用場景預先設定的。slot filling 與 POS 和 NER 任務形式類似。
- 我打算九月九日入住。九月九日:入住日(預設),其他:N。
- intent classification 意圖識別,輸入一個文本,輸出一個整體的類別。這個類別表示的是輸入文本的意圖,如詢問信息、提供信息等。
- State Tracker:狀態跟蹤模塊,根據 NLU 的處理結果,得到當前的狀態,由于任務導向的對話不是漫無目的的尬聊,因此模型需要關心的狀態是有限的,比如例子中的聯絡人、入住人數等;
- Policy:策略模塊:根據當前的狀態,決定下一步要問什么問題,由于關心的狀態有限,因此這可以視作一個分類問題,決定要詢問哪一個信息。如果系統比較簡單的話(比如例子中的訂房系統),可以手寫規則來完成;如果任務比較復雜,可以通過強化學習來訓練;
- NLG:自然語言生成模塊:根據要問什么問題,生成出自然語言的對話文本
任務導向的問答系統的整個流程的模塊框圖如下所示:
知識圖譜
Knowledge Graph
我們知道圖(graph)由節點和邊組成。知識圖譜也是一種圖,它的節點是實體(entity,可以是人名、地名、組織名等),而它的邊則是實體之間的關系。下圖就是一張知識圖譜。
知識圖譜相關的任務主要有兩類:
- 給定一張知識圖譜,如何使用它。如何使用知識圖譜來處理其他問題,比如摘要、對話、QA 等;
- 如何通過大量的文字構建知識圖譜。比如讀完整本哈利波特后,模型是否能構建出上圖中的知識圖譜,或者模型能夠根據互聯網上大量的信息構建出怎樣的知識圖譜。
在這里,我們將整個構建知識圖譜的過程(過度)簡化為兩步:一是抽取實體,而是抽取關系。
NER
抽取實體,我們的任務是命名實體識別(NER),就是要抽取出句子中的 ”命名實體“。任務的形式與 POS tagging、slot filling 類似。
輸入:文本
輸出:文本中每個 token(單詞)的類別(實體)
至于什么是命名實體,并沒有通用的定義,是取決于具體的應用。它通常命名實體包括人名、地名、組織名等。但實際上,在某個任務中,我們所關心的東西,才是我們要抽取的命名實體。比如我們想要通過讓模型閱讀大量醫學文獻,來判斷什么藥物能夠治療新冠肺炎,那么這里的藥物名,就是我們的命名實體。
NER 任務看似簡單,實際上還是有不少問題。比如同一個實體可能有不同的叫法,而同一個單詞又可能代表了不同的實體。這就要考慮到 entity link 和 entity resolution,這里就不展開。
Relation Extraction
抽取關系,實際上也是有一定難度的任務。但是從輸入輸出的角度來看,就是一個分類問題。
輸入:多個文本、兩個命名實體
輸出:類別(兩個命名實體之間的關系)
通用語言理解任務
在以前,對于上面這么多 NLP 的任務,都是對每一個任務,專門構建一個模型來處理。近年來,為了評估語言模型在多個 NLP 任務上的通用語言理解能力,出現了一些集成多個任務的 benchmark,如
- GLUE
- SuperGLUE
- DecaNLP
這就存在一個問題,不同的 NLP 任務,輸入輸出形式并不完全一致,怎么能用一個模型來處理呢?實際上,所有的 NLP 的任務都可以當做 QA 的任務來處理。比如如果我們想做摘要任務,就給模型一段文本,然后問題是 ”這段文本的摘要是什么?“,模型會輸出一段摘要作為答案;如果我們想做翻譯任務,問題就是 ”這段中文的英文翻譯是什么?“;如果我們想做情緒識別任務,問題就是 ”這段文本的情感是正向的還是負向的“。
總結
在本文中,我們跟隨李老師一起概覽了常見的 NLP 任務的輸入輸出形式,并將他們劃分為輸入文本輸出類別和輸入文本輸出文本兩大類。并且了解到,如果想做通用的 NLP 任務,只要將模型訓練為 QA 任務的形式,然后給定關于特定任務的問題就可以了。