文/張超
在基于語料庫的語法研究中,我們常常需要檢索統計語法項在語料中的出現頻率。就當前主流的語料庫前端檢索功能來看,對于連續文本串的語法項的檢索統計倒是很方便,只需用語法項作為關鍵詞在語料中進行檢索即可輕松獲得該語法項在語料庫中的出現頻次。比如檢索現代漢語語氣詞“呢”的應用情況,只需將“呢”作為關鍵詞輸入檢索即可。而對于非連續多項語法構式而言,當前語料庫前端程序往往無法一次性檢索出結果,而要通過兩次以上的檢索,甚至還要將檢索結果集導出后再輔以人工排檢才能得到所需要的結果。比如,要檢索“怎么……法”這個語法構式的出現情況,按目前語料檢索的常規技術方案,可以先檢索含有“怎么”的用例,然后再從結果集中檢索含有“法”的用例。這樣二次檢索后,得到的仍然不是最終想要的結果,因為“法”位于“怎么”之前的用例并不符合要求,但也會出現在二次檢索結果集之中,比如“法人代表怎么能這樣說話”這樣的例句就無法在二次檢索結果集中自動排除,只能依靠人工來排檢。這就比較耗時耗力。因此,探究一種專門針對“怎么……法”之類非連續多項語法構式的檢索程序方案,對語法研究將有積極的意義。本文擬專門探討非連續雙項語法構式的檢索程序設計方案,程序設計工具為易語言V5.9版。
Adele E.Goldberg(2003)將構式定義為“當且僅當C是一個形式-意義匹配對應體<Fi,Si>,且該匹配對應體的形式或意義的某些方面不能通過C的組成成分或者其他先前已知結構形式而完全預測出來,那么C就是構式”。德國學者馬丁·休伯特(Martin Hilpert)(2016:16)進一步指出,“如果一個表達形式的意義不能從其各組成部分的意義之中推斷出來,那就毫無疑問地得出結論,即人們必須得把這個表達形式本身當作一個形式-意義匹配對應體來學習,換言之,它就是一個構式”。根據構式的定義,現代漢語中像“雖然......但是......”、“如果.....就.....”等關聯詞結構,像“怎么/如何.....法”等都屬于構式。我們把含有兩個項目且兩個項目之間有其他文本存在的構式稱為非連續雙項語法構式。比如“怎么......法”,實際應用中往往是“怎么V法”的模式,即兩個項之間要插入動詞,所以“怎么......法”就是一個非連續雙項語法構式。
基于語料庫的語法研究中,常常需要統計一些語法項的出現頻次。對于單詞項的語法項,按傳統的關鍵詞檢索方式即可解決,但對于非連續雙項語法構式,用傳統的關鍵詞檢索技術無法滿足需求,即便采取結果集中二次關鍵詞檢索的手段,也難以檢索出完全符合要求的結果。這是因為,傳統的關鍵詞檢索技術并不是為非連續雙項語法構式的檢索需求而生的。
在語法研究中,非連續雙項語法構式的檢索需求可概括為以下幾點:
A.構式中的兩個詞項必須在同一個句子中同現,并且出現順序不能顛倒;
B.兩個詞項之間存在一定的距離,即兩個詞項之間應當有其他詞語,存在一定量的間隔文字;
C.在檢索時應當允許自主設定詞項之間的間隔文字數量,以便進行更細致深入的考察分析。
D.檢索結果集要能夠導出為TXT文檔或EXCEL文檔,以便進一步分析處理。
比如檢索詢問行為方式的 “怎么……法……”這個非連續雙項語法構式,符合要求的句子應當是如下這類(用例來自國家語委現代漢語語料庫):
(1)有1、2、3這三個數字,還有一個小數點,至于怎么排法,全忘了。
(2)國王問:"怎么個好法?"
(3)黃莉婭把紙高帽往頭上一扣,笑嘻嘻地,“怎么個游法?”
而像如下三類用例則不能被列入檢索結果集之中。
1.詞項順序與檢索構式不一致用例,如:
(4)這就是說法不是一般的行為規則,它與習慣或道德不同,法是一種特殊的行為規則,是統治階級基于經濟上的生產、交換、分配關系和政治上統治與被統治關系,把自己的意志客觀化、條文化,以便使社會上的人們不僅知道應該怎么做,而且也知道必須怎么做。
(5)他威脅劉法說:"當年你在京城時,曾親手從皇帝那里接過命令,你并且說一定能取勝,怎么現在不想出兵了呢?
2.只包含第一個詞項的用例,如:
(5)我們的人民怎么能夠沉默?
(6)試回想一下看,他們是怎么鉆空子的。
3、兩個詞項緊鄰的用例,如:
(7)怎么法國那時也是八國聯軍之一?
(8)怎么法不容情?
由以上需求可知,傳統的關鍵詞匹配檢索技術的確不能滿足需求,得根據非連續雙項語法構式的特點,設計專門的檢索程序來實現。
“易語言是中國人自主開發,適合國情,不同層次不同專業的人員易學易用的漢語編程語言。”在易語言中,本程序的實現要用到 “尋找文本()、倒找文本()、GBK_取文本長度()、取文本右邊()、取文本左邊()”等命令。
考慮到用戶應用上的方便,檢索輸入界面設計力求簡潔,并允許用戶設置關鍵詞左側和右側要顯示的字數;如果是雙關鍵詞,還要允許用戶自定義兩關鍵詞之間間隔的字數。界面如圖1所示。
檢索非連續雙項語法構式用例時,在關鍵詞文本框中輸入兩個詞項,詞項之間加一個空格即可。在檢索代碼中,通過“尋找文本()”命令搜尋關鍵詞內部的空格,如果找到空格,則判定為非連續雙項語法構式關鍵詞,也可稱為雙關鍵詞。建立局部變量“第一關鍵詞”和“第二關鍵詞”分別記錄空格前后的關鍵詞項,并通過“GBK_取文本長度()”確定好關鍵詞的長度,為后續提取語句作準備。代碼如下:
第一關鍵詞=取文本左邊 (搜索關鍵詞,尋找文本 (搜索關鍵詞,“ ”,,假) -1)
第二關鍵詞=取文本右邊 (搜索關鍵詞,取文本長度 (搜索關鍵詞) -倒找文本 (搜索關鍵詞,“ ”,,假))
第一關鍵詞長度=GBK_取文本長度 (第一關鍵詞)
第二關鍵詞長度=GBK_取文本長度 (第二關鍵詞)
關鍵詞之間間隔字符數=到整數 (編輯框_字數.內容)
然后將語料文件內容讀到到超級文本框,再計算被搜尋文本的總長度。
為方便檢索和測算文字長度等,可以在軟件界面放一個超級文本框,設置可視屬性值為假。
超級編輯框3.內容=刪全部空 (到文本 (讀入文件 (要搜索的路徑數組 [n])))
被搜尋文本總長度=超級編輯框3.取文本長度 ()
接下來用超級文本框的“尋找()”命令搜尋第一關鍵詞,用變量記錄所找到的關鍵詞出現位置。
當前找到的關鍵詞起始位置=超級編輯框3.尋找 (起始搜尋位置,,,第一關鍵詞)
接著根據用戶設定的兩關鍵詞間隔字數搜尋第二關鍵詞。先在指定位置區域取和第二關鍵詞同等長度的文本串,判斷所取值是否與第二關鍵詞相同,創建一個邏輯變量“是否取得第二關鍵詞”存儲判斷結果。
第二關鍵詞起始位置=當前找到的關鍵詞起始位置+第一關鍵詞長度+關鍵詞之間間隔字符數
超級編輯框3.起始選擇位置=第二關鍵詞起始位置-1
超級編輯框3.被選擇字符數=第二關鍵詞長度
第一關鍵詞后的取值-超級編輯框3.被選擇文本
.如果 (第一關鍵詞后的取值-第二關鍵詞)
是否取得第二關鍵詞 = 真
.否則
是否取得第二關鍵詞 = 假
如果變量“是否取得第二關鍵詞”的值為“真”,通過超級文本框取出含關鍵詞的語句并加入到檢索結果列表框,然后將起始搜尋位置移到所找到的第一關鍵詞之后。具體代碼如圖2所示。
變量“當前找到的關鍵詞起始位置”值如果不為-1,且起始搜尋位置也小于被搜尋文本總長度時,程序要循環執行以上過程,直到搜索至被搜尋文本最末位置且找不到相應關建詞為止。
以上程序執行完畢后,可能還會檢索出如下這樣的用例:
(1)這筆賬誰負責還?怎么還?
“我沒辦法,要命有命!”長順的淚已在眼圈中轉。

