增強分析中的智慧問答揭祕

百分點發表於2019-11-12

增強分析是指以機器學習為基礎的資料分析和BI功能,包含智慧資料發現、增強資料準備、增強資料分析等模組。目前增強分析已經在BI中廣泛使用,Gartner 認為,到2020年,增強分析將成為新使用者購買BI產品、資料科學機器學習平臺,以及嵌入式分析的主要驅動力。

通過增強分析功能,能夠極大地降低使用者的資料分析門檻,使一個非專業人員也能夠輕鬆完成資料預處理和資料分析的整個分析流程。

1、增強分析中的智慧問答

智慧問答功能是增強分析中非常重要的一個子任務,其目的是讓使用者能夠通過一句自然語言就能自動生成對應的圖表。比如,提問“2015年各地區的銷售額?”系統自動就會展示出如下的結果:增強分析中的智慧問答揭祕

在學術界,這個任務叫做 NL2SQL,目前已經有很多研究。英語環境通常採用的是WikiSQL和 Spider,而中文目前還沒有統一的資料集。在 WikiSQL 資料集上,Leaderboard 中的方法都是把這個任務轉化為槽值填充,然後利用深度學習的方法訓練多個不同的子模型對每個槽位進行填充,比如作為SOTA模型的X-SQL。

雖然在WikiSQL 資料集上,模型的效果已經超越了人類,但是在產品化的過程中, WikiSQL過於簡單,比如它只支援1個查詢目標,1個聚合函式和最多4個過濾條件,不支援分組。而在實際使用中,有多個查詢目標以及包含分組欄位的問題比比皆是,比如“各省份的人口”,“每年的人口”,所以只是採用 X-SQL 的方法無法滿足工業的需要;Spider 資料集中不僅支援對分組進行提問,而且支援跨表join,但是 SOTA 模型的測試準確率只有55%,還無法滿足產品化的效果。

此外,在實際提問時,時間是一個很特殊並且重要的因素,比如使用者可能會問“近七天的總銷售額”,“2019/2018年的銷售額”,“今年前三個季度的總銷售額”等等,這些內容在資料集中都沒有覆蓋。

2、基於 X-SQL 和依存句法樹的智慧問答方法

基於以上這些資料集的侷限性,百分點智慧問答的任務既需要讓模型能夠準確地提取問題中的槽位資訊,又需要無監督的語義分析方法,只有這樣才能滿足實際使用的需要。

所以我們以 X-SQL 的思路,採用槽位匹配的方法提取出問題中的select、where 內容,然後利用這些資訊輔助依存句法樹的解析,最終得到完整的 select、where、group、order 等內容。

值得注意的是,問題中的“時間”需要採用模板的方法,這樣更易於擴充套件。

將自然語言轉化成 SQL ,本身可以認為是一個 Seq2seq 的任務,所以在 WikiSQL 中很多早期模型也確實是這麼做的,比如 Corse2fine。它會對問題和欄位名進行編碼,然後利用中間的預解碼層將向量解碼為 SQL 的框架,這個過程就能相當於自動生成了槽位模板,再把槽位模板也進行編碼,結合原始的向量,最後能夠解碼出最終的 SQL。但是這樣生成的結果不一定符合 SQL 的語法規則,所以後面改進的生成方法都是事先寫好SQL 的模板槽,然後再用多個模型逐個預測槽位,X-SQL 就是其中一種。

