強大的語言[從上下文無關語法到上下文有關語法]

     轉載於【強大的語言】www.cnblogs.com/buptzym/p/4828959.html

     我越來越感慨語言之美,語言之強大。

    中文,英文這類自然語言,也可以是C,C#,Python,Lisp這類通用語言,也可能是自己定義的領域特定語言(DSL)。更廣泛的可以是音樂和DNA序列。

    語言就是字符串,一組由不同字符串組成的順序鏈條。然而,大巧不工,越樸素簡單的模式,其能力就越強大。

  •     語言代表了知識: E=mc2
  •     語言代表了美感: "人生若只如初見,何事秋風悲畫扇"
  •     語言代表了力量:"爾曹身與名俱滅,不廢江河萬古流"
  •     語言代表了智慧: (define (fib n) (cond ((= n 0) 0) ((= n 1) 1) (else ( (fib (- n 1)) (fib (- n 2)
  •     語言代表了模式: aa bb cc aaa bbb ccc…


    語言是藝術品,作爲程序員,你應該像對待藝術品一樣對待自己的代碼,精心雕琢它的結構,優化它的性能,像一首詩一樣優美,它是智慧和榮耀的象徵。可惜的是,絕大多數人寫的代碼,連正確都談不上,更枉提美感!
 

語言分類


    我感慨語言之美,是因爲語言的表達能力無窮無盡。結合學習的大量資料和自己的理解,語言可以分成以下幾個層級,每個層級都屬於其下一個層級。
 

LV1:表格

    最基本的語言,顯然是表格,此處亦可代表字典,鍵值對,列表等等。它只有並結構。一般的條件語句和決策,都可以用表格來表示。
    基本操作:並,分枝,循環
    工具:list,dict
    處理模式:循環,索引訪問

    千萬別小看錶格的表現能力,通常的表格只是承載數據,如果能夠承載動作和命令,那麼它將極爲強大,想想Lisp和S-表達式。
 

LV2:正則語言

    用過正則表達式的程序員都知道正則表達式的強大。但正則表達式無法實現計數和嵌套結構。
    基本操作: 表格的基本操作,序列和差集
    工具:狀態機(NFA,DFA)
    處理模式:匹配,模式分析
 

LV3: 上下文無關語言


    因爲狀態機無法處理嵌套結構,因此引入上下文無關語言。該語言引入堆棧,用以保存信息。但通常在實現中,堆棧是隱含在遞歸下降過程的遞歸棧中,而非顯式實現。
    基本操作: 正則語言的基本操作,嵌套,遞歸
    工具:遞歸下降語法分析
    處理模式:生成句法樹,計算
 

LV4:上下文有關語言


    上下文無關語言的各條語句之間是獨立的,沒有環境和上下文。因此難以保存和傳遞狀態。因而產生了上下文有關語言。
    基本操作:上下文語言的基本操作+引用,賦值
    工具:上下文無關語言的工具+符號表
    處理模式:實現通用語言,圖靈完備
 

LV5:自然語言


    以上的那些語言,代表了嚴格的邏輯和條件,用確定的語義模型表達意圖,沒有模糊性和動態性。這樣的語言是可計算的,也有明確的語義模型代表。
然而,當加入模糊之後,其動態性和功能變得強大的多。典型的就是自然語言,它沒有明確的語義模型。現在尚無合適的技術,能夠真正透徹的分析自然語言。

 值得注意的是,我們提到了分枝,循環,並,順序,補,嵌套,遞歸,存儲符號。但依舊沒有提到反饋。反饋不屬於靜態的語言概念,而是運行時的自我調整。

 

LV6:意識和經驗


    很多經驗和知識,是難以用語言表達的,即使能背誦汽車駕駛指南,如果沒有實際的練習,那就是不會開車。別人的經驗,即使勉強用語言表達出來,不論表達的多麼清晰,依然會大打折扣。可以認爲,即使語言相同,而每個人的編譯器(大腦)卻各自不同,因而產生了完全不同的理解。

   我將意識和經驗,看做是運行時的“自然語言”。

 

自然語言


   自然語言用詞彙定義語素,用詞組和句子表達模糊語義,用模糊的上下文語境代替確定的符號表。模糊產生了美感,能夠描述故事,小說,詩歌和各類複雜文本。

 

自然語言的文法


    因爲模糊,所以文法在自然語言中變得次要。符合文法的句子很好,但不符合文法的句子照樣能很好的工作。文法和詞彙都在語言的發展中不斷進化。每天都有新的表達出現,改變纔是最大的不變。一個有趣的問題是,文法也是一種語言,我們能否發現自然語言在發展過程中文法發展的規律?
 

基本操作


    由於自然語言的模糊性,概率論成了分析自然語言的利器。即便如此,我們能做的也非常有限,通過概率論結合一定的規則,可以實現分詞,命名實體識別,詞性預測,句法樹生成,情感分析,關鍵詞抽取,自動摘要生成… 這些技術只能稱爲“自然語言處理”,而無法稱作“自然語言解析”。
如果語料足夠全面,並且能夠覆蓋一個話題的全部語境,那麼我相信純粹的概率論就能獲得最終的勝利。問題是語料的獲取和分析非常複雜和昂貴,這可不是從網上抓下一批新聞數據就能辦到的。在現階段,我更相信經驗規則和概率論結合的處理方法。
 

可計算性


    自然語言是可計算的嗎? 舉個例子:
    如果今天下雨,那麼就坐公交下班。 //這是一個典型的的可計算句子。
    買三斤蘋果,如果有西瓜,就買三斤西瓜。 //這代表了二義性,沒有上下文語境,很難確定真正的策略。
    剩女產生的原因:一是誰都看不上,二是誰都看不上。 //WTF!!
    這還是最普通的例子,詩歌和故事是可計算的嗎?這樣的計算,結果是什麼?

    此處的可計算性和標準概念上的“計算性”可能有所不同。人能理解自然語言就是自然語言可計算的最好證明。 處理自然語言的核心,不是推導,而是聯想。大腦具備了將衆多概念聯繫起來的能力,配合推導和學習,最後付諸行動。
 

我們能做什麼


    既然自然語言如此神奇,而目前又無法構造一臺類似大腦的聯想機器,那麼如何讓處理自然語言走的更遠一些呢 ?編程語言在發展過程中,已經出現了非常完善的編譯技術。能否將編譯技術用在處理自然語言上?

    語言雖然千變萬化,但它是有規律的,其語素是穩定的,比如描述“漂亮”的和數字的概念,其表達數量肯定是有限制的。一個再複雜的組合拆分到子單元時,就變得穩定了。因此我們總能通過規則,構造基本單元的表達,比如數字和時間。進而描述單元組合的方式,形成一套規則樹結構。

    有些處理,更適合用概率分析,如分詞,詞性預測和情感分析。

    我的考慮是,通過一組DSL,利用規則和概率,在一定程度上規避自然語言的多樣性和歧義性,將文本轉換可計算和無歧義的語句,這個過程稱爲“文本規範化”,作爲自然語言的編譯器前端,最終送入一般意義上的編程語言編譯器。 一切都是模式,子模式組合爲父模式,用模式匹配,修改和組裝新模式。

    目前正在做這方面的工作,已經取得了不錯的進步。目前已經能夠計算諸如:
二十七+15*15
十四點五的平方加上八十三除以三點五
 

語言的侷限


     語言有強大之處,也有天生的侷限。比語言更高層級的是意識和經驗。語言本身就像代碼,如果不編譯執行,那就是一堆沒有用的字符串。

    人類的理解問題和傳遞信息時,語言可能並不是最優的媒介,有時一圖勝千言,多媒體的表達能力能夠更好的激勵聯想。實踐的價值可能比語言本身重要得多,但把運行時的概念(意識)和編譯時的概念(語言)比較,這本來就是不公平的嘛。

   上班一年半了,別人會問我做什麼工作,之前這個問題有些難以回答,事實上,我第一年主要做語音合成(TTS)的文本處理前端, 而這半年,對編譯原理,文法推斷和模式分類感興趣。這個問題慢慢變得清晰起來,那就是研究“語言”。


    顯然這篇文章裏有不少錯誤,我連一本編譯原理都沒看完呢,歡迎吐槽。之後,我將總結一系列有關DSL的一些知識。

發佈了34 篇原創文章 · 獲贊 53 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章