語義解析(Semantic Parsing)是天然語言處理技術的核心任務之一,涉及語言學、計算語言學、機器學習以及認知語言等多個學科,在近幾年中得到了普遍關注,語義解析任務有助於促進機器語言理解的快速發展。算法
本文重點介紹語義解析技術中的Text-to-SQL任務,讓機器自動將用戶輸入的天然語言問題轉成數據庫可操做的SQL查詢語句,實現基於數據庫的自動問答能力。sql
任務介紹及研究動機數據庫
當前,大量信息存儲在結構化和半結構化知識庫中,如數據庫。對於這類數據的分析和獲取須要經過SQL等編程語言與數據庫進行交互操做,SQL的使用難度限制了非技術用戶,給數據分析和使用帶來了較高的門檻。人們迫切須要技術或工具完成天然語言與數據庫的交互,所以誕生了Text-to-SQL任務。編程
咱們經過圖1中的實例來介紹一下Text-to-SQL任務。該任務包含兩部分:Text-to-SQL解析器和SQL執行器。微信
解析器的輸入是給定的數據庫和針對該數據庫的問題,輸出是問題對應的SQL查詢語句,如圖中紅色箭頭標示。SQL執行器在數據庫上完成該查詢語句的執行,及給出問題的最終答案,如圖中綠色箭頭標示。網絡
SQL執行器有不少成熟的系統,如MySQL,SQLite等,該部分不是本文重點。本文主要介紹解析器,學術界中Text-to-SQL任務默認爲Text-to-SQL解析模型。框架
圖1 機器學習
首先,咱們介紹一下術語「數據庫」和「SQL查詢語句」:編程語言
一、數據庫由一張或多張表格構成,表格之間的關係經過外鍵給出。在該實例中,數據庫由表 「中國城市」和「2018年宜居城市」 構成,兩張表經過外鍵:「中國城市」的「名稱」列和「2018年宜居城市」的「名稱」列關聯;ide
二、SQL是數據庫查詢語言,其構成來自3部分:數據庫(如實例SQL查詢語句中藍色標註的成分)、問題(如實例SQL查詢語句紅色標註的成分)、SQL關鍵詞(如實例SQL查詢語句中的Select、From、Where等)。
其次,咱們介紹一下Text-to-SQL解析模型。根據SQL的構成,解析器須要完成兩個任務,即「問題與數據庫的映射」和「SQL生成」。
在問題與數據庫的映射中,須要找出問題依賴的表格以及具體的列,如圖1實例中,問題「綠化率前5的城市有哪些,分別隸屬於哪些省?」依賴的數據庫內容包括:表格「中國城市」,具體的列「名稱」、「所屬省」、「綠化率」(SQL查詢語句藍色標註成分)。
在SQL生成中,結合第一步識別結果以及問題包含信息,生成知足語法的SQL查詢語句,如實例中的「Select 名稱,所屬省 From 中國城市 Where 綠化率 > 30%」。
Text-to-SQL研究進展
Text-to-SQL技術可以有效地輔助人們對海量的數據庫進行查詢,因其有實用的應用場景,引發了學術界和工業界的普遍關注。咱們接下來將從相關數據集和模型兩方面介紹該技術的研究進展。
一、數據集介紹
圖2給出了Text-to-SQL數據集發展趨勢,表明數據集參見表1。
圖2
其中術語介紹:
表1
由圖2和表1可知,當前主流數據集都是多領域的,這就要求Text-to-SQL解析模型除了知足問題無關外,還要知足領域無關。
二、模型介紹
SQL查詢語句是一個符合語法、有邏輯結構的序列,其構成來自三部分:數據庫、問題、SQL關鍵詞。
在當前深度學習研究背景下,Text-to-SQL任務可被看做是一個相似於神經機器翻譯的序列到序列的生成任務,主要採用Seq2Seq模型框架。基線Seq2Seq模型加入注意力、拷貝等機制後,在單領域數據集上能夠達到80%以上的準確率,但在多領域數據集上效果不好,準確率均低於25%。
從編碼和解碼兩個方面進行緣由分析。
在編碼階段,問題與數據庫之間須要造成很好的對齊或映射關係,即問題中涉及了哪些表格中的哪些元素(包含列名和表格元素值);同時,問題與SQL語法也須要進行映射,即問題中詞語觸發了哪些關鍵詞操做(如Group、Order、Select、Where等)、聚合操做(如Min、Max、Count等)等;最後,問題表達的邏輯結構須要表示並反饋到生成的SQL查詢語句上,邏輯結構包括嵌套、多子句等。
在解碼階段,SQL語言是一種有邏輯結構的語言,須要保證其語法合理性和可執行性。普通的Seq2Seq框架並不具有建模這些信息的能力。
當前基於Seq2Seq框架,主要有如下幾種改進。
1)基於Pointer Network的改進
首先,SQL組成來自三部分:數據庫中元素(如表名、列名、表格元素值)、問題中詞彙、SQL關鍵字。其次,當前公開的多領域數據集爲了驗證模型數據庫無關,在劃分訓練集和測試集時要求數據庫無交叉,這種劃分方式致使測試集數據庫中很大比例的元素屬於未登陸詞。傳統的Seq2Seq模型是解決很差這類問題的。
Pointer Network很好地解決了這一問題,其輸出所用到的詞表是隨輸入而變化的。具體作法是利用注意力機制,直接從輸入序列中選取單詞做爲輸出。在Text-to-SQL任務中,將問題中詞彙、SQL關鍵詞、對應數據庫的全部元素做爲輸入序列,利用Pointer Network從輸入序列中拷貝單詞做爲最終生成SQL的組成元素。
因爲Pointer Network能夠較好的知足具體數據庫無關這一要求,在多領域數據集上的模型大多使用該網絡,如Seq2SQL[1]、STAMP[8]、Coarse2Fine[9]、IRNet[16]等模型。
2)基於Sequence-to-set的改進
在簡單問題對應的數據集合上,其SQL查詢語句形式簡單(僅包含Select和Where關鍵詞),爲了解決Seq2Seq模型中順序錯誤帶來的影響(如「條件1 And 條件2」,預測爲「條件2 And 條件1」,屬於順序錯誤,但對應的SQL是正確的),SQLNet[10]提出了Sequence-to-set模型,基於全部的列預測其屬於哪一個關鍵詞(即屬於Select仍是Where,在SQLNet模型中僅預測是否屬於Where),針對SQL 中每個關鍵詞選擇機率最高的前K個列。
該模式適用於SQL形式簡單的數據集,在WikiSQL和NL2SQL這兩個數據集合上使用較多,且衍生出不少相關模型,如TypeSQL[11]、SQLova[12]、X-SQL[13]等。
圖3 Sequence-to-Set
3)基於TRANX(自頂向下文法生成)的改進
複雜問題對應的SQL查詢語句形式也複雜,涉及到多關鍵詞組合、嵌套、多子句等。而且,測試集合中的某些SQL查詢語句形式在訓練集合中沒有見過,這就要求模型不只對新數據庫具備泛化能力,對新SQL查詢語句形式也要有泛化能力。
針對這種狀況,須要更多關注生成SQL的邏輯結構。爲了保證SQL生成過程當中語法合理,一些模型開始探索及使用語法樹生成的方法。
TRANX_[14]_框架借鑑了AST[15]論文思想,根據目標語言的語法構建規約文法,基於該文法能夠將生成目標表示爲語法樹(須要保證生成目標與語法樹表示一一對應),而後實現了自頂向下的語法樹生成系統,圖4給出了該系統流程。
咱們簡單介紹一下基於該系統實現Text-to-SQL任務。
首先,根據SQL語法制定規約文法(對應圖4中的ASDL Grammar),須要保證每一條SQL查詢語句都可由該文法產出。
其次,設計動做集合用於轉移系統(圖4中的Transition System),基於該轉移系統選擇合理的規約文法生成語法樹,該轉移系統將語法樹的生成轉成動做序列的生成,即轉成一系列文法的選擇序列,文法在選擇過程當中保證了合理性(即孩子節點文法均在父節點容許的文法範圍內);該動做序列的生成可基於Seq2Seq等框架進行。
該框架在代碼生成、SQL生成等任務上都已驗證過,在Text-to-SQL任務上的模型包括IRNet[16]、Global GNN[17]、RATSQL[18]等。
圖4:基於TRANX的code生成
4)其餘改進
在多表數據集合上,一些模型加入圖網絡來加強數據庫的表示,如Global GNN[17]、RATSQL[18]等。在WikiSQL數據集合上,因爲該數據集給出了SQL執行系統,部分模型經過加入執行指導[19]來提高SQL的可執行性和準確率。
三、評價方法
Text-to-SQL任務的評價方法主要包含兩種:精確匹配率(Exact Match, Accqm)、執行正確率(Execution Accuracy, Accex)。
精確匹配率指,預測獲得的SQL語句與標準SQL語句精確匹配成功的問題佔比。爲了處理由成分順序帶來的匹配錯誤,當前精確匹配評估將預測的SQL語句和標準SQL語句按着SQL關鍵詞分紅多個子句,每一個子句中的成分表示爲集合,當兩個子句對應的集合相同則兩個子句相同,當兩個SQL全部子句相同則兩個SQL精確匹配成功;
執行正確指,執行預測的SQL語句,數據庫返回正確答案的問題佔比。
目前僅WikiSQL數據集支持Acc_ex_,其餘數據集僅支持Accqm。大部分數據集發佈了對應的評估腳本,方便你們在同一個評估標準下進行算法研究。
參考文獻
[1] Seq2sql: Generating structured queries from natural language using reinforcement learning (Victor Zhong, Caiming Xiong, Richard Socher. CoRR2017)
[2] Spider: A Large-Scale Human-Labeled Dataset for Complex and Cross-Domain Semantic Parsing and Text-to-SQL Task (Tao Yu, Rui Zhang, Kai Yang, Michihiro Yasunaga, etc. EMNLP2018)
[3] A Pilot Study for Chinese SQL Semantic Parsing (Qingkai Min, Yuefeng Shi, Yue Zhang. EMNLP2019)
[4] SParC: Cross-Domain Semantic Parsing in Context (Tao Yu, Rui Zhang, Michihiro Yasunaga, Yi Chern Tan, etc. ACL2019)
[5] CoSQL: A Conversational Text-to-SQL Challenge Towards Cross-Domain Natural Language Interfaces to Databases (Tao Yu, Rui Zhang, He Yang Er, Suyi Li, Eric Xue, etc. EMNLP2019)
[6] https://tianchi.aliyun.com/ma..._cn
[7] Pointer Networks (OriolVinyals, Meire Fortunato, Navdeep Jaitly. NIPS2015)
[8] Semantic Parsing with Syntax- and Table-Aware SQL Generation (Yibo Sun, Duyu Tang, Nan Duan, etc. ACL2018)
[9] Coarse-to-Fine Decoding for Neural Semantic Parsing (Li Dong, Mirella Lapata. ACL2018)
[10] SQLNet: Generating Structured Queries From Natural Language Without Reinforcement Learning (Xiaojun Xu, Chang Liu, DawnSong. CoRR 2018)
[11] TypeSQL: Knowledge-based Type-Aware Neural Text-to-SQL Generation (Tao Yu, Zifan Li, Zilin Zhang, Rui Zhang, Dragomir Radev. NAACL2018)
[12] Achieving 90% accuracy in WikiSQL (Wonseok Hwang, Jinyeong Yim, SeungHyun Park, Mnjoon Seo. CoRR2019)
[13] X-SQL: Reinforce Context Into Schema Representation (Pengcheng He, Yi Mao, Kaushik Chakrabarti, Weizhu Chen. CoRR2019)
[14] TRANX: A Transition-based Neural Abstract Syntax Parser for Semantic Parsing and Code Generation (Pengcheng Yin, Graham Neubig, EMNLP 2018 )
[15] Abstract syntax networks for code generation and semantic parsing (Maxim Rabinovich, Mitchell Stern, Dan Klein. ACL2017)
[16] Towards Complex Text-to-SQL in Cross-Domain Database with Intermediate Representation (Jiaqi Guo, Zecheng Zhan, Yan Gao, Yan Xiao, Jian-Guang Lou, Ting Liu, Dongmei Zhang. ACL2019)
[17] Representing Schema Structure with Graph Neural Networks for Text-to-SQL Parsing (Ben Bogin, Matt Gardner, Jonathan Berant. ACL2019)
[18] RAT-SQL: Relation-Aware Schema Encoding and Linking for Text-to-SQL Parsers (Bailin Wang, Richard Shin, Xiaodong Liu, Oleksandr Polozov, Matthew Richardson. Submitted to ACL2020)
[19] Robust Text-to-SQL Generation with Execution-Guided Decoding (Chenglong Wang, Kedar Tatwawadi, Marc Brockschmidt, Po-Sen Huang, Yi Mao, Oleksandr Polozov, Rishabh Singh. CoRR2018)
百度天然語言處理(Natural Language Processing,NLP)以『理解語言,擁有智能,改變世界』爲使命,研發天然語言處理核心技術,打造領先的技術平臺和創新產品,服務全球用戶,讓複雜的世界更簡單。