圖1

圖2

圖3
很顯然,這個例子中的“怎么”與“法”分屬于不同的句子,并不是一個非連續雙項語法構式,卻被列入到檢索結果中。這是因為,以上程序中沒有排除“怎么”和“法”之間有換行符的情況。因此,以上程序執行中取得含關鍵詞的語句在輸出前應當增加檢測是否含有換行符的情況,不含換行符的才予輸出。含關鍵詞語句輸出部分代碼優化如圖3所示。
如此一來,就減少了不合要求的語句的干擾輸出。
筆者選擇《紅樓夢》全本語料進行測試,全文90余萬字,設置兩關鍵詞間隔字數為2,檢索完成并輸出結果集共耗時10秒左右,運行速率有待提升,但對語法研究來說,這個速率當在可接受范圍。
檢索測試也發現了如下這樣的不合要求的語例:
將此事告訴與尤二姐,又說我怎么操心打聽,又怎么設法子,須得如此方救下眾人無罪。
此例中的“怎么”和“法”顯然不是要檢索的非連續雙項語法構式,“法”只是構成“法子”這個名詞的一個實語素。可見,程序的后續設計應當還要在排除這類語例上下功夫。
針對非連續雙項語法構式的計算機檢索程序的設計,對語法構式研究有非常重要的應用價值。本文基于易語言來設計的計算機程序,檢索結果集基本符合要求,運行速率也在可接受范圍,當可以在語法構式研究實踐中嘗試采用。