論文:TypeSQL: Knowledge-Based Type-Aware Neural Text-to-SQL Generation
???
Code: TypeSQL | GitHub
一、論文速讀
本論文是在 SQLNet 網絡上做的改進,其思路也是先預先構建一個 SQL sketch,然后再填充 slots 從而生成 SQL。
論文發現:在 question 中往往包含與特定數據相關的 rare entity 和 number,這對于在 SQL 查詢中推斷 column name 和 WHERE condition value 很重要,但這些 entity 和 number 缺乏準確的 embedding。為了解決這個問題,本工作為 question 的每個 word 分配了一個 type:知識圖譜中的 entity、“COLUMN” 或者一個 number,如下圖的最下面的 input 所示,為 question 的每個 word 都分配了一個 type:
具體來說,首先對 question 做分詞,切分成長度為 2~6 的 n-grams,然后:
- 使用 gram 檢索數據庫的 table schema,如果能檢索到相應的 column name,那就將其 type 標注為
COLUMN
- 為 number 和 date 標注為以下四個類別之一:
INTEGER
、FLOAR
、DARE
、YEAR
- 為了識別命名實體,用 gram 作為 keyword 在 Freebase 上做檢索五類實體:
PERSON
、PLACE
、COUNTRY
、ORGANIZATION
、SPORT
,并做相應的 type 標注,這五類實體已經可以覆蓋了數據集中的絕大多數實體
由此,我們才可以看到上圖中對 question 的 type 標注結果。
拓展來開的話,如果 database 的內容也可以訪問,那我們在做 type 標注時,還會將 gram 從 table schema、column content 和 column label 中做檢索,并將 type 標注為具體的 column name。比如上圖中,question 中的 mort drucker 可以被標注為 artist,因為我們能在數據庫中檢索到這個 gram 并發現對應的 column name 為 artist。
對 question 做完 type 標注后,在之后做編碼時,就可以將 question 中的原 token 和對應的 type 一起做 embedding,并將兩個 embedding 連接在一起做 encode 并進一步處理。
在之后填充 SQL sketch 做 slots 預測時,原來的 SQLNet 模型是為五種 slots 設計了五個 model 來分別訓練和預測,而本文的 TypeSQL 將其中功能相似的 model 做了合并,最終只需要 3 個 model 來完成填充任務,架構上做了簡化。具體公式可以參考原論文。
二、總結
這篇論文的工作主要是對 SQLNet 做的改進,改進主要有如下:
- 借助于數據庫的 table schema 檢索和 knowledge graph 的檢索,為 question 的每個 word 標注一個 type,從而提高 embedding 的效果
- 當 database content 可用時,type 標注時還會進一步對 column content 做檢索,并為其標注 column name,這樣當用戶的 question 中的所提到的列名或者條目不精確時,也可以通過這個步驟來對應到具體的數據庫 column,從而提高效果,實現所謂的“內容敏感性”。
- 改進了 SQLNet 的 slots 填充步驟,減少了所需要的 model 數量,架構上也做了簡化