喬姆斯基的轉換生成語法:寫程式跳出Syntax Error的原因

《讓電腦讀懂你的話:形式語言》系列將為大家初探語言學,與後續引響電腦科學的重要理論──喬姆斯基的轉換生成語法。


還記得我們先前幾篇提到的普遍語法 (Universal Grammar) 嗎?

普遍語法是喬姆斯基最著名的理論。根本觀點是兒童能習得語言,本質上是依靠與生俱來內建的知識系統。

 

轉換生成文法

喬姆斯基後續提出的理論「轉換生成文法」(transformational-generative grammar, TG)繼續發展喬姆斯基的普遍文法。

如果喬姆斯基的普遍文法理論是正確的話,人類的大腦應能系統性地生產文法正確的字句

因此,喬姆斯基在轉換生成文法理論中,嘗試描述生產正確字句的過程——我們可以簡化「語言」為一系列的規則與字串。這些字串與規則生成 (generate)了一個語言。

基於不同的規則,能組合出不同的語言。

 

生成語法—依照有限個規則、組合出無限個句子

生成語法由有限個的規則組成,應用這些規則、能生成一個特定語言中符合語法的句子(通常來講這些句子的數目可以是無限多個)。

生成語法學與傳統語法學的一個區別,是它使用數學那樣的符號和公式來表達規則,所以又稱為形式化的語法。

早期的生成語法學家研究以數學的集合論為語法研究的基礎。他們認為,每種語言都是句子的無窮集合,不能窮舉而出,只能用規則來描述。

因此學語言的人不可能一句句地學會,必須掌握語法規律。

按照喬姆斯基對於語言的定義:

「按照一定規律,來構成句子的字串的集合,就稱之為語言。」

“Language is a set of symbols being used for communication.”

我們大腦中的「語言知識系統」,事實上就是一個計算系統。

我們會把在這個計算系統中,放入有限的符號(比如 26 個英文字母),然後能產生出無限多個表達式(句子)。

每個表達式都具語意 (sematics) 與語法 (syntax),長度也沒有限制。

也就是說,語言利用有限個符號、按照一定規則的系統,所能創造出的無限個句子。我們會認為「不合文法」是因為我們有這樣一套固定的編碼系統,來解釋一個句子。

這個特性稱為離散 (discrete) 且遞迴 (recursion)。

離散代表分散開來的、不存在中間值的量,比如 1, 2, 3, 4, 5 整數是離散的,而佈於 1 – 5 的實數是連續的。

遞迴代表——我們可以為現在的結構建立一個更大的結構、然後這個更大的結構又有一個再更大的結構包住它…

最有名的的遞迴句子,莫過於這首 18 世紀便廣為流傳的英國童謠:

This is the maiden all forlorn
That milked the cow with the crumpled horn
That tossed the dog that worried the cat
That killed the rat that ate the malt
That lay in the house that Jack built.

(這個故事要從傑克蓋的房子裡說起,房子裡有一塊乳酪被老鼠吃了、老鼠被貓殺了、這隻貓被狗嚇壞了、狗被曲角牛拋到天上、孤獨的少女為曲角牛擠奶… 可以發現 that 無限的把句子包起來)

中文的遞迴句子,莫過於:哥哥喜歡吃蘋果的隔壁鄰居的妹妹的朋友的表妹的…。

 

語意與語法

語言主要可以分成「語意」與「語法」。

語意 (Semantics) 注重的是「詞句的意思」。

還記得我們說過:語言就是大腦思維的符號化嗎?

思維 → 語言 → (傳遞)→ 語言 → 思維

我們要將腦內的思維、用抽象的符號系統來表達,再讓對方從符號系統中、還原出你本來的思維。

聽起來是不是超困難的!如何用形式化的符號,來表達語義,就是現在熱門的研究領域。

這也是抽象圖形厲害的地方——不用很寫實的畫出星球,光靠⭐️這個符號就能讓你知道它代表一顆星星。

