自然語言處理 Paddle NLP

2023-06-26 21:00:53

NLP問答任務
相似度和規則匹配,都是早期的方法,現在主流的方法,都是基於生成的方法
結構化資料問答,有兩種形式,一種是知識圖譜形式、一種是關係型資料庫形式。

主要應用在企業中,減少銷售的成本

應用於商業智慧,用於報告生成,解放了財務能力,降低人力成本

結構化資料問答任務

結構化資料問答:基於給定的結構化知識庫和自然語言問題,給出問題對應的答案
任務能力:

  • 推理能力:基於現有知識推理/計算給出答案,E.g. OPPOA93比魅族18貴多少呀
  • 輸出結果可解釋:輸出知識庫查詢語句

結構化形式儲存,不盡儲存了問題的知識和答案,這種儲存有利於推理和計算
結構化問答能夠輸出查詢語句,是人類可讀可理解的,相對於其它問答形式,這種是可控的。

表格問題中,一般用語意解析技術(Text-to-SQL)
表格問答:核心技術,將自然語言問題轉成資料庫上可執行的SQL查詢語句
兩大功能:

  • SQL解析功能:比較關鍵,是表格問答的核心技術,如何將自然語言轉成可查詢的SQL語句
  • SQL執行功能

評估方法

常用的有兩種,這兩種是不等價的。

  • 精確匹配正確率:評估生成的SQL的正確率,預測SQL與標準SQL相等的問題佔比
  • 執行正確率:評估答案正確率,執行預測SQL獲得正確答案的問題佔比

分母是問題集合大小N,預測的SQL和標準的SQL相等的問題數量,在判斷相等的時候會忽略順序的影響

問題

這種方式和第一種相比,分子是通過答案相比,這兩種方式是不等價的。

  • 精確匹配正確率:針對同一個問題,有不同的SQL寫法,而且SQL都是正確的,這種情況下。如果使用第一種評估方式,標準的SQL只是正確寫法中的一個,使用這種方式會漏掉一些正確的結果。導致評估的結果會偏低,這種情況就比較適合使用第二種方式(評估答案准確率)
  • 執行正確率:資料庫的不完畢性,有些問題是沒有答案的,這樣的話,就導致正常的SQL沒有答案,錯誤的SQL也沒有答案,按答案判斷兩種情況都是正常的。這樣會導致評估結果會偏高

在實際應用在選擇評估方式時,

    1. 看選擇的測試資料,提供了哪些資訊,有沒有提供SQL、答案,
    1. 實際應用更關注哪個指標,是關注SQL正常,還是更關注答案

資料集

一般是按資料集化分,要麼問題在訓練集中,要麼在測試集中,多領域是按資料庫劃分的,在一個資料集中

  • 多領域(cross-domain):訓練/測試集使用的資料庫是否相同或交叉,資料集是包含多個資料庫的,每個資料庫有一個領域,每個領域有一個或多個資料庫,資料集劃分時,是按訓練集、測試集劃分的。一個資料庫所有的問題,只能屬於一個集合,要麼屬於訓練集,要麼屬於測試集。這會導致測試集中的資料庫和問題,在訓練集中是沒有見過的。多領域化分,是用來劃分模型的泛化性。同時也給任務帶來很大的挑戰

  • 單/多表(multi-table):構成資料庫的表的數量,多表涉及到表的檢索,一張表為單表,涉及多張表的表示多表

  • 簡單/複雜:從SQL角度評估,是否包含高階從句、集合操作、巢狀等,簡單 SQL只包含SELECT WHERE(答案、條件),複雜:有可能包含排序、分組、集合操作

CSpider 資料庫是英文,問題是中文

主流學習方式

基於規則的方式,已經不用了,主流的有以下兩種

  • 有監督方法:以生成的SQL是否正確,來指導模型的學習,這種學習方法依賴於標準資料,由於正確的SQL語句標註比較困難

  • 弱監督方法:給出資料庫問題,以及問題對應的答案,標註答案要比標註SQL相對容易很多,在這情況下,SQL是中間輸出,會以答案指導SQL的生成,能夠輸出正常答案的SQL就是正確的。這種需要在整個資料庫中去搜尋合理或正常的正確語句,搜尋空間比較大。這種方式比較適合簡單的資料集,複雜的資料集很難執行下去。

