NLP技术中的Tokenization
?作者 | Gam Waiciu
單位 | QTrade AI研發中心
研究方向 | 自然語言處理
前言
今天我們來聊一聊 NLP 技術中的 Tokenization。之所以想要聊這個話題,是因為,一方面在 NLP 技術中 Tokenization 是非常重要的一個環節,它是數據進入到模型進行計算之前所必須的一個步驟;一方面,不少 NLPer 可能關注的往往是模型的花里胡哨,煉丹 Tricks 的紛繁復雜又或者是數據清洗的枯燥無味,對于字符串數據進入到模型之前所必經的 Tokenization 環節知之甚少;另一方面,筆者曾在工作過程中無意發現字符經過 XLM-Roberta 的 Tokenization 會多出“_”這個特殊符號,于是在 Tokenization 這方面進行了一番調研,便有會意,遂欣然忘食,執筆著之。
引言
1.1 什么是Tokenization
相信大家作為一個 NLPer 都很熟悉 NLP 的流程,如下圖。無論大家熟悉不熟悉,請準許我先介紹一番。
圖1.1 NLP流程
首先,我們將文本句子切分成一個個子單元,然后將子單元數值化(映射成向量),接著將這些向量輸入到模型進行編碼,最后輸出到下游任務中進一步得到最終結果。對于為什么要數值化,是因為除了決策樹模型,機器學習中絕大多數模型是不支持字符串數據的,想要模型能夠順利有效地學習,必須對字符串數據先數值化。另外,我們并不是直接對輸入句子或者單詞進行數值化,我們需要先將其切分成一個個有限的子單元,然后將這些子單元數值化。
而這個將原始文本切分成子單元的過程就叫做 Tokenization。國內很多翻譯為“分詞”,私以為,這樣的翻譯多少會讓人有誤解,讓人誤以為是針對中文進行詞語的分割。盡管這是 Tokenization 的任務之一,但并不局限與此(它要做的還有更多)。
1.2 Tokenization的難點?
由 1.1 節我們可以知道,Tokenization 其實是為數值化作準備,數值化的過程必然需要映射,而映射又需要一個目標集合或者說映射表。這里就產生一個問題了,如果我們切分出來的子單元種類是非常多甚至無限多的,那么我們就需要一個非常龐大的映射表了,這就會導致巨大的內存消耗以及過多的計算量,這顯然是不理想的。
一種做法是將大量的低頻子單元使用幾個特定的符號(例如,[UNK])代替,這樣便縮小了映射表了,但是這樣一來我們原始文本就損失了很多信息了。另外,對于切分出來的子單元到底是什么,可以是任意的東西嗎?直觀上來講,顯然不應該是任意的東西,這些被切分出來的子單元應該是有一定的含義的。比如:【unhappily】如果切分成了【un, happ, ily】顯然要比【unh ap pily】要合理得多。因為【un, happ, ily】中每一個子單元都有一定的含義,而后者不然。?
綜上所示,Tokenization 的難點便是——如何獲得理想的切分,使文本中所有的 token 都具有正確的語義,并且不會存在遺漏(out of the vocabulary 問題)。
1.3?三類Tokenization方法?
這里筆者對 Tokenization 按切分的粒度分成了三大類,一是按詞粒度來分,二是按字符粒度來分,三是按 subword(子詞粒度來分)。對于詞粒度切分這類方法是自然而然的,因為我們人類對于自然語言文本的理解就是按照這種方式切分的。對于字符粒度,這是一種極簡的方法,基本不需要什么技巧,但是它有很多弊端。對于 subword 粒度切分,它似乎繼承了儒家學派的中庸之道,是這樣一種折中的方法。三種方法概括如下圖:
圖1.2 Tokenization方法(按粒度分類)
詞粒度Tokenization
本節我們來討論詞粒度的相關方法。詞粒度的切分就跟人類平時理解文本原理一樣,可以用一些工具來完成,例如英文的 NLTK、SpaCy,中文的 jieba、HanLP 等。
首先我們直觀地看一下詞粒度進行 Tokenization 是怎么樣的一種方法。
圖2.1 詞粒度的Tokenization示例
很顯然,跟我們人類閱讀時自然而然地切分是一致的。
這種方法的優點是,能夠很好地保留詞的語義和邊界信息。
對于英文等拉丁語系的詞粒度 Tokenization 很簡單,我們可以直接按照空格便能水到渠成地切出來,但是針對中日韓這類文字是無法通過空格進行切分的,這時針對這類語言的文字我們便需要用到一些分詞方法。這些方法中一類是使用模型學習如何分詞的,另一類是通過一個常用詞表然后根據各種算法進行詞表匹配來進行分詞。使用模型進行序列標注這種方法不在本文的討論范疇之內。筆者僅僅對詞表匹配這類方法進行介紹。
基于詞表和規則的分詞方法可以分為 3 種:
1. 前(后)向最大匹配法;?
2. 最短路徑分詞法;?
3. 基于 N-Gram LM 的統計詞頻分詞法。
這里先拋出問題,假設給定一個詞典 V,如何對一個句子 S 進行分詞呢。
圖2.2 中文分詞
下面筆者將對三種分詞方法作一個簡單介紹。
2.1 前(后)向最大匹配法
前(后)向最大匹配法的方法很簡單,只需要知道前向匹配,那么后向匹配自然也就理解了。這里以前向最大匹配法進行講解。我們來看一個例子,就能對前向匹配法的了然。
預設條件:??
1. 設定最大匹配長度 2(當然可以是 3,4,5 或者更長);?
2. 從左往右掃描句子(也可以從右往左)。
圖2.3 前向匹配過程
則最終輸出結果為:
圖2.4 前向匹配結果
很顯然,這種規則雖然簡單,但是卻不是一種什么好方法。因為它無法解決歧義的問題,而且 N 的大小和和前還后向匹配對結果的影響很大。
題外話:由于詞表一般比較大,為了節省內存和提高查找效率,一般會將詞庫構造成字典樹。
2.2 最短路徑分詞法
最短路徑分詞法首先將句子中所有字都切分開來,然后根據詞表將組成詞的字連接起來,構成“詞圖”,然后求解“詞圖”的最短路徑就是分詞結果。
圖2.5 最短路徑分詞法的詞圖示例
本文中的例子構造出的“詞圖”,如上圖所示。路徑上的數字“1”代表權重,這里我們全部取為 1,代表每種分詞的重要性或者說可能行等價。然后利用 N-最短路徑或者 Dijkstra 算法便可以求解出最短路徑。然后最短路徑上的詞匯就是我們最終需要的結果。
上述結果中,我們的分詞結果是:
圖2.6 最短路徑分詞法結果
2.3 基于N-Gram LM的統計詞頻分詞法?
上述方法中,我們實際上作了簡化邊的權重都是 1,而現實中卻不是這樣的,常見的詞出現頻率高,我們可以用將求解“詞圖”最短路徑的方法轉為求解概率(頻率)最大的路徑。?
利用 2-Gram 語言模型,我們可以計算出詞語的共現概率,結合詞典 V,我們可以得到下面的“詞圖”。
圖2.7 2-Gram LM統計分詞法的詞圖示例
P(他|<s>) 的含義是,“他”作為句子開頭對于訓練好的語言模型來說其概率是多少,同理 P(說|他) 表示“說”在在“他”字后面出現的概率是多少。我們有理由相信,這是一種更合理的方法,因為其考慮了不同詞語之間先后出現的概率。
Tips:N-Gram 中的 N 也可以取 3,4,5,6 等。這里之所以用 2-Gram 一方面是為了表述方便,另一方面是因為實際應用中也不會取得太大,因為 N 取得越大,計算量就越高。
2.4 基于詞粒度的Tokenization優缺點?
我們先來看看優點,概括來說就是詞的邊界和含義得到保留。?
詞粒度很像人類去閱讀一樣,一方面能夠很好地保留詞的邊界信息,另一方面能夠很好地保留詞的含義。這對后續模型來說是一件好事,拿 NER 任務來說,通常標簽偏移是由于詞邊界沒有約束好導致的,所以詞語的邊界信息對于某些下游任務來說是很重要的。在 MRC 任務中,詞語含義能否被模型捕獲也顯得很重要,如果最初輸入到模型的是丟失了某些關鍵詞的詞含義信息,那么最終結果可能會收到一定影響。?
當然詞粒度的方法也有一定的缺陷。?
Issue1:詞粒度的方法,需要構造的詞典太過龐大,嚴重影響計算效率和消耗內存。?
Issue2:即使使用這么大的詞典不影響效率,也會造成 OOV 問題。因為人類語言是不斷發展的,詞匯也在發展中不斷增加。例如:針不戳,Niubility,Sixology 等。?
Issue3:詞表中的低頻詞/稀疏詞在模型訓練過程中無法得到充分訓練,進而模型不能充分理解這些詞的語義。
Issue4:一個單詞因為不同的形態會產生不同的詞,如由“look”衍生出的“looks”, “looking”, 但是意義相近,對他們都進行訓練是不必要的。
字粒度Tokenization
字粒度又稱字符粒度,它是按某一種語言最小符號來進行切分的。字符粒度最早應該是 2015 年 Karpathy 提出,簡單說英文(拉丁語系)就是以字母為單位,中文日文韓文等就是以字為單位進行切分。
圖3.1 字粒度Tokenization示例
它的優點是,詞表大大減小,26 個英文字母基本能覆蓋出幾乎所有詞,5000 多個中文基本也能組合出覆蓋的詞匯。但是它的缺點也很嚴重,這種方法嚴重丟失了詞匯的語義信息和邊界信息,這對 NER 等關注詞匯邊界的任務來說會有一定的影響。而且把單詞切分的太細,會使得輸入太過長增加輸入計算壓力,減小詞表的代價就是輸入長度大大增加,從而輸入計算變得更耗時,訓練時更占內存空間。
這一種 Tokenization 方法沒有什么過多可說的,因為現實中除了中日韓等語言外一般不用,尤其是拉丁語系。
subword(子詞)粒度的Tokenization
在講 subword 粒度的 Tokenization 之前,我們首先來談談什么樣的 Tokenization 才是理想的 Tokenization。概括來說就是,詞表要盡可能地小,小的同時又能覆蓋到絕大多數的詞盡可能地少出現 OOV 的詞,另外此表中的每一個 token 都是有一定的含義,也就是說,對于一個詞切出來的 subwords 中每一個都是有意義的,再者就是不要切得太細。
而第 2 節和第 3 節中講到的方法都存在或多或少的缺點,都不能同時滿足以上需求。那么有沒有一種兼顧各方的方法呢?有的,那就是子詞切分的方法。不過這里首先聲明一下,這種方法只適用于英文等拉丁語系的語言,對于中文來說總不能把一個字分為偏旁部首和字根吧。
那么 subword 的 Tokenization 是怎么切分的呢?
圖4.1 subword粒度的Tokenization示例
接著又要提問了,如何切分或者說如何構造出 subwords 詞典呢?目前主要有 4 種方法。如下圖所示,下面將一一講解這 4 種方法的原理和異同。
圖4.2 subword粒度的方法
4.1?BPE
BPE 全稱 Byte Pair Encoding,字節對編碼,是一種數據壓縮方法。最早是論文 [1] 將其引入到 NLP 技術中。BPE 迭代地合并最頻繁出現的字符或字符序列,具體步驟:
圖4.3 BPE訓練步驟
下面看一個理解便能更好地理解。
圖4.4 BPE訓練示例
可以看到,每次嘗試合并相鄰的兩個字符,如果合并后出現概率是目前最大的,那就將合并后的字串加入到詞匯表。
這里順便講一下,目前我們只是得到了詞匯表,對于給定的一個單詞,我們怎么對它進行編碼呢?很簡單,編碼分為 3 步:1)對于單詞 w,依次遍歷排好序的詞典。查看當前子詞是否是該單詞的子字符串,如果是,則輸出當前子詞,并對剩余單詞字符串繼續匹配。有點類似(前向最大匹配);2)如果遍歷完字典后,仍然有子字符串沒有匹配,則將剩余字符串替換為特殊符號輸出,如“<unk>”;3)單詞 w 的表示即為上述所有輸出子詞。
圖4.5 BPE解碼
4.2 WordPiece?
WordPiece 最早在 [2] 中提出,并應用于解決日語和韓語語音問題。它與 BPE 相同點:每次從統計語料中選取出兩個新的子詞進行合并。它與 BPE 最大區別在于選擇兩個子詞進行合并的原則:BPE 按頻率,WordPiece 按能夠使得 LM 概率最大的相鄰子詞加入詞表。?
對于 WordPiece 構造詞表的原理如下:
假設由句子 由 個子詞組成, 表示第 個子詞,且假設子詞之間是相互獨立的,那么句子 的語言模型對數似然值為:
假設把相鄰的 和 兩個子詞合并,產生 子詞,此時句子的對數似然值增益為:
兩個子詞合并前后的對數似然值增益等于 和 的互信息。所以,WordPiece 每次選擇合并的兩個子詞,具有最大的互信息值,從語言模型上來說兩個子詞之間有很強的關聯性,從語料上來說兩個子詞共現概率比較高。
WordPiece 的算法步驟如下:
圖4.6 WordPiece訓練步驟
4.3 UniLM?
Unigram 語言建模首先在 [3] 中提出。這種方法與 WordPiece 相同點是:同樣使用語言模型來挑選子詞。與 WordPiece 最大區別:WordPiece 算法的詞表大小都是從小到大變化。UniLM 的詞庫則是從大到小變化,即先初始化一個大詞表,根據評估準則不斷丟棄詞表,直到滿足限定條件。ULM 算法考慮了句子的不同分詞可能,因而能夠輸出帶概率的多個子詞分段。?
對于 UniLM 構造詞表的原理如下:
對于句子 ,假如存在一種子詞切分結果為 則當前分詞下句子 的對數似然值可以表示為:
對于句子 ,挑選似然值最大的作為分詞結果,即:
為最優切分結果。
UniLM 構造詞典的算法步驟如下:
圖4.7 UniLM的訓練步驟
可以看出,UniLM 會保留那些以較高頻率出現在很多句子的分詞結果中的子詞,因為這些子詞如果被丟棄,其損失會很大。?
4.4 SentencePiece?
以上三種方法都存在著兩個問題就是:1)無法逆轉;2)訓練的時候需要提前切分。無法逆轉是什么意思呢,就是對句子 s 進行切分后得到的結果無法準確復原回 s。更直白地說就是空格不能被保留,如下:
圖4.8 切分不可逆示意
而 SentencePiece [4] 的解決方法是:?
1. SentencePiece 首先將所有輸入轉換為 unicode 字符。這意味著它不必擔心不同的語言、字符或符號,可以以相同的方式處理所有輸入;?
2. 空白也被當作普通符號來處理。Sentencepiece顯式地將空白作為基本標記來處理,用一個元符號 “▁”( U+2581 )轉義空白,這樣就可以實現簡單地decoding;?
3. Sentencepiece 可以直接從 raw text 進行訓練;?
4. 支持 BPE 和 UniLM 訓練方法。
結語
目前在中文方面其實我們的大多數預訓練模型包括 Bert,Roberta 等都是使用字粒度的方法進行 Tokenization,它們對詞匯的含義和邊界信息的捕獲可能會有所欠缺,所以很多方法諸如 [5][6] 等都在探討如何通過外部詞匯提高這些模型對詞匯的理解。而對于拉丁語系(比如英文)大多都是使用的 subword 粒度的 Tokenization 方法。
學習 Tokenization 確實是一件非常枯燥無味的事情,尤其是需要深入學習的時候。本文盡最大努力從知識面的廣度來講解為什么要 Tokenization 以及 Tokenization 到底在做什么。盡管這些知識對一個 NLP 煉丹師來說不是經常用得到甚至用不到。但或者這些東西對大家日后的工作或者 idea 創新有幫助呢?
參考文獻
[1]?Sennrich R, Haddow B, Birch A. Neural machine translation of rare words with subword units[J]. arXiv preprint arXiv:1508.07909, 2015.?
[2] Schuster M, Nakajima K. Japanese and korean voice search[C]//2012 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP). IEEE, 2012: 5149-5152.?
[3] Kudo T. Subword regularization: Improving neural network translation models with multiple subword candidates[J]. arXiv preprint arXiv:1804.10959, 2018.?
[4] Kudo T, Richardson J. Sentencepiece: A simple and language independent subword tokenizer and detokenizer for neural text processing[J]. arXiv preprint arXiv:1808.06226, 2018.?
[5] Ma R, Peng M, Zhang Q, et al. Simplify the usage of lexicon in Chinese NER[J]. arXiv preprint arXiv:1908.05969, 2019.?
[6] Liu W, Fu X, Zhang Y, et al. Lexicon Enhanced Chinese Sequence Labelling Using BERT Adapter[J]. arXiv preprint arXiv:2105.07148, 2021.
特別鳴謝
感謝 TCCI 天橋腦科學研究院對于 PaperWeekly 的支持。TCCI 關注大腦探知、大腦功能和大腦健康。
更多閱讀
#投 稿?通 道#
?讓你的文字被更多人看到?
如何才能讓更多的優質內容以更短路徑到達讀者群體,縮短讀者尋找優質內容的成本呢?答案就是:你不認識的人。
總有一些你不認識的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學者和學術靈感相互碰撞,迸發出更多的可能性。?
PaperWeekly 鼓勵高校實驗室或個人,在我們的平臺上分享各類優質內容,可以是最新論文解讀,也可以是學術熱點剖析、科研心得或競賽經驗講解等。我們的目的只有一個,讓知識真正流動起來。
📝?稿件基本要求:
? 文章確系個人原創作品,未曾在公開渠道發表,如為其他平臺已發表或待發表的文章,請明確標注?
? 稿件建議以?markdown?格式撰寫,文中配圖以附件形式發送,要求圖片清晰,無版權問題
? PaperWeekly 尊重原作者署名權,并將為每篇被采納的原創首發稿件,提供業內具有競爭力稿酬,具體依據文章閱讀量和文章質量階梯制結算
📬?投稿通道:
? 投稿郵箱:hr@paperweekly.site?
? 來稿請備注即時聯系方式(微信),以便我們在稿件選用的第一時間聯系作者
? 您也可以直接添加小編微信(pwbot02)快速投稿,備注:姓名-投稿
△長按添加PaperWeekly小編
🔍
現在,在「知乎」也能找到我們了
進入知乎首頁搜索「PaperWeekly」
點擊「關注」訂閱我們的專欄吧
·
總結
以上是生活随笔為你收集整理的NLP技术中的Tokenization的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 恩平市做吊顶的装饰公司电话?
- 下一篇: 冰丝乳胶凉席和竹席哪个好?