另一方面,相較於語意是用來傳遞意思,語法 (Syntax) 則是規定了一個句子組成的規則,也就是我們在解讀這個符號系統時的一套固定的編碼。

語意和語法是可以完全分開的。

人類大腦厲害的地方就在於,有些句子就算不符合語法,還是可以判讀句子的意思。

像是:”I didn’t ate the apple.”(時態不對) 或 “我踢到那一顆狗。”(量詞不對)

雖然看起來怪怪的,但我們還是能抓到關鍵字、理解句子的意思。

然而電腦不像人腦,對不合語法的輸入就沒有那麼寬容。

像如果你在程式碼輸入(漏了一個括號):

print(x+1

就會看到電腦噴出:

*****SYNTAX ERROR*****

雖然語法錯誤,但其實對人類來說、還是看得懂對方想做的事情。

另外,有些句子雖然合乎語法,但是完全沒有意義。

喬姆斯基提出了一個經典的例子:

Colorless green ideas sleep furiously.

(無色的綠色想法狂暴地沈睡)

按照語法來說是正確的,但按照語意卻是荒誕不羈的。(啊,這似乎是近來頗受文青們喜愛的文學用法呢)

接下來讓我們看看,喬姆斯基生成語法理論的運用——電腦中的語言。

 

電腦如何判讀高階語言?

電腦要怎麼知道你現在輸入的句子,是不是包括在這個語言內、是它可以判讀的句子當中呢?

有幾種方法:

第一個方法叫窮舉法。我們可以把符合該語言中的字串窮舉出來。反正當電腦比對不出來時,就表示這句子不合法。

但這是很可怕的方法。因為我們每個人都可以講出無限多句不同的句子。

假設世界上最長的句子是:「晏晏是一個喜歡吃牛排、生魚片、巧克力蛋糕…(下略一億種食物)的孩子。」

想要把它變得更長,只要再加一句:「聽阿琳說:『晏晏是一個喜歡吃牛排、生魚片、巧克力蛋糕…(下略一億種食物)的孩子。』」

或是:「丁丁之前聽阿琳說:『晏晏是一個喜歡吃牛排、生魚片、巧克力蛋糕…(下略一億種食物)的孩子。』」又變得更長了。

數學上證明有無限多的整數一樣,假如你認為已經有個最大的整數,只要再加一、又會有個新的整數。我們剛剛證明了:人所能講出的句子有無限多句。

既然窮舉法很難涵蓋一個語言、並讓電腦判讀這個語言,該怎麼辦呢?

 

第二個方法叫語法描述。

透過有限的替換規則,生成語言中合格的句子。規則是有限的,但這些規則所能生成的句子是無限多的。

怎麼生成呢?這就要靠喬姆斯基的理論——生成語法 (Generative Grammar) 啦。生成語法嘗試給出一套規則,在一個語言中,甚麼樣的詞匯組合能成為正確的句子。

在生成語法理論中,一個句子要麼是「正確的」,要麼是「不正確的」。

換句話說,生成語法的規則是一個算法,會對一個句子的合法度(符合語法 Syntax 的程度)進行判斷,但只會得出「是」或「否」的結果。

所以就會看到我們在寫程式時遇到的 Syntax Error 訊息,代表電腦判斷不過你這個句子屬於它看得懂得語言。

要怎麼讓電腦分析人類這樣的語言特性呢?

 

形式語言

形式語言在研究的就是——如何寫出一個語言、並讓電腦能判斷該語言。

在數學或電腦科學當中,形式語言就是「一個符號字串的集合、加上其所對應規則的集合。」

(In mathematics and computer science, a formal language is a set of strings of symbols together with a set of rules that are specific to it.)

所以我們在分析語言時,需要將語言以數學模型的抽象形式表達。比如機器翻譯、語音識別等,然後利用計算機去針對該數學模型求解。

在下一篇文章開始,將為大家介紹「形式語言」的寫法。