孫 紅,黃甌嚴
(上海理工大學 光電信息與計算機工程學院,上海 200093)
在大數據時代,數據庫和SQL語言已經滲透到各行各業(yè),如何使非技術人員使用自然語言從數據庫中找到相應的信息就成為了一個非常重要的課題.因此,自然語言轉結構化查詢語句(Natural Language to SQL,NL2SQL)任務應運而生.
早期的流水線方法就是將用戶提出的自然語言問題通過模型轉化為一種中間表達,再將中間表達映射為相應的結構化查詢語句.孟小峰等人[1]提出的NChiql使用語義依存樹實現從自然語言到SQL語言的轉化;Unger等人[2]在2012年提出一種基于SPARQL查詢范本和WordNet填充的方案;Li等人[3]在 2016 年提出一種基于“解析樹”的中間表達,需要用戶交互選擇最終結果,系統(tǒng)自動化程度低;Baik等人[4]在2019年提出了TEMPLAR系統(tǒng),只使用SQL語句的歷史查詢日志,沒有使用查詢自然語言的描述,減少人工標注工作;Yin等人[5]針對復雜場景提出使用語法生成樹來提高模型的泛化能力.
基于流水線的方法有一定的局限性,如嚴重依賴于模板和手動設計的特征、對用戶語言的解析不夠靈活等.而基于深度學習的方法不再需要將用戶提出的自然語言問題通過模型轉化為中間表達,可以減少轉化時所產生的信息的丟失,并且不需要手工提取特征,能有效彌補流水線方法的局限性.Wang等人[6]使用Seq2Seq+Copying模型,通過復制機制定位到輸入自然語言問題的其中一部分,將其直接作為結構化查詢語句的部分輸出,但這種方法可能會存在語法錯誤;對此,Xu等人[7]在2017年提出了一個名為SQLNet的模型,通過填充預先定義好SQL查詢的模板能大幅度減少輸出SQL查詢的語法錯誤,提高準確度.
深度學習模型需要大量的自然語言查詢與SQL查詢的配對標注工作,預訓練模型可以很好地解決這個問題.隨著ELMO[8](Embedding from Language Models)、GPT[9]、BERT[10](Bidirectional Encoder Representations from Transformers)等預訓練語言模型在NLP任務上取得更好的結果,并在這些模型的基礎上催生出了一些新方法,如RoBERTa[11]、XLNet[12]、ERNIE[13]、FastBERT[14]、MobileBERT[15]、MTL-BERT[16]等.
He等人[17]提出了X-SQL模型,該模型利用MT-DNN預訓練模型對自然語言查詢和數據庫模式進行特征提取來提升準確度.Yu等人[18]提出的TypeSQL模型將Seq2Seq模型的方式轉換成為了插槽的方式,最大限度地融合了文本信息.Yu等人[19]提出了SyntaxSQLNet模型,該模型針對Spider數據集,引入結構性信息,通過數據增強的方式提升準確率.Ben等人[20]提出了Global-GNN模型,該模型利用關系數據庫的結構信息,使用全局信息重新調整序列的方式對模型進行優(yōu)化.Wang等人[21]提出了RAT-SQL模型,該模型將自然語言問句、表格信息以及表格列名同時建模,利用字符串匹配的方法提升模型效果.Yin等人[22]提出了TaBERT模型,聯(lián)合自然語言問句和結構化的表格數據進行建模,采用弱監(jiān)督的方式提升模型效果.
本文提出了一種融合LSTM的自然語言轉結構化查詢語句模型,解決了現有模型存在的無法捕捉各類別間依賴和自然語言問句與數據表格中的數據不一致的問題.實驗結果表明本文提出的算法在分類模型和條件值模型兩個子任務上都要遠優(yōu)于其他對比算法模型,完整模型的平均準確率達到82.8%.
SQLNet模型將一個自然語言問句所對應的SQL語句分解為SELECT子句和WHERE子句兩部分,使用序列到集合(Sequence-to-set)的方法解決WHERE子句中的條件順序無關的問題.SQL語句的解耦方式如圖1所示.
圖1 SQLNet中的SQL語句解耦圖Fig.1 SQL decoupling diagram in SQLNet
SQLNet模型對每一個子部分的模型構建相似,以對WHERE子句中的列WHERE-Column進行預測為例,模型結構如圖2所示.其中LSTM_q表示自然語言問句經過的LSTM網絡,LSTM_c表示表格列名經過的LSTM網絡,這兩個LSTM網絡不共享參數.LSTM_qc表示兩個網絡最后一個隱層輸出的拼接.
SQLNet模型中的各個分類子模型在編碼階段采用了自然語言問句和數據表格中的列兩部分分開編碼的方式,分別經過BiLSTM網絡編碼,再將各自的隱層狀態(tài)拼接用于后續(xù)分類任務.這種使用兩個神經網絡編碼的方式,切斷了自然語言問句和數據表格列的內在聯(lián)系.針對上述問題,本文采用預訓練語言模型對輸入數據進行編碼,使用單個編碼模型替代兩個編碼模型的方式.
預訓練語言模型使用大量通用領域數據對模型進行預訓練,使模型具備通用領域的知識,能夠區(qū)分不同的特征.預訓練語言模型使用SEP分隔符來分隔句子輸入,本文將列名作為單個句子,對輸入進行改造后的SQLNet模型如圖3所示.
此外,本文對損失函數進行了改進,在對SELECT子句和WHERE子句的列名進行訓練時,由于只有少數的列會被選中作為正例,大多數的列都是負例,數據中存在非常嚴重的類別不平衡問題.本文針對上述問題對相應分類問題的交叉熵損失函數做出修正,修正結果如公式(1)所示.
(1)
其中Loss為對SELECT子句和WHERE子句的列名分類的損失函數.y′表示模型的輸出結果,y表示真實標簽結果,表示第i個模型,α為正樣本所附帶的權重,用來平衡正負樣本不均衡的問題,本文根據經驗值取α=2.
與改進SQLNet模型將NL2SQL單任務解耦成多任務的設計思路類似,本文提出了一種融合LSTM的自然語言轉結構化查詢語句模型,將自然語言轉結構化查詢語句問題分解成兩個子問題,分別提出分類模型和條件值模型.
本節(jié)將NL2SQL單任務解耦成分類模型和條件值模型兩部分任務,其中分類模型對WHERE子句的條件值VAL之外的其他部分進行預測.以條件間的關系cond_conn_op為例,條件間的取值只存在{0:"",1:"and",2:"or"}3種,因此將其作為分類問題來進行處理.條件值模型則是對WHERE子句的條件值VAL進行預測,由于條件值VAL存在數值和文本兩種類型數據,與其他部分不同,需要單獨處理.模型結構如圖4所示.
圖4 融合LSTM的NL2SQL模型結構圖Fig.4 Diagram of NL2SQL model fused with LSTM
在自然語言轉結構化查詢語句的任務中,模型輸出對應一個完整的SQL語句,本文將模型輸出的SQL語句分解成SELECT子句與WHERE子句兩部分,與SQLNet模型相似,定義了SQL語句輸出的模版,通過填槽的方式實現對應槽位的填充,模版如圖5所示.
圖5 SQL語句輸出模版圖Fig.5 SQL statement output template map
除了條件值cond_val之外,其它槽位的填充的取值都是有限的,因此可以將其余部分都作為分類任務來進行處理.在處理過程中,模型首先將輸出映射為一個n維向量,其中n為每個分類任務所對應的類別數量,再使用softmax函數計算每個類別所對應的概率大小,最大概率所對應的類別即為模型預測的結果.
圖6 分類模型結構圖Fig.6 Classification model structure diagram
輸入向量首先使用預訓練模型處理,然后通過LSTM長短時記憶網絡可以得到輸入隱層狀態(tài)HCLS和每一列的對應編碼向量隱層狀態(tài)HVi,之后再對各個槽位填充進行分類,如圖6所示.在SELECT子句中,數據表中選擇的列sel和列之間的聚合操作agg存在著對應關系,模型只會對被選中的列進行聚合操作,因此在模型預測時sel和agg的結果將會同時得到.在WHERE子句中,同理條件列cond_col和條件比較符cond_op也存在一一對應的關系,處理方法和sel與agg相同.HCLS隱層狀態(tài)向量是對完整輸入編碼的表達,包含Question和每一列COL的語義信息,用于預測WHERE子句中各個條件列之間的關系cond_conn_op.
在完成分類任務之后,為了得到完整SQL的預測語句,還需要對WHERE子句的條件值cond_val進行預測.但自然語言靈活性較高,簡單的指針網絡無法實現判別同義詞.針對自然語言描述與表格數據描述不一致的問題,本文采取不同的方式分別對文本類型數據和數值類型數據進行處理.
3.3.1 文本類型數據的處理
對于文本數據的相似表達,本文選擇條件比較符“=”將相近詞構造為一個候選條件Candidate,如:“騰訊=鵝廠”等.
3.3.2 數值類型數據的處理
對自然語言中數值表達不規(guī)范問題,本文使用正則表達式對所有語句進行標準化處理,如17年標準化后為2017年.
之后,將預處理過的輸入文本送入預訓練語言模型進行編碼.由于每一列都會作為候選值送入模型,不需要捕捉上下文之間的關系,在條件值模型中不用經過LSTM網絡處理,使用編碼得到的輸入編碼向量ECLS分類即可.分類目標為該候選條件Candidate是否為WHERE子句中的條件,模型結構如圖7所示.
圖7 條件值模型圖Fig.7 Conditional value model diagram
由于分類模型和條件值模型的最終目的是分類,本文使用分類任務常用的交叉熵損失函數作為每個分類任務的目標函數,而模型的目標函數即所有分類任務目標函數之和,本文的模型優(yōu)化方向是最小化該目標函數,如公式(2)所示:
(2)
其中xi表示第i個類別的輸入,yi表示第i個類別的真實標簽,P(xi)表示第i個類別的模型預測輸出結果,N表示類別總數.
NL2SQL數據集是一個公開的數據集,由追一科技在2019年和天池共同舉辦的首屆NL2SQL挑戰(zhàn)賽中提出,主要使用金融以及通用領域的表格數據作為數據源,并以這些表格為基礎標注自然語言與SQL語句的匹配對,該數據集的誕生主要是為了中文的自然語言轉結構化查詢語句研究.數據集收集了4萬條有標簽數據作為訓練集,1萬條無標簽數據作為測試集.
實驗1.分類模型實驗結果
在分類模型實驗中,各個模型的分類結果見表1.其中,sel表示SELECT子句中的條件列,agg表示sel選中的條件列之間的聚合操作,cond_col表示WHERE子句中的條件列,cond_op表示WHERE子句中對應條件列cond_col的條件比較符,cond_conn_op表示WHERE子句中各個條件之間的關系.
表1 各個子分類模型準確率Table 1 Accuracy of each sub-classification model
從實驗結果來看相較于SQLNet等模型使用BiLSTM進行編碼,本文使用了近年來被驗證效果最佳的BERT預訓練語言模型進行編碼,對于文本特征的提取能力有大幅提升.同時這也充分說明在預訓練語言模型編碼之后加入LSTM捕捉特征的有效性,加入LSTM優(yōu)化后的模型性能得到大幅提升.
實驗2.條件值模型實驗結果
在條件值模型中,對于文本類型條件值,本文將數據中出現的25個表達不一致的高頻詞進行統(tǒng)一替換;對于數值類型條件值,本文將自然語言問句中所用的中文數字表達替換為阿拉伯數字,并對不同的年月份表達進行標準化處理.
本實驗中對比了不同模型中條件值的準確率,依次來分析對文本數據和數值數據單獨處理的有效性.表2中第2列數值類型+文本類型表示對應的某條SQL語句中既包含數值類型條件值,也包含文本類型條件值.條件值模型結果如表2所示.
表2 各個算法條件值模型準確率Table 2 Accuracy of each algorithm condition value model
從結果可以看出自然語言問句經過本文的模型能夠得到最好的效果,這是因為首先在第一階段的分類任務上,本文提出的分類模型能夠達到非常高的準確率,其次與其他對比模型使用的指針網絡不同,本文將文本類型條件值和數值類型條件值采取不同的方式處理,解決了自然語言問句與表格數據中的條件值經常存在的無法對齊的問題.
實驗3.完整模型實驗結果
在完成分類模型與條件值模型之后,本文將得到的結果進行融合,通過填槽得到轉化之后完整的SQL語句,使用邏輯準確率(Logic Form Accuracy)和執(zhí)行準確率(Execution Accuracy)作為評價指標用來驗證最終的模型效果,實驗結果如表3所示.表3中第4列平均準確率表示邏輯準確率和執(zhí)行準確率的平均值.
表3 自然語言轉結構化查詢語句實驗結果表Table 3 NL2SQL experimental result table
從結果來看,本文所提出的模型在上述的指標上都要優(yōu)于其他對比模型,比對比模型中效果最好的SQLNet+BERT模型平均準確率高出21.8%.這是因為本文使用了預訓練語言模型并做了微調,使模型在編碼階段能得到更好的特征.此外,本文在分類模型和條件值模型的各個類別的準確率上效果也有很大提升,這主要得益于文中提出的正則匹配等文字對齊優(yōu)化處理.
實驗4.消融實驗結果
其中基線BERT模型使用BERT-wwm-ext,微調數據量表示對基線模型微調所使用的數據量,其中BERT+TAPT使用了任務中所使用的全部自然語言問句.
表4 預訓練語言模型微調結果表Table 4 Pre-trained language model fine-tuning result table
由表4知,本文對預訓練語言模型進行微調能夠大幅提高完整模型的效果,BERT模型在領域自適應模型微調(DAPT)中可以看出,隨著微調數據量的增加,完整模型的平均準確率也相應的得到提高,在使用461M領域數據微調模型時平均準確率達到最大值82.8%,當微調數據量繼續(xù)增加到847M時,平均準確率趨于飽和,微調數據量與平均準確率之間的關系如圖8所示.
圖8 微調數據量與平均準確率關系圖Fig.8 Relationship between the fine-tuned data and the average accuracy
BERT模型在任務自適應模型微調(TAPT)中可以看出,預訓練語言模型在少量(23M)的任務數據上進行微調即可達到在領域自適應模型微調(DAPT)中使用228M數據的效果,然而由于任務能夠使用的數據量有限,只有23M數據能夠使用,限制了模型效果的進一步提升.
本文主要是對NL2SQL中文公開數據集自然語言轉結構化查詢語句的研究,主要創(chuàng)新點在于提出了一種基于改進的SQLNet模型以及一種基于LSTM的自然語言轉結構化查詢語句.本文所做的主要工作如下:
1)提出了基于SQLNet的自然語言轉結構化查詢語句改進模型.本文首先對SQLNet所用的編碼方式進行了改進,采用最新的預訓練語言模型替換SQLNet所使用的雙向長短時記憶網絡,充分利用了預訓練語言模型對特征的表征能力.然后對模型所使用的損失函數進行了修正,解決了在對列名預測時所產生的嚴重的類別不平衡問題.并通過實驗證明了上述改進能夠提升SQL語句的預測準確率.
2)提出了融合LSTM的自然語言轉結構化查詢語句模型.本文首先通過對預訓練語言模型進行微調的方式提高特征在目標任務上的表達能力.然后提出了將模型解耦為分類模型和條件值模型來生成SQL語句,其中分類模型部分經過預訓練語言模型編碼之后,再經過LSTM對各類別之間的依賴關系進行捕捉,提升了SQL語句的預測準確率;本文在對條件值模型處理的過程中,對文本類型和數值類型分別進行處理,文本類型條件值從數據表格中取值并進行判斷,數值類型條件值從自然語言問句中獲取,由此解決了自然語言問句與數據表格中的數據不一致的問題.
3)通過對比實驗驗證本文提出的模型的有效性,并通過消融實驗分析模型中各個對模型的貢獻.實驗結果表明,本文提出的方法在分類模型和條件值模型兩個子任務上都要遠優(yōu)于對比算法模型,完整模型的平均準確率最高,說明了本文提出的模型能夠產生更準確的預測.