侯晉榮
【摘 要】Perl是一種強大的腳本語言,快捷實用,支持正則表達式,是處理字符串的理想程序。鑒于此,Perl語言可以廣泛應用于語料庫的文本處理,尤其是文本中字符串的匹配、替換和轉換。經驗證,Perl可輕松實現語料庫文本標注形式的替換以及XML和普通文檔之間的相互替換。
【關鍵詞】Perl;字符串;替換;語料庫
一、引言
語料庫是指以電子形式保存的語言材料(Kennedy 2000:3),具有海量存儲,共現語境等優點。目前,語料庫已廣泛應用于二語習得、外語教學、話語分析、語言測試、翻譯研究、文體分析等各個研究領域。語料庫語言學與計算語言學、理論語言學、描述語言學、應用語言學、認知語言學、翻譯等學科融會貫通,形成了一系列的交叉學科,如語料庫翻譯學,語料庫文體學。
文本處理是語料庫建設最基礎最關鍵的一步,文本清潔、格式統一對于后續研究的數據提取和數據分析具有至關重要的作用。簡單的文本清潔和統一的格式處理可以通過Word的“查找、替換”實現。為便于深入分析文本特征,語料庫建設者往往“對語料庫添加信息”(Hunston, 2002:79)并且進行詞類標注(POS tagging)和語義標注(semantic annotation)。標注代碼往往有幾十種甚至上百種,Word很難對標注文本進行統一的格式替換和更改,而應用程序可輕松實現這一目的。PERL語言靈活自由,功能強大,正是文本處理的理想程序。
二、PERL語言的功能
1987年,Larry Wall開發出Perl(Practical Extraction and Report Language),填補了C語言與Unix shell之間的空白,融合了編程語言和腳本語言的優點。這種跨平臺的語言從各種匯編語言中借鑒了語法規則,提供了許多冗余語法,增加系統的穩定性,使程序設計者可以忽略計算機內部資料存儲、類型、處理方法、運算規則、甚至內存越界等等的細節,而將思考中心放在所需要的程序邏輯上。最重要的是Perl內部集成了正則表達式的功能,以及巨大的第三方代碼庫CPAN(Comprehensive Perl Archive Network)。Perl突出的文本處理、豐富的正則表達式、面向對象程序設計以及免費的自由軟件和易學易用的特性,使perl成為語料庫文本處理的首選程序語言。
三、文本處理的程序設計
只要計算機中裝載了Java平臺和ActivePerl,即可使用Perl進行程序設計和操作。設計者可選擇編輯器如Notepad或者Editpad編寫程序。基于強大的正則表達式功能,Perl可輕松地進行字符串的匹配(m)、替換(s)和轉換(tr)。下面就語料庫文本處理中可能遇到的幾個問題嘗試Perl程序的解決方案。
不同語料標注軟件采用的賦碼方式不盡相同,早期的語料庫標注采用尖括號內加詞類代碼(如want
(一)尖括號替換為下劃線
程序1.
步驟1 opendir (DIR, ".") or die "Could not open the current directory"; #open the current dir
@files=readdir (DIR); #read all files in the dir and save them in an array
closedir (DIR); #close the dir
步驟2 foreach $file (sort (@files)) #loop dealing with each file
{
步驟3 next if ($file eq "."); #skip the file named "."
next if ($file eq ".."); #skip file name ".."
next if ($file=~/format\.pl/); #skip the perl script itself|
步驟4 open (FHI, $file) or die "Could not open $file"; #open the file or exit
步驟5 $output="new_".$file; #name the output file
步驟6 open (FHO, ">$output") or die "Could not open $output"; #create output file
步驟7 while ($line=
{
$line=~s/<(\S+)>/_$1/g; #matching and replacing all
print FHO $line; #print to the output file
}
步驟8 close (FHI); #close the input file
close (FHO); #close the output file
}
Perl是一種解釋性語言,其腳本由聲明(declaration)和語句(statement)兩部分構成,在執行字符串的替換前后,有必要對字符串的搜索和文件的處理進行聲明解釋。步驟1調用opendir()函數打開目錄句柄,從中讀取文件數列,然后關閉目錄句柄;步驟2是設置循環語句,依次處理各個文件,直至整個程序結束;步驟3跳過點文件(.),點點文件(..)以及程序文件.pl;步驟4打開源文件;步驟5定義輸出文件名為“new_$file”($file指源文件);步驟6創建并將結果寫入輸出文件(“>”表示寫入);步驟7是整個程序的核心,while控制結構內,定義$line為變量,用運算符=~進行匹配,s函數進行替換(s/
將上述編輯的命令以“另存為…”的方式選擇后綴名.pl保存,保存完畢后雙擊文件,程序即運行。標注方式Do
Do_VBV you_PP want_VAV to_TO go_VB there_ADV ?_?
如若下劃線替換為尖括號僅僅把步驟7中的字符串前后顛倒即可。程序如下:
…
$line=~s/_(\S+)/<$1>/g; #matching and replacing all
…
定義任何非空格字符串(\S+)為變量1,使用s函數替換所有含下劃線字符串為尖括號內含相同字符串。將上述編輯的命令以“另存為…”的方式選擇后綴名.pl保存,保存完畢后運行該程序,Do_VBV you_PP want_VAV to_TO go_VB there_ADV ?_?
替換為Do
(二) 普通文本替換為XML文本
擴展標記語言XML(Extensible Markup Language)是一門新興的標記語言,可以自定義標簽,輕松表達多層結構的數據,方便地與數據庫中的表進行相互轉換,使計算機能夠很簡易地讀取和統計數據。XML文件內容和形式分離的特性,使文檔的更改和搜索變得極為方便。鑒于XML文件的以上特征,大型語料庫多以XML文件格式存儲。下劃線標注的普通文本可編寫以下程序替換為XML文本。
程序3
…
$line=~s/(\S+)_(\S+)/
…
XML使用
堅持_VV 和_CC 完善_VV 社會主義_NN 民主_NN 制度_NN 。_PU
替換為:
在文本開頭添加指令<?xml version="1.0" encoding="GB2312"?>(XML支持多種語種,GB2312指簡體中文),添加文本開始標簽
四、結語
以上探討了Perl語言輔助語料庫文本處理的兩種情況,這僅僅是Perl語言在語料庫應用中發揮的少許作用,Perl語言的強大功能有待于進一步的探索。總之,Perl是一種強大腳本語言,快捷實用,支持正則表達式,是處理字符串的一把好手。
注釋:
i ICTCLAS: Institute of Computing Technology, Chinese Lexical Analysis System中科院漢語詞法分析系統
【參考文獻】
[1] Conway, D. Perl Best Practices. OReilly公司編譯. Perl語言最佳實踐[M]. 南京:東南大學出版社, 2008.
[2] Hoffman, P. Perl for Dummies(3rd edition). 楊皓譯. 輕松學用Perl[M]. 北京:電子工業出版社, 2001.
[3] Hunston, S. Corpora in Applied Linguistics [M]. Cambridge: Cambridge University Press, 2002.
[4] Kennedy, G. An Introduction to Corpus Linguistics[M]. Beijing: Foreign Language Teaching and Research Press, 2000.
[5] Martin C. Perl Programmes Reference. 何黎芳等譯. Perl5 語言命令詳解[M]. 北京:電子工業出版社, 2001.
[6] Thackeray , W. M. Vanity Fair. 楊必譯.名利場[M].北京:人民文學出版社, 1957.