2.3 corpus
語(yǔ)料庫(kù)的變化維度:
(1) 語(yǔ)種:開(kāi)發(fā)出的算法,一般是適用于英語(yǔ)或者針對(duì)工業(yè)化大國(guó)的官方語(yǔ)言(漢語(yǔ)、西班牙語(yǔ)、日語(yǔ)、德語(yǔ)等)開(kāi)發(fā)的,但我們不希望將工具僅僅局限在這幾種語(yǔ)言上。
多數(shù)語(yǔ)言也有多個(gè)變種,即所謂的方言。
說(shuō)話者或?qū)懽髡咴趯?shí)際交流或?qū)懽鲿r(shí)同時(shí)使用多種語(yǔ)言是非常常見(jiàn)的,這種現(xiàn)象稱為語(yǔ)碼轉(zhuǎn)換(code switching).
(2) 體裁:新聞、小說(shuō)、會(huì)議紀(jì)要等等。
(3) 文本還反映了作者(或說(shuō)話人)的人口統(tǒng)計(jì)學(xué)特征:他們的年齡、性別、種族、社會(huì)經(jīng)濟(jì)階層都會(huì)影響我們所處理文本的語(yǔ)言屬性。
(4) 時(shí)間也很重要。語(yǔ)言會(huì)隨著時(shí)間的推移而變化。
由于語(yǔ)言是如此的具有情境性(situated),所以當(dāng)根據(jù)語(yǔ)料庫(kù)來(lái)開(kāi)發(fā)語(yǔ)言處理模型時(shí),為每個(gè)語(yǔ)料庫(kù)建立一個(gè)datasheet或datastatement。
需要包括:Motivation、Situation、Language variety、Speaker demographics、Collection process、Annotation process、Distribution。
2.4 Text Normalization
At least three tasks are commonly applied as part of any normalization process:
- Tokenizing (segmenting) words
- Normalizing word formats
- Segmenting sentences
2.4.1 用于粗略分詞和規(guī)范化的 Unix 工具
tr -sc 'A-Za-z' '\n' < sh.txt | tr A-Z a-z | sort | uniq -c | sort -n -r
2.4.2 分詞(Word Tokenization)
Unix 命令過(guò)濾了所有的數(shù)字和標(biāo)點(diǎn)符號(hào),但對(duì)于大多數(shù) NLP 應(yīng)用來(lái)說(shuō),我們需要在分詞任務(wù)中保留這些字符。我們往往想把標(biāo)點(diǎn)符號(hào)視作一個(gè)單獨(dú)詞;對(duì)于解析器來(lái)說(shuō),逗號(hào)是一個(gè)有用的信息。句號(hào)有助于指示句子的邊界。
一個(gè)常用的分詞標(biāo)準(zhǔn)是 Penn Treebank 分詞(Penn Treebank tokenization)標(biāo)準(zhǔn),用于語(yǔ)言數(shù)據(jù)聯(lián)盟(Linguistic Data Consortium)(LDC)發(fā)布的解析語(yǔ)料庫(kù)(treebanks),它是許多有用數(shù)據(jù)集的來(lái)源。
在實(shí)踐中,由于分詞需要在其他自然語(yǔ)言處理任務(wù)之前進(jìn)行,所以它必須非???。因此,分詞的標(biāo)準(zhǔn)方法是使用基于正則表達(dá)式的確定性算法,這些正則表達(dá)式被編譯成非常高效的有限狀態(tài)自動(dòng)機(jī)(finite state automata)。
2.4.3 用于分詞的字節(jié)對(duì)編碼(Byte-Pair Encoding for Tokenization)
NLP 算法通常會(huì)從一個(gè)語(yǔ)料庫(kù)(訓(xùn)練語(yǔ)料庫(kù))進(jìn)行學(xué)習(xí),從中提取一些關(guān)于語(yǔ)言的事實(shí),然后利用這些事實(shí)對(duì)另外一個(gè)測(cè)試語(yǔ)料庫(kù)進(jìn)行推理。
假設(shè)我們的訓(xùn)練語(yǔ)料庫(kù)中包含,比如說(shuō) low、new、newer 等詞,但不包含 lower,那么如果在測(cè)試語(yǔ)料庫(kù)中出現(xiàn)了 lower 這個(gè)詞,我們的系統(tǒng)就不知道該怎么處理它了。
為了處理這種未登錄詞的問(wèn)題,現(xiàn)代分詞器通常會(huì)自動(dòng)推導(dǎo)出包括比詞(words)更小的 token 集,稱為子詞(subwords)。子詞可以是任意的子串,也可以是有語(yǔ)義的單位如 -est 或 -er 這種語(yǔ)素。
大多數(shù)分詞方案有兩個(gè)部分:一個(gè) token 學(xué)習(xí)器(token learner)和一個(gè) token 分割器(token segmenter)。Token 學(xué)習(xí)器使用原始訓(xùn)練語(yǔ)料庫(kù)(有時(shí)會(huì)預(yù)先進(jìn)行粗略分詞,如使用空格),然后得到一個(gè)詞匯表(vocabulary),一個(gè) token 集合。Token 分割器將一個(gè)原始測(cè)試句子分割成詞匯表中的 token。有三種廣泛使用的算法:字節(jié)對(duì)編碼(byte-pair encoding)、一元語(yǔ)法語(yǔ)言模型(unigram language modeling) 和 WordPiece;還有一個(gè) SentencePiece 庫(kù),包含了這三種算法中前兩種的實(shí)現(xiàn)。
這里值得注意的是,BERT、T5等都是使用的WordPiece分詞器。
PBE算法詳解:
BPE 的 token 學(xué)習(xí)器從一個(gè)初始詞匯表開(kāi)始,這個(gè)詞匯表只是所有單個(gè)字符(characters)的集合。然后它遍歷訓(xùn)練語(yǔ)料庫(kù),選擇兩個(gè)最常相鄰的符號(hào)(symbol)(比如說(shuō) ‘A’、‘B’),將兩者合并成一個(gè)新的符號(hào)‘AB’添加到詞匯表中,并將語(yǔ)料庫(kù)中每一個(gè)相鄰的‘A’‘B’替換為新的‘AB’。以此循環(huán)往復(fù),得到新的越來(lái)越長(zhǎng)的字符串,直到完成了 k次合并,創(chuàng)造了k個(gè)新的符號(hào);因此k是算法的一個(gè)參數(shù)。最終產(chǎn)生的詞匯表由原來(lái)的字符集加上k個(gè)新的符號(hào)組成。