下面詳細介紹 X-SQL 的大體流程,如下圖所示,先通過 MT-DNN 對原始問題及欄位名稱進行編碼,再在問題前面人為地新增一個 [CXT] 用於提取全域性資訊。中間的 Context Reinforcing Laryer 層是這個模型的核心部分,它的目的是把 MT-DNN 得到的預訓練編碼在 NL2SQL 任務上進行增強和重組。這個中間層不僅能體現上下文資訊,還能通過 Attention機制對欄位名稱的編碼進行強化(紫色部分)。這一層輸出的結果包括問題的編碼,以及強化後的欄位編碼,後面的輸出層都會在這個基礎上進行。輸出層包括6個子模型:S-COL和S-AGG 用於預測 select 的欄位,只依賴於強化後的欄位名稱編碼,通過 softmax 對每個欄位打分就行了;W-NUM 只依賴全域性資訊,用於預測 where 條件個數;W-COL、W-OP和W-VAL 用於預測過濾條件的具體內容,通過組合欄位編碼,當前的 where 條件編號及問題編碼,通過softmax 評分就能得到需要的結果。

增強分析中的智慧問答揭祕

這個架構已經十分完善了,但是由於資料的侷限,模型無法預測多個 select 及 group 的內容。而且模型完全依賴欄位名稱去提取過濾條件和select的內容,在中文欄位名稱特徵不夠明顯或者領域資料與訓練資料偏差較大時,容易出錯。

另一種方式是語法分析,一般依賴於依存句法分析的結果,能夠把問題的語法依賴關係體現出來,在此基礎上結合 POS,NER 的結果,可以使依存語法樹上的每個節點都具有詞性、實體標籤等屬性。然後通過後序遍歷,每次遍歷到父節點的時候,都將孩子節點及當前父節點的內容進行整理合並,最終遍歷到根節點的時候,就得到了select、group 等要素。這種方法的好處是,它完全依賴於問題的語法規則,不需要訓練資料,並且對於領域不敏感,遷移性強;缺點是隻能處理相對規範的問題,對非常靈活的問題效果不佳。

那麼如果能夠結合兩種方法,就能把語法和語義結合起來,得到能力更為強大的分析模型。也就是說, X-SQL 從深層語義的角度提取要素,而語法分析從問題的語法組成結構上進行提取。具體實現時,X-SQL 的方法能夠解析出 1 個 select、1 個聚合函式、最多 4 個過濾條件。通過 pyltp 庫可以得到問題的分詞、依存句法樹、詞性標註、命名實體,加上 X-SQL 解析得到的結果,就可以得到一顆包含了每個詞的詞性、實體類別、結果標籤(select、聚合函式、還是過濾條件中的欄位名、操作符或欄位值)、依存關係的樹。

看一下具體的流程:

問題1:各地區的總新增訂單量

步驟1:分詞後的結果(需要考慮欄位名,X-SQL 的結果):各  地區  的總新增訂單量

步驟2:得到的聚合了所有資訊的樹:

增強分析中的智慧問答揭祕

其中 HED、ATT 等表示依存關係,HED表示核心關係,ATT 表示定中關係,RAD 表示附加關係。

步驟3:通過詞庫以及後序遍歷解析依存樹

1. 首先遍歷到“總”。由 X-SQL 得知這是聚合函式。
2. 遍歷到“各”。得到這個是一個分組描述符。
3. 遍歷到“的”。得到這是一個無意義的詞。
4. 遍歷到“地區”。從表中匹配得知這是一個欄位名稱,從孩子節點處得到的資訊及 ATT 的關係,得知這是一個分組欄位。
5. 遍歷到“新增訂單量”。由 X-SQL 得知這是查詢詞,並且結合孩子節點得知聚合函式是“總”,分組詞是“地區”。
6. 遍歷到root,得到最終結果:select內容為總新增訂單量,分組欄位為地區。

步驟4:最終得到解析結果

問題2:銷售額最高的3個地區

步驟1:分詞後的結果(需要考慮欄位名,X-SQL 的結果):銷售額  最高  的 3個地區

步驟2:得到的聚合了所有資訊的樹:

增強分析中的智慧問答揭祕

其中 SBV 表示主謂關係。

步驟3:

1. 遍歷到“3個”。由詞性及規則得知這個是 limit。(不是 where 中的內容,否則會被 X-SQL 標記出來)