https://github.com/salesforce/WikiSQL
為了各類資料集都適用,後面都是基於有監督方法的介紹

encode-decoder 中英文翻譯,中文句子翻譯成英文句子,
encode 把中文句子對映到表示空間上,完成編碼的作用
decode 從表示空間上,解碼出對應的英文句子

從下往上看,把多輸入進行拼接,自然語言和DB Schema 的拼接,將拼接輸入給 Encoder 編碼器,解碼器按順序輸出每個元素,直到遇到結束符,最終生成序例(SQL語句)
Decode 引入了兩個開關,generate、copy 多領域資料集在劃分訓練集和測試集時,是按資料庫進行化分的,測試集中的一些問題在訓練集中沒有見過,如何在生成的時候把這些沒有見過的生成出來。輸出資訊,應該包含在輸入定義的 db schema 資訊中,這時候就可以把定義的輸入資訊copy到輸出資訊中。
對於 SQL 關鍵詞,是生成的,資料庫和問題中的元素是copy的

Text-to-SQL任務挑戰

領域泛化:測試集中資料庫未在訓練集中出現過
輸出結構化:生成的SQL語句在資料庫上可執行,即滿足資料庫結構、SQL語法

Text-to-SQL範例

解決方案
編碼:Relation-awarerepresentation 利用匹配關係強化編碼方式
解碼:Grammar-baseddecoder 利用語法解碼,保證生成的SQL是滿足語法的

Encode => 隱式表示 => Decode

輸入部分仍然是自然語言+Schema的拼接,在這邊為了更好的識別條件值,增加了條件值的一個拼接,
使用基礎的編碼器,對資料進行一個表示,得到一個隱式表示,
在基礎編碼器上,又增加了一個 Relation-aware Transformer Encoder:用匹配關係增強表示,
接下來在Decode中引入了 Grammar-based Decoder 語法解碼,這種解碼不是在每次輸出時輸出一個個元素,而是輸出的一個語法序列。

https://github.com/PaddlePaddle/PaddleNLP/tree/develop/examples/text_to_sql

SchemaLinking

自然語言和資料庫Schema進行匹配對映,把匹配資訊構成匹配關係矩陣,這個矩陣作為後面模組的輸入,

先對自然語言進行分詞
問題中的每個詞與DB Schema中的成分進行匹配,標註出匹配方式和程度,構建出關係矩陣,顏色表示匹配關係,不同的顏色表示不同的關係

Encoding–BasicEncoder

  • 基礎編碼:把輸入對映到隱式空間的過程
    Dataprocess:text2sql/dataproc/ernie_input_encoder_v2.py中類ErnieInputEncoderV2
    Encoder:third/ERNIE或PaddleNLP:from paddlenlp.transformersimport BertModel

Encoding–Relation-awareEncoder

  • 匹配關係增強編碼:利用SchemaLinking 中建立起來的關係矩陣,來指導編碼,進而強化編碼,
    學習輸入中的每個詞對目標詞的權重,
    輸入自然語言和DB Schema進行拼接,
    權重越大,對目標詞的影響越大
    1:08:40

Decoding

  • 語法解碼:解碼過程種通過語法生成語法序列,保證語法的合理性
  • 基於Copy機制的解碼:對應的元素是資料庫元素時,利用copy機制

Grammar-basedDecoder

基本思想:根據SQL語法設定上下文無關文法,將SQL生成看作文法序列生成,即文法選擇過程
不再生成單獨的 query元素,而是生成符合SQL語言的語法,最後生成的語法序列是可以構成 sql query的。

是經過領域泛化的,換一個庫不需要重新標註,除非需要很高的準確率。

應用範例演示:https://ai.baidu.com/unit/v2

視訊:https://aistudio.baidu.com/aistudio/course/introduce/24177?sharedLesson=1477808&sharedType=2&sharedUserId=2631487&ts=1686638807733

課件:https://aistudio.baidu.com/aistudio/course/introduce/24177?sharedLesson=1567910&sharedType=2&sharedUserId=2631487&ts=1686638791675