北京航空航天大學(xué) 李瀟辰
REBOL:語料庫研究者的編程語言
北京航空航天大學(xué) 李瀟辰
隨著語料庫語言學(xué)的不斷發(fā)展,編程日益成為本領(lǐng)域研究者的必備技能。然而常見的編程語言往往較為復(fù)雜,不太容易學(xué)習(xí)與使用。本文對比了REBOL和其他編程語言在網(wǎng)絡(luò)通信、文本處理和圖形用戶界面設(shè)計等領(lǐng)域的表現(xiàn),指出REBOL具有簡潔直觀、功能強(qiáng)大、易學(xué)易用的特點(diǎn),能有效地協(xié)助研究者完成語料獲取、清理、存儲、分析以及圖形用戶界面設(shè)計等各類任務(wù),是研究者的理想工具。
REBOL、語料庫工具、編程語言、圖形用戶界面
語料庫語言學(xué)自誕生之日起就十分強(qiáng)調(diào)將計算機(jī)技術(shù)應(yīng)用于語言分析中。隨著研究的深入,傳統(tǒng)分析工具越來越難以滿足日益多元的研究需求。為此,學(xué)者們紛紛呼吁語言學(xué)研究者需要掌握基本的編程技術(shù),以應(yīng)對復(fù)雜的研究情境(Biber 1998:254;桂詩春 2014:6)。本文旨在介紹一門新興的編程語言REBOL,通過結(jié)合研究實(shí)例展示其主要特征,以說明該語言能夠簡潔高效地協(xié)助研究者完成日常工作,是一門理想的工具語言。
語言學(xué)與計算機(jī)的聯(lián)姻起源于上世紀(jì)五六十年代。早期探索多集中于機(jī)器翻譯和人工智能等領(lǐng)域(馮志偉 2011)。這些研究往往以工程目的為出發(fā)點(diǎn),其研究興趣不完全在于探索人類語言的奧秘。然而,有識之士已經(jīng)意識到計算機(jī)用于語言研究的潛力并著手探索。例如,Roberto Busa于1951年開發(fā)了現(xiàn)代索引工具的雛形,能夠讓計算機(jī)幫助語言學(xué)家從大量數(shù)據(jù)中獲取某個詞的索引行進(jìn)行研究。還有部分學(xué)者充分利用計算機(jī)強(qiáng)大的存儲能力,建立了Brown和LOB等語料庫,開創(chuàng)語料庫語言學(xué)的先河。
隨后幾十年里,語言學(xué)家與計算機(jī)科學(xué)家通力合作,不斷改良分析工具,將計算機(jī)學(xué)科的前沿技術(shù)應(yīng)用于語言研究中。由于技術(shù)條件及研究方法的制約,不同時期的分析工具往往帶有鮮明的時代特征。學(xué)界一般認(rèn)為,語料庫分析工具可分為四代(McEnery & Hardie 2012:37-48;許家金、賈云龍 2013;許家金、吳良平 2014)。第一、二代工具多見于20世紀(jì)七八十年代,如CLOC(Reed 1978)、Longman Mini-Concordancer(Chandler 1989)和Micro-OCP(Hockey 1988)等。其中,第一代工具的使用范圍有限,僅適合少數(shù)幾種大中型計算機(jī)。第二代工具雖傳布稍廣,但其功能仍然較為單一,操作也較為繁瑣。
技術(shù)進(jìn)步使得計算機(jī)的性能有了大幅提升。90年代中后期,WordSmith(Scott 1996)、MonoConc(Barlow 2000)、AntConc(Anthony 2005)等第三代分析工具出現(xiàn)并迅速普及。同前兩代工具相比,第三代工具的功能更加豐富,形成索引、搭配、詞表和關(guān)鍵詞等幾大核心模塊,還附帶卡方、互信息及對數(shù)似然率等統(tǒng)計功能。其性能也有較大提升,可輕松處理百萬詞級的語料庫。此外,第三代工具一般價格低廉甚至完全免費(fèi),且多基于Windows平臺,因此使用范圍很廣。2000年后,隨著互聯(lián)網(wǎng)技術(shù)的成熟,楊百翰大學(xué)語料庫平臺(Davies 2005)、
SketchEngine(Kilgarriffet al.2004)、BNCweb(Hoffmannet al.2008)、CQPweb
(Hardie 2012)等第四代工具開始出現(xiàn)。這些工具采取客戶端-服務(wù)器的架構(gòu)模式,將原本只能在本地使用的語料庫搬上網(wǎng)絡(luò),使語言學(xué)家僅通過訪問網(wǎng)站就能進(jìn)行研究。這不僅促進(jìn)了資源共享,也打破了系統(tǒng)平臺的限制。
雖然過去幾十年中,語料庫分析工具取得了重大進(jìn)展,但仍然難以滿足學(xué)界日益多元化的需求。McEnery & Hardie(2012:41)指出,現(xiàn)有的主流語料庫工具僅能完成最常見的研究任務(wù),難以實(shí)現(xiàn)搭配網(wǎng)絡(luò)(collocational network)和多維分析(MDA)等較為復(fù)雜的功能。而語料庫工具往往受制于開發(fā)團(tuán)隊(duì)規(guī)模和資金支持,軟件開發(fā)和更新都較為緩慢,無法跟上語料庫語言學(xué)的發(fā)展水平。此外,目前主流語料庫工具的功能較為固定,難以定制和拓展,尤其難以調(diào)用豐富的第三方工具包對語料進(jìn)行深度分析,故而難以適應(yīng)復(fù)雜的研究情境。
為此,學(xué)界紛紛提倡語料庫語言學(xué)研究者具備一定的編程技能。Biber(1998:256)指出,掌握編程技能將幫助研究者拓展研究范圍,使分析更加精確高效。桂詩春(2014:6)也認(rèn)為,編程技術(shù)將會成為語料庫語言學(xué)研究者必不可少的技能之一,應(yīng)當(dāng)納入研究生教學(xué)體系。學(xué)界也出現(xiàn)了許多專門針對語言學(xué)家的編程教程,涉及Java(Hammond 2002)、Perl(Hammond 2003;Danielsson 2004)、Python(Birdet al.2009)和R(Gries 2009a,b)等語言。然而,這些語言雖然功能強(qiáng)大,但語法規(guī)則普遍較為復(fù)雜,難于學(xué)習(xí)和使用。本文則認(rèn)為,REBOL語法直觀簡潔、易學(xué)易用,能出色完成語料庫語言學(xué)的常見操作,非常適合研究者使用。
REBOL(Relative Expression Based Object Language)是開源免費(fèi)的腳本語言,其語法深受LISP語言的影響,同時也糅合了面向?qū)ο蟮木幊汤砟睢O挛膶⒔Y(jié)合語料庫語言學(xué)常見操作來展示REBOL的特點(diǎn)。
3.1 極致簡約的開發(fā)環(huán)境
REBOL使用起來非常簡單,無需繁瑣的安裝和配置過程。同Perl、Python、Ruby等其他腳本語言相比,REBOL解析器十分小巧,僅有不到1MB大小。且無需任何其他支持系統(tǒng)和配置文件即可獨(dú)立工作。同時,REBOL無需復(fù)雜的集成開發(fā)環(huán)境(IDE),僅用一個文本編輯器就可以完成包括GUI設(shè)計在內(nèi)的全部開發(fā)流程。上述特征使REBOL非常容易安裝、使用及更新:僅需將解析器下載到本地硬盤里即可開始工作,僅需用最新版本覆蓋老版本的解析器即可完成更新1。
REBOL雖然簡約,卻是一門功能強(qiáng)大的通用型語言。其解析器內(nèi)置數(shù)百個精心設(shè)計的函數(shù)和數(shù)十種數(shù)據(jù)類型、幫助文檔、網(wǎng)絡(luò)協(xié)議、多媒體引擎(聲音、圖像和GUI的底層函數(shù))、數(shù)據(jù)庫接口和動態(tài)運(yùn)行庫接口。能夠勝任文字處理、網(wǎng)絡(luò)通信、數(shù)據(jù)庫和圖形用戶界面等領(lǐng)域的任務(wù)。不僅如此,REBOL也具有卓越的跨平臺能力,支持Windows、Mac、Linux和Android等主流平臺。這使得程序能“一次編寫,處處運(yùn)行”,大大降低了重復(fù)編碼所浪費(fèi)的時間和精力。
3.2 易學(xué)易用的語言
REBOL的代碼短小精悍,易學(xué)易用,僅用很簡單的語句就能實(shí)現(xiàn)語料庫語言學(xué)的大部分常見需求。
3.2.1 獲取、存儲語料
REBOL可以幫助研究者方便地獲取和存儲語料。這首先得益于REBOL提供了很方便的輸入輸出(I/O)機(jī)制。例1中,我們用write file str把str的值寫入file中。其中,write是函數(shù),而file和str是write要求的兩個參數(shù)。Write后的第一個參數(shù)決定數(shù)據(jù)去向,而第二個參數(shù)則決定待處理的數(shù)據(jù)。上述語法簡單易懂,類似英語中“動詞+間接賓語+直接賓語”的構(gòu)式,即使沒有系統(tǒng)地學(xué)習(xí)過編程的人也很容易理解。
其次,REBOL還能讓使用者像操作本地資源那樣方便地讀寫互聯(lián)網(wǎng)上的資源,而無需在意網(wǎng)絡(luò)通信的種種細(xì)節(jié)。例2中,我們既可以利用read讀取本地文件里的內(nèi)容(read file)也可以用它下載網(wǎng)頁(read url),而這兩句代碼在語法結(jié)構(gòu)上沒有任何差異。隨著網(wǎng)絡(luò)時代的到來,網(wǎng)絡(luò)業(yè)已成為研究者獲取語料的重要渠道,而REBOL的這一特性使其能夠勝任“網(wǎng)絡(luò)爬蟲”的任務(wù),協(xié)助研究者獲取網(wǎng)上的大量信息。
部分讀者可能發(fā)現(xiàn)讀取的結(jié)果是一堆字母和數(shù)字,和原始文本不一致。這是由于read函數(shù)默認(rèn)按照“二進(jìn)制”的編碼方式讀入文件,而我們需要的是“字符串”。其實(shí),只要在read后面加上/string就能夠讓read按照我們的要求讀入字符串。REBOL允許在函數(shù)后面附加一個或多個“修飾字”,對函數(shù)的功能進(jìn)行微調(diào)。這種機(jī)制兼顧了函數(shù)功能的概括性和細(xì)膩性,使得我們無需為照顧細(xì)微差異而編寫大量代碼。
最后,REBOL還允許一個函數(shù)式接納另一個函數(shù)式作為參數(shù),形成嵌套(embedding)。例如,我們可以將write和read連接起來,僅用一行語句就可以將北外語料庫語言學(xué)團(tuán)隊(duì)的主頁下載并保存到本地硬盤里(例3a)。當(dāng)然,我們也可以在write和read當(dāng)中插入其他函數(shù),對獲取的數(shù)據(jù)進(jìn)行一定的處理。例3b就在write和read之間加入了trim函數(shù),對讀取來的語料進(jìn)行格式整理,刪除多余的空格。上述機(jī)制打通了語句間的隔閡,使函數(shù)可以首尾相接地組成“流水線”,獲取、加工、處理和保存數(shù)據(jù)。代碼也因此言簡意賅2。
3.2.2 處理分析語料
REBOL具有強(qiáng)大的文本處理功能,在處理分析語料的過程中也同樣大顯身手。REBOL獨(dú)創(chuàng)了“方言”(dialect)的概念。每個方言都具有獨(dú)立的詞匯甚至語法系統(tǒng),專門執(zhí)行某類特定的功能。Parse是REBOL最強(qiáng)勁的方言之一,是在正則表達(dá)式基礎(chǔ)上改進(jìn)的產(chǎn)物,擅長各種文本處理任務(wù)。這門方言具有與正則表達(dá)式類似的功能,同時規(guī)避了一些缺點(diǎn)。
讓我們以“匹配電子郵件地址”為例來比較一下兩門語言。在編程實(shí)踐中,我們常需識別給定的字符串是否為合法電子郵件地址。為此,Goyvaerts & Levithan(2009:214)給出了例4a中的正則表達(dá)式,以判斷字符串是否符合RFC 2822標(biāo)準(zhǔn)的電子郵件命名規(guī)則。例4b則給出了parse版本的代碼。對比兩段代碼,我們不難發(fā)現(xiàn),正則表達(dá)式凝練緊湊但難以解讀,若嵌入程序中則更難維護(hù)。而parse代碼雖長但更易懂,其解決問題的思路十分清晰:首先,我們先界定兩類符號,一類可用于電子郵件的用戶名(@之前)部分,我們將之命名為Valid-UserName-Char;另一類可用于電子郵件的域名(@之后)部分,稱為Valid-DomainName-Char。然后我們制定了判斷電子郵件地址合法性的規(guī)則Email-Rule:凡是由至少一個“用戶名符號”(some Valid-UserName-Char)加上一個@符號(“@”)再加上至少一個“域名符號”(some Valid-DomainName-Char)組成的字符串,就是合法郵件地址。在使用時,可以直接將上述規(guī)則連同要檢驗(yàn)的字符串作為參數(shù)傳遞給parse,parse則會根據(jù)匹配情況返回true或者false。
由上述對比可見,兩種語言具有許多顯著差異:正則表達(dá)式內(nèi)部的“詞匯”全部是縮寫和符號,比較抽象,不直觀。而parse的詞匯則全部是自然語言,較為直觀。不僅如此,正則表達(dá)式的句法結(jié)構(gòu)也比較復(fù)雜,即使是經(jīng)驗(yàn)豐富的程序員也必須在熟讀深思之后方能理解。而parse基本承襲了REBOL的語法,語句短小精干,意義一望即知。此外,正則表達(dá)式自成一體,在許多編程語言中都作為獨(dú)立的模塊存在,使用時需要復(fù)雜的載入和設(shè)置(比如Perl的/m, /i等)過程,部分編程語言里正則模塊同主程序間缺乏便捷的交互手段。而parse則與REBOL無縫銜接,無需載入任何外部模塊;語言表達(dá)力強(qiáng),無需外部設(shè)置;允許在內(nèi)部插入REBOL代碼,能方便地調(diào)用其他字符串處理函數(shù)。這些對比說明,parse語言具有易學(xué)、易用和易維護(hù)的特點(diǎn),適于處理和分析語料。
3.2.3 制作GUI
在使用程序時,我們通常希望它具有簡潔美觀的圖形用戶界面(GUI),使我們僅需輕點(diǎn)幾個按鈕就能完成各種功能。然而,目前Perl、Python、Java和R等常見語言均缺乏簡潔、直觀、高效的方法編寫GUI,而REBOL獨(dú)有的GUI方言則填補(bǔ)了這一空白。GUI方言是REBOL下屬的另一個方言,主要功能是協(xié)助使用者創(chuàng)造GUI界面。該方言體積?。ú坏?00KB),簡單直觀,易學(xué)易用,設(shè)計出的窗口美觀大方,幾乎無需改動就可以應(yīng)用到不同平臺上(目前支持Windows和Android平臺)。
下面我們以Hammond(2003:199-201)為例,比較一下Perl和REBOL在制作GUI方面的特點(diǎn)。該案例旨在編寫一個窗口程序,包含一個標(biāo)題、三個按鈕和一個文本框,三個按鈕分別對應(yīng)英、法、德三門語言。當(dāng)用戶點(diǎn)擊按鈕時,文本框中就會用相應(yīng)的語言提問用戶是否會說這門語言。Hammond采用Perl的TK模塊來實(shí)現(xiàn)上述功能,其程序長達(dá)24行(見附錄2)。而用REBOL僅需不到10行(例5)。而且REBOL GUI的代碼更接近自然語言,容易解讀:我們先用do %gui.r3載入含有GUI方言的腳本。然后利用view創(chuàng)建一個窗口。窗口中,從上到下依次有5個控件:第一個是文本框(text),其內(nèi)部文字是“Make a selection:”。最后一個控件也是文本框(t),用于向用戶提問。中間是b1、b2和b3三個按鈕,其文字分別是German、French和English。我們規(guī)定,當(dāng)按動這三個按鈕時(on-action),程序就將文本框t的內(nèi)容設(shè)為相應(yīng)的問題(set-face t)。上述代碼設(shè)計出的窗口如圖1。而Perl TK設(shè)計出的窗口如圖2。
圖1.REBOL GUI窗口圖
圖2.Perl TK窗口圖
由parse和GUI方言的案例可見,“方言”機(jī)制有助于提高程序開發(fā)的質(zhì)量和效率。方言使程序員能夠在較高的抽象層級上編碼,無需花費(fèi)大量精力處理種種底層細(xì)節(jié)和平臺兼容性的問題。這有效地減少了代碼重復(fù),使得程序短小精悍、易于編寫。此外,方言的詞匯和語法規(guī)則有限,且比較接近自然語言,相較一般的編程語言簡單很多,非常容易學(xué)習(xí)與使用。不僅如此,較高的抽象層級也有助于提供統(tǒng)一、標(biāo)準(zhǔn)和可預(yù)測的解決方案,使得程序更加安全穩(wěn)定。上述特征使得用方言寫出的程序易于編寫、調(diào)試和維護(hù),有效地提升了編程的效率和質(zhì)量。
REBOL易學(xué)易用,在字符串處理、網(wǎng)絡(luò)通信和GUI設(shè)計等方面優(yōu)點(diǎn)突出,可勝任語料獲取、清理、分析和GUI制作等各類任務(wù)。簡潔高效的語法使其非常適合編寫“一次性程序”和搭建原型系統(tǒng),幫助語言學(xué)家快速高效地完成日常工作。
當(dāng)然,REBOL也并非十全十美。首先,它并不是一個“熱門”的語言。由于借鑒了許多LISP語言的特征,REBOL與主流編程語言(C++、Java等)差別較大。大部分專業(yè)程序員不太容易接受其設(shè)計理念。這也導(dǎo)致了REBOL的市場占有率較低,語言社團(tuán)規(guī)模較小,缺乏相應(yīng)的培訓(xùn)機(jī)構(gòu)和教材,也缺乏像Perl、Python和R那樣豐富的第三方模塊和函數(shù)庫。其次,REBOL仍在不斷改進(jìn)中,部分功能還未來得及實(shí)現(xiàn),現(xiàn)有版本也存在一些問題。
雖然上述因素在一定程度上制約了REBOL的普及和發(fā)展,但都不是難以逾越的障礙。事實(shí)上,近年來REBOL的受眾已經(jīng)開始逐漸增加,出現(xiàn)了蔡學(xué)鏞(2012)等通俗易懂的入門教材。REBOL的開發(fā)進(jìn)度雖然較為緩慢,但仍在不斷進(jìn)步,相信其后續(xù)版本會更加完善。
總之,REBOL是一門“性價比”很高的語言,值得深入學(xué)習(xí)和研究。
注釋
1.REBOL的具體安裝方法和注意事項(xiàng)見附錄1。
2.過于復(fù)雜的嵌套會導(dǎo)致語句晦澀難懂,因此需酌情使用。
Anthony, L.2005.AntConc [CP].Tokyo: Waseda University.
Barlow, M.2000.MonoConc Pro [CP].Houston: Athelstan.
Biber, D., S.Conrad, R, Reppen.1998.Corpus Linguistics: Investigating Language Structure and Use[M].New York: CUP.
Bird, S, E.Klein & E.Loper.2009.Natural Language Processing with Python[M].Cambridge: O’Reilly.
Chandler, B.1989.Longman Mini-Concordancer [CP].Harlow: Longman.
Danielsson, P.2004.Simple Perl programming for corpus work [A].In J.Sinclair (ed.).How to Use Corpora in Language Teaching[C].Philadelphia: John Benjamins.225-246.
Davies, M.2005.The advantage of using relational databases for large corpora: Speed, advanced queries and unlimited annotation[J].International Journal of Corpus Linguistics10(3): 307-334.
Goyvaerts, J.& S.Levithan.2009.Regular Expressions Cookbook[M].Cambridge: O’Reilly.
Gries, S.T.2009a.Quantitative Corpus Linguistics with R: A Practical Introduction[M].New York: Routledge.
Gries, S.T.2009b.Statistics for Linguistics with R: A Practical Introduction[M].New York: Mouton de Gruyter.
Hammond, M.2002.Programming for Linguists: Java Technology for Language Researchers[M].Oxford: Blackwell.
Hammond, M.2003.Programming for Linguists: Perl for Language Researchers[M].Malden: Blackwell.
Hardie, A.2012.CQPweb - Combining power, flexibility and usability in a corpus analysis tool [J].International Journal of Corpus Linguistics17(3): 380-409.
Hockey, S.1988.Micro-OCP [CP].Oxford: OUP.
Hoffmann, S., S.Evert, N.Smith, D.Lee & Y.Prytz.2008.Corpus Linguistics with BNCweb: A Practical Guide[M].Frankfurt am Main: Peter Lang.
Kilgarriff, A., P.Rychly, P.Smrz & D.Tugwell.2004.The Sketch Engine [A].InProceedings of the Eleventh International Congress of Euralex 2004[C].Bretagne: Universite de Bretagne-Sud.105-116.
McEnery, T.and A.Hardie.2012.Corpus Linguistics: Method, Theory and Practice[M].Cambridge: CUP.
Reed, A.1978.CLOC User Manual[Z].Birmingham: University of Birmingham.
Scott, M.1996.WordSmith Tools[CP].Oxford: OUP.
蔡學(xué)鏞,2012,《編程ING:人人都能學(xué)會程序設(shè)計》[M]。北京:電子工業(yè)出版社。
馮志偉,2011,計算語言學(xué)的歷史回顧與現(xiàn)狀分析 [J],《外國語》(1):9-17。
桂詩春,2014,語料庫語言學(xué)答客問 [J],《語料庫語言學(xué)》(1):1-15。
許家金、賈云龍,2013,基于R-gram的語料庫分析軟件PowerConc的設(shè)計與開發(fā) [J],《外語電化教學(xué)》(1):57-62。
許家金、吳良平,2014,基于網(wǎng)絡(luò)的第四代語料庫分析工具CQPweb及應(yīng)用實(shí)例 [J],《外語電化教學(xué)》(5):10-15,56。
附錄1:REBOL的使用方法及注意事項(xiàng)
REBOL目前有兩個主要版本:REBOL 2.7和REBOL 3。其中,前者較為成熟,但不支持Unicode,無法處理漢語等東亞語言。后者則完全基于Unicode構(gòu)建。本文使用的是Saphirion公司研發(fā)的REBOL 3解析器,其內(nèi)置了圖形處理引擎,可配合該公司開發(fā)的GUI方言腳本制作GUI。讀者可到該公司的網(wǎng)站(http:// development.saphirion.com/downloads/)下載這兩個文件。使用時需將解析器與GUI方言腳本放在同一文件夾中。
REBOL 3完全基于UTF-8構(gòu)建,其代碼需用UTF-8編寫,如果腳本涉及讀寫文本文件,則讀寫的文件也必須采用UTF-8編碼。涉及網(wǎng)絡(luò)通信的腳本可能會因網(wǎng)絡(luò)狀況不佳或網(wǎng)絡(luò)端口被占用而運(yùn)行緩慢甚至失敗。
附錄2:Perl TK源碼(Hammond 2003:199-201)
通信地址:100191 北京市北京航空航天大學(xué)外國語學(xué)院