2. 遍歷到“銷售額”。得知這是一個欄位名。

3. 遍歷到“的”。得到這是一個無意義的詞。

4. 遍歷到“最高”。由依存關係,以及孩子回溯上來的資訊,得知這個是一個降序排序資訊。

5. 遍歷到“地區”。由 X-SQL 得知這是查詢詞。並且整合孩子節點的所有資訊,得知limit 3, 按銷售額降序排序。

6. 遍歷到root,得到最終結果:select內容為地區,limit 3, 按銷售額降序排序。

步驟4:得到最終結果。

此外,在具體使用的過程中,經常會出現比較複雜的時間問法。比如“上個月”、“近7天”、“一二季度“、“2018/2019年”、“去年3月份”等等。對於這些問法相對固定,但是解析時需要利用大量知識的內容,我們採用了模板的方法進行處理。

模板定義:

一個模板包括問法模板和解析結果兩部分。

1. 問法模板定義了問法的句式,由槽位、普通字元和正則語法構成,其中槽位暫時只用 ${num} 就夠用了。例如“${num1}${num2}季[度]”,“${num1}/${num2}年”。

2. 解析結果是問法模板對應的解析結果。由“value”, “start”,“end”三個欄位構成。“value”是列表,每個值定義了某個具體時間,存在多個時相互間取並集。“start”和“end”表示一個時間段的開始時間和結束時間,只有當 “value”不存在時才會有“start” 和“end”。在解析結果中需要 NOW_YEAR、NOW_MONTH、NOW_DAY 常量表示當前的年、月、日。

3. 下面是一個具體的模板例項:

增強分析中的智慧問答揭祕

其中 template表示問法模板,result 表示解析結果。這個模板可以匹配類似“近7天”模式的時間表達。

有了模板之後,只需要解析模板就行了。將 template 轉化成對應的正規表示式後,把問題中的詞替換成對應的槽位,再用正規表示式進行匹配和提取,匹配完成之後,將得到的槽位資訊對應填入 result 中就得到了最終的解析結果。需要注意的是,匹配時間是先置步驟,需要在X-SQL 和語法樹解析之前進行,為了避免時間對下面的解析造成影響,在模板匹配提取之後,需要將問題中的時間詞語刪除。

3、效果評價

X-SQL 採用通過對WikiSQL翻譯得到的50000條有標註資料進行訓練,取其中 5000條作為測試資料,準確率達到了80% 以上。

實際測試環境中,由於中文NL2SQL領域還沒有統一的資料集,所以通過收集使用者實際在平臺上的使用資料,最終得到了 266條中文測試資料(問題中可能包含了分組、過濾條件、複雜的時間表達、查詢內容和排序等),在這個基礎上進行測試,得到的結果如下:

增強分析中的智慧問答揭祕

在學術界一般都會以 WikiSQL 和 Spider 作為訓練集和測試集,且都是英文資料集。由於WikiSQL 不支援複雜時間及分組,不具備可比較性,而在Spider上目前最優效果為測試準確率 55%。

4、關於NL2SQL的延伸思考

目前學術界對Nl2SQL已經做了很多的研究,從最早的模板匹配方法,到後來語法解析,以及最近的深度學習方法。特別是在 BERT等預訓練模型出現之後,深度學習的方法在 WikiSQL 資料集上取得了非常好的效果,出現了 SqlNet、Corse2fine、X-SQL 等一系列模型。雖然在工業界的使用中,WikiSQL 和國內一些企業的資料集還是過於簡單,但是它們的思想是可以借鑑的。另一方面,基於依存句法樹之類的語法分析方法也有其可取之處,通過結合語法分析和語義分析能得到更好的效果。而對於“時間”的處理,由於它的表達比較規範,但是處理時需要大量的知識,這種情況下或許模板才是最適合的方法。所以在工業界使用的過程中,還需要具體情況具體分析。

相關文章