通常是在詞內(nèi)部運(yùn)行該算法(不會(huì)跨越詞邊界進(jìn)行合并),所以先將輸入語(yǔ)料庫(kù)進(jìn)行空格分割,得到一組字符串,每個(gè)字符串對(duì)應(yīng)一個(gè)詞的字符,再加上一個(gè)特殊的詞尾符號(hào) _,以及其頻數(shù)。我們以下面這個(gè)包含 18 個(gè) token 及其頻數(shù)的微型語(yǔ)料庫(kù)為例來(lái)說(shuō)明算法時(shí)如何運(yùn)行的(詞 low 出現(xiàn) 5 次,詞 newer 出現(xiàn) 6 次,以此類推),初始詞匯表有 11 個(gè)字符:
語(yǔ)料庫(kù):
5 l o w _
2 l o w e s t _
6 n e w e r _
3 w i d e r _
2 n e w _
詞匯表:
_, d, e, i, l, n, o, r, s, t, w
核心思想:獲取相鄰符號(hào)對(duì)頻數(shù)最高的進(jìn)行連接,加入詞匯表
具體步驟如下
e 和r 相鄰共現(xiàn)的頻次是最高的為9, 當(dāng)然了 r 和_ 也是9, 這里以e和r先共現(xiàn)為例子。
| 步驟序號(hào) | 合并 | 最高相鄰共現(xiàn)詞頻 | 當(dāng)前詞匯表 |
|---|---|---|---|
| 1 | (e, r) | 9 | _, d, e, i, l, n, o, r, s, t, w, er |
| 2 | (er, _) | 9 | , d, e, i, l, n, o, r, s, t, w, er, er |
| 3 | (n, e) | 8 | , d, e, i, l, n, o, r, s, t, w, er, er, ne |
| 4 | (ne, w) | 8 | , d, e, i, l, n, o, r, s, t, w, er, er, ne, new |
| 5 | (l, o) | 7 | , d, e, i, l, n, o, r, s, t, w, er, er, ne, new, lo |
| 6 | (lo, w) | 7 | , d, e, i, l, n, o, r, s, t, w, er, er, ne, new, lo, low |
| 7 | (new, er_) | 6 | , d, e, i, l, n, o, r, s, t, w, er, er, ne, new, lo, low, newer_ |
| 8 | (low, _) | 5 | , d, e, i, l, n, o, r, s, t, w, er, er, ne, new, lo, low, newer_, low_ |
一旦我們學(xué)到了詞匯表,token 解析器(token parser)就會(huì)對(duì)測(cè)試句子進(jìn)行分詞。Token 解析器會(huì)按照詞匯表順序,貪婪地在測(cè)試數(shù)據(jù)上匹配我們從訓(xùn)練數(shù)據(jù)中學(xué)到的詞。
所以,首先我們把每個(gè)測(cè)試句子的詞分割成字符。然后我們會(huì)應(yīng)用第一條規(guī)則:將測(cè)試語(yǔ)料庫(kù)中的 e r 替換為 er,然后應(yīng)用第二條規(guī)則:將測(cè)試語(yǔ)料庫(kù)中的 er _ 替換為 er_,以此類推。到最后,如果測(cè)試語(yǔ)料庫(kù)中包含 n e w e r _這個(gè)詞,它將被分為一個(gè)完整的詞。但是,一個(gè)新的(未知)單詞,如 l o w e r ,將被分成兩個(gè) token:low er。
2.4.4 詞規(guī)范化,詞形還原和詞干提?。╓ord Normalization, Lemmatization and Stemming)
詞的規(guī)范化是將詞或者 token 轉(zhuǎn)成標(biāo)準(zhǔn)格式的任務(wù),對(duì)于有多種形式的詞,如 USA 和 US 或 uh-huh 和 uhhuh,選擇一個(gè)規(guī)范形式。
大小寫(xiě)折疊(Case folding)是另一種規(guī)范化方法。
詞形還原(Lemmatization)是確定兩個(gè)詞盡管表面存在差異但具有相同詞根(root)的任務(wù) 。形態(tài)學(xué)(Morphology)是研究詞是如何由較小的語(yǔ)義單位(稱為語(yǔ)素)構(gòu)成的。語(yǔ)素可以分為兩大類:詞干(stems)—— 詞的中心語(yǔ)素,詞的主要含義;詞綴(affixes)—— 增加各種“附加”(additional)意義。
詞形還原算法比較復(fù)雜。出于這個(gè)原因,我們有時(shí)會(huì)使用一種更簡(jiǎn)單但更粗糙的方法,主要是去掉詞尾后綴。這種形態(tài)學(xué)分析的 naive 版本被稱為詞干提?。╯temming)。
2.4.5 分句(Sentence Segmentation*)
分句(Sentence segmentation)是文本處理的另一個(gè)重要步驟。將文本分割成句子最有用的線索是標(biāo)點(diǎn)符號(hào),如句號(hào)、問(wèn)號(hào)和感嘆號(hào)。問(wèn)號(hào)和感嘆號(hào)是相對(duì)明確的句子邊界標(biāo)記。而句號(hào)則比較含糊,既可以作為在句子邊界標(biāo)記,也可以作為縮寫(xiě)標(biāo)記如 Mr. 和 Inc.你剛才讀到的上一句話顯示了這種歧義的更復(fù)雜的情況,其中 Inc. 的最后一個(gè)句號(hào)既表示縮寫(xiě),又表示句子邊界。因此,分句和分詞可以合并一起進(jìn)行。
一般來(lái)說(shuō),分句首先需要確定句號(hào)是詞的一部分還是句子邊界標(biāo)記(基于規(guī)則或機(jī)器學(xué)習(xí))??s略語(yǔ)詞典可以幫助確定句號(hào)是否是常用縮略語(yǔ)的一部分;詞典可以是手工建立的,也可以是機(jī)器學(xué)習(xí)到的 。