自然語言處理

n元語法(n-gram)

/ EN-gram /

n元語法不過是一個短短的、滑動的視窗,框住連續的 n 個項——通常是 n 個詞,有時是 n 個字母。讓一個兩詞寬的視窗在「the cat sat on the mat」上滑過,你就得到一串二元語法(2-gram):「the cat」「cat sat」「sat on」「on the」「the mat」。一個詞叫一元語法,兩個叫二元,三個叫三元,以此類推。抓取詞塊而非單個詞,妙處在於順序開始變得重要:「not good」作為一個整體被保留了下來,而單純的詞袋則會把它弄丟。

n元語法支撐著一個關於語言的極簡而美妙的想法:你可以靠數「過去通常跟著什麼」來猜下一個詞。看過海量文本後,程式會注意到「a cup of」後面極常跟「coffee」或「tea」,極少跟「democracy」。數足夠多的n元語法,你就有了一個粗糙卻真實的語言流動模型——早期的自動補全、拼字糾錯和語音辨識,正是這麼幹的。

難處在於一個殘酷的取捨。n 越大,捕捉的語境越多,但計數會爆炸:可能的n元語法數量以天文數字增長,而其中絕大多數在你的資料裡根本沒出現過,於是你永遠缺例子(這個問題叫稀疏性)。這道天花板——n元語法頂多只能「看到」往回數的那幾個詞——恰恰就是神經語言模型被發明出來要打破的,辦法是學習平滑的表示,而非脆弱的計數。

從「I really love this」中:一元語法 = I, really, love, this。二元語法 =「I really」「really love」「love this」。一個常見到「really love」的二元模型,能合理地預測下一個會是個褒義詞。

滑動一個大小為 n 的視窗,廉價地捕捉了局部詞序。

n元語法頂多只能看到幾個詞的上下文,且隨著 n 增大會遭遇嚴重的資料稀疏。它們是神經網路之前自然語言處理的主力,至今仍是結實的基準——但捕捉不了長距離的語義。

又稱
ngrambigramtrigramn元组二元语法三元语法