Text2SQL在Spark NLP中的實現與應用:將自然語言問題轉換為SQL查詢的技術解析

概述

SQL 仍然是當前行業中最受歡迎的技能之一

免責聲明:Spark NLP 中的 Text2SQL 注釋器在 v3.x(2021 年 3 月)中已被棄用,不再使用。如果您想測試該模塊,請使用 Spark NLP for Healthcare 的早期版本。

自新千年伊始,每日產生的數據量呈指數級增長。其中大部分數據存儲在關系型數據庫中。在過去,只有大型公司能夠使用結構化查詢語言(SQL)查詢這些數據。隨著手機的普及,越來越多的個人數據被存儲,因此,越來越多來自不同背景的人試圖查詢和使用自己的數據。盡管數據科學的熱度不斷攀升,但大多數人仍缺乏編寫 SQL 查詢數據的必要知識。此外,大多數人也沒有時間去學習和理解 SQL。即使是 SQL 專家,反復編寫類似的查詢也是枯燥乏味的任務。正因如此,如今海量的數據無法被有效獲取 [1]。您可以查看 這一系列文章 和 一篇博客文章,以了解更多關于 Text2SQL 及該研究領域的最新趨勢 [2]。

我們的目標是讓人們能夠直接用人類語言與數據對話。因此,這類自然語言接口幫助任何背景的用戶輕松查詢和分析海量數據。為了構建這種自然語言接口,系統必須理解用戶的問題,并自動將其轉換為對應的 SQL 查詢。

來自 Spider 數據集的一個具有挑戰性的 Text-to-SQL 任務

Text2SQL 是自然語言處理研究中的一個重大挑戰,目前最先進的模型(SOTA)仍然難以達到人類基線水平的準確率,這是由于問題本身的固有特性。因此,目前最先進的模型在 Spider 數據集 上的準確率僅為 70%,而 Spider 數據集是 Text2SQL 研究中最廣泛使用的基準數據集之一。

還有其他幾個 Text2SQL 基準數據集,例如 ATIS、GeoQuery、Scholar、Advising 等,以及 WikiSQL,它們覆蓋了整個 SQL 查詢范圍的不同領域。

一些 Text-to-SQL 數據集的圖表(圖片來自 Spider 項目)

Spider 數據集上的 Text2SQL 任務排行榜

如左圖所示,Spider 數據集在圖表中占據了最大面積,使其成為第一個復雜且跨領域的 Text-to-SQL 數據集,它具有以下特點:

  • 大規模:包含超過 10,000 個問題,以及大約 6,000 個對應的、獨特的 SQL 查詢。
  • 復雜性:大多數 SQL 查詢涵蓋了幾乎所有重要的 SQL 組件,包括 GROUP BY、ORDER BY、HAVING 和嵌套查詢。此外,所有數據庫都包含多個通過外鍵關聯的表。
  • 跨領域:包含 200 個復雜的數據庫。我們將 Spider 數據集劃分為訓練集、開發集和測試集,基于數據庫進行劃分。這樣,我們可以在未見過的數據庫上測試系統的性能。

Spark NLP:大規模的自然語言處理

Spark NLP 是基于 Apache Spark ML 構建的自然語言處理庫,每天的下載量超過 10,000 次,總下載量達到 180 萬。它是增長最快的自然語言處理庫之一,支持 Python、R、Scala 和 Java 等流行編程語言。它為機器學習管道提供了簡單、高效且準確的自然語言處理注釋,這些注釋可以在分布式環境中輕松擴展。

Spark NLP 提供了 330 多個預訓練的管道和模型,涵蓋 46 種以上的語言。它支持最先進的 Transformer 模型,例如 BERT、XLNet、ELMO、ALBERT 和 Universal Sentence Encoder,這些模型可以在集群中無縫使用。此外,它還提供分詞、詞性標注、命名實體識別、依存句法分析、拼寫檢查、多類文本分類、多類情感分析等 自然語言處理任務。如需了解更多詳細信息和示例 Colab 筆記本,我們強烈建議您查看我們的 工作坊倉庫。

Spark NLP for Healthcare 2.7 于 2020 年 10 月 28 日發布

Spark NLP 中實現的 Text2SQL 算法

我們在 Spark NLP 中實現了一種名為 IRNet 的深度學習架構。中間表示(IRNet) 旨在解決復雜且跨領域的 Text-to-SQL 任務中的兩個主要挑戰:自然語言中表達的意圖與預測列之間的不匹配,以及由于大量超出領域詞匯導致的問題。讓我們看看 IRNet 提供了什么。

  • IRNet 將自然語言分解為 3 個階段,而不是端到端地合成 SQL 查詢:模式編碼器(Schema Encoder)、解碼器(Decoder)和自然語言編碼器(NL Encoder)
  • 在第一階段,對數據庫模式和問題進行模式鏈接。IRNet 采用基于語法的神經模型來合成 SemQL 查詢,這是一種我們設計的中間表示(IR),用于連接自然語言和 SQL。模式編碼器以數據庫模式為輸入,輸出表和列的表示。
  • 解碼器用于使用上下文無關語法合成 SemQL 查詢,IRNet 確定性地從合成的 SemQL 查詢中推斷出 SQL 查詢,并利用領域知識。
  • 最后,自然語言編碼器將自然語言輸入編碼為嵌入向量。這些嵌入向量隨后用于通過雙向 LSTM 構建隱藏狀態。

合成 SemQL 查詢的神經模型概覽。基本上,IRNet 由自然語言編碼器、模式編碼器和解碼器構成。如圖所示,從模式中選擇了“書名”列,而第二列“年份”是從記憶中選擇的。(來源)

Spark NLP 中的實現方式

Text2SQL 是在 Spark NLP for Healthcare 2.7.0 中宣布的一項功能,這是撰寫本文時的最新版本。基本上,我們使用 Tensorflow 實現了 IRNet 算法,并在 Spider 基準數據集上進行訓練,并將其封裝為 Spark NLP 中的 Tex2SQLModel。目前,它僅提供了一個預訓練模型,名為 text2sql_glove,因為它是使用 Spark NLP 中的 glove_6B_300 嵌入進行訓練的。

正如我們之前解釋的,IRNet 需要在實際構建查詢之前解析數據庫模式(模式編碼器)。這是通過我們創建的另一個注釋器 Text2SQLSchemaExporter 來完成的。

以下是獲取 Spark NLP 中的 Text2SQL 管道的步驟,以便您可以使用口語查詢數據庫。

  • 首先,我們需要從原始數據庫模式準備一個 json 文件。假設我們有一個 醫院記錄的 SqLite,包含以下 15 個表:

來自醫療記錄的 Text2SQL(圖片來自 官方論文)

['Physician',  'Department',  'Affiliated_With',  'Procedures', 'Trained_In', 'Patient', 'Nurse', 'Appointment', 'Medication', 'Prescribes', 'Block', 'Room', 'On_Call', 'Stay', 'Undergoes']

然后,我們使用以下代碼將該模式轉換為我們的模式解析器可以理解的 json 格式。將此處理放在 Text2SQLSchemaExporter 注釋器之外的原因是為了能夠支持其他數據庫模式,而無需更改注釋器邏輯。

from sparknlp_jsl._tf_graph_builders.text2sql import util
input_schema = "hospital_records.sqlite"
output_schema = "hospital_schema_converted.json"
util.sqlite2json(input_schema, output_schema)

然后,使用 Text2SQLSchemaExporter,我們使用詞嵌入處理這個模式,以創建表和列名的表示。

schema_json_path = 'hospital_schema_converted.json'
output_json_path = "db_embeddings.json"
prepare_db_schema(schema_json_path, output_json_path)

prepare_db_schema 函數來自包含 Text2SQLSchemaExporter 階段的 Spark NLP 管道。本文末尾將分享整個管道。

下一步是準備一個管道,將文本查詢的表示轉換為我們的 Text2SQLModel 注釋器可以理解的格式。基本上,它將接受用戶以純文本形式提出的問題,并創建算法返回查詢所需的所有特征。

sql_prediction_light = get_text2sql_model (schema_json_path, output_json_path)

sql_prediction_light 函數來自包含 Text2SQLModel 階段的 Spark NLP 管道。本文末尾將分享整個管道。

現在,我們可以開始使用純文本查詢數據庫:

question = "Find the id of the appointment with the most recent start date"
annotate_and_print(question)
>> question:
SELECT T1.Appointment FROM Prescribes 
AS T1 JOIN Appointment AS T2 ON 
T1.Appointment = T2.AppointmentID 
ORDER BY T2.Start 
DESC LIMIT 1
>> query:
|    | Appointment | 
|---:|:------------| 
|  0 | 086213939   |

另一個例子

question = "What is the name of the nurse who has the most appointments?"
annotate_and_print(question)
>> query:
SELECT T1.Name FROM Nurse AS T1 
JOIN Appointment AS T2 ON 
T1.EmployeeID = T2.PrepNurse 
GROUP BY T2.prepnurse 
ORDER BY count(*) 
DESC LIMIT 1
>> result:
|    | Name             | 
|---:|:-----------------| 
|  0 | Carla Espinosa   |

再舉一個例子

question = "How many patients do each physician take care of? List their names and number of patients they take care of."
annotate_and_print(question)
>> query:
SELECT T1.Name, count(*) 
FROM Physician AS T1 
JOIN Patient AS T2 ON 
T1.EmployeeID = T2.PCP 
GROUP BY T1.Name
>> result:
|    | Name             |   count(*) | 
|---:|:-----------------|-----------:| 
|  0 | Christopher Turk |          1 | 
|  1 | Elliot Reid      |          2 | 
|  2 | John Dorian      |          1 |

正如您所見,它返回了相當不錯的結果!實際上,由于它僅在通用數據集(Spider)上進行訓練,因此在某些特定領域的數據庫(如醫療保健或金融)上可能表現不佳。但這只是找到合適的數據集并重新訓練模型的問題。

我們計劃在未來幾個月內對其他領域數據集訓練新的 Text2SQL 模型。下一個將基于 MIMIC 數據集進行訓練,它將在醫療記錄方面表現更好。

總結

自新千年伊始,每日產生的數據量呈指數級增長。其中大部分數據存儲在關系型數據庫中。盡管數據科學的熱度不斷攀升,但大多數人仍缺乏編寫 SQL 查詢數據的必要知識。

結合查詢非結構化文本數據的固有困難,從數據庫中查找相關信息的任務需要多學科的技能。Spark NLP for Healthcare 旨在通過解析文本數據以提取有意義的實體(NerDL)、分配斷言狀態(AssertionDL)和醫學術語代碼(EntityResolver)、構建實體之間的關系(RelationExtractionDL)、將所有這些內容寫入類似 OMOP 的結構化數據庫模式,最后使用本文中描述的對話式純文本查詢這些記錄,為這一任務提供解決方案。

您可以在 這個 Colab 筆記本 中找到所有代碼和更多示例,如果您想在自己的數據上嘗試,可以申請 Spark NLP Healthcare 免費試用許可證。

Spark NLP 庫在企業項目中得到應用,它原生基于 Apache Spark 和 TensorFlow 構建,并提供全方位最先進的自然語言處理解決方案,為機器學習管道提供簡單、高效且準確的自然語言處理注釋,這些注釋可以在分布式環境中輕松擴展。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/80623.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80623.shtml
英文地址,請注明出處:http://en.pswp.cn/web/80623.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微服務項目->在線oj系統(Java版 - 5)

相信自己,終會成功 微服務代碼: lyyy-oj: 微服務 目錄 C端代碼 用戶題目接口 修改后用戶提交代碼(應用版) 用戶提交題目判題結果 代碼沙箱 1. 代碼沙箱的核心功能 2. 常見的代碼沙箱實現方式 3. 代碼沙箱的關鍵問題與解決方案 4. 你的代碼如何與沙箱交互? …

Vue3 Element Plus 中el-table-column索引使用問題

在 Element Plus 的 el-table 組件中&#xff0c;使用 scope.index 是不準確的。正確的索引屬性應該是 scope.$index。你的代碼需要調整為&#xff1a; vue 復制 下載 <el-button type"primary" size"default" text click"onModifyClick(scope…

Ubuntu20.04下使用dpkg方式安裝WPS后,將WPS改為中文界面方法

Ubuntu20.04下使用dpkg方式安裝WPS后&#xff0c;將WPS改為中文界面方法 說明方法 說明 Ubuntu20.04下使用dpkg方式安裝WPS后&#xff0c;打開WPS后&#xff0c;發現界面是英文的&#xff0c;如有需要可以按照下面的方法將其改為中文界面。 方法 cd /opt/kingsoft/wps-offic…

【??HTTPS基礎概念與原理?】??HTTPS vs HTTP:為什么現代網站必須用HTTPS?

以下是關于 HTTPS vs HTTP 的詳細對比分析&#xff0c;涵蓋安全性、性能差異及SEO影響&#xff0c;幫助您全面理解為何現代網站必須采用HTTPS&#xff1a; 一、安全性對比&#xff1a;HTTPS 如何解決 HTTP 的致命缺陷 1. HTTP 的安全隱患 ? 明文傳輸&#xff1a;HTTP 數據以明…

算法刷題(Java與Python)1.二分查找

目錄 二分查找 思路 總體 細節 問題一&#xff0c;為什么循環的條件是left<right ,為什么要有等號呢 問題二&#xff0c;為什么中間值是left (right - left) / 2 問題三&#xff0c;為什么最后返回的是左邊的值呢 情況 1&#xff1a;target 存在于數組中 情況 2&a…

芯片生態鏈深度解析(二):基礎設備篇——人類精密制造的“巔峰對決”

【開篇&#xff1a;設備——芯片工業的“劍與盾”】 當ASML的EUV光刻機以每秒5萬次激光脈沖在硅片上雕刻出0.13nm精度的電路&#xff08;相當于在月球表面精準定位一枚二維碼&#xff09;&#xff0c;當國產28nm光刻機在華虹產線實現“從0到1”的突破&#xff0c;這場精密制造…

MongoTemplate 基礎使用幫助手冊

前言 MongoDB 是一種流行的 NoSQL 數據庫&#xff0c;適合存儲大量的非結構化數據。MongoTemplate 是 Spring Data MongoDB 中的一個核心組件&#xff0c;它提供了一組豐富的 API 來與 MongoDB 進行交互。它封裝了許多常見的數據庫操作&#xff0c;使開發者能夠輕松執行 CRUD 操…

psotgresql18 源碼編譯安裝

環境&#xff1a; 系統&#xff1a;centos7.9 數據庫&#xff1a;postgresql18beta1 #PostgreSQL 18 已轉向 DocBook XML 構建體系&#xff08;SGML 未來將被棄用&#xff09;。需要安裝 XML 工具鏈&#xff0c;如下&#xff1a; yum install -y docbook5-style-xsl libxsl…

C++編程起步項目

員工信息管理系統 需求 Employee.h #pragma once#include<iostream> #include<string>using namespace std;class Employee { public:int id; // 編號string name; // 姓名string position; // 崗位int deptId; // 部門編號Employee();Employee(int id, string n…

Linux的MySQL頭文件和找不到頭文件問題解決

頭文件 #include <iostream> #include <mysql_driver.h> #include <mysql_connection.h> #include <cppconn/statement.h> #include <cppconn/resultset.h> #include <cppconn/prepared_statement.h> #include <cppconn/exception.h&g…

[ linux-系統 ] 命令行參數 | 環境變量

命令行參數 命令行參數是指用戶在啟動程序時通過命令行傳遞給程序的參數。這些參數可以用于控制程序的行為、傳遞輸入數據或配置選項。 在 C/C 中&#xff0c;命令行參數通過 main 函數的參數傳遞 命令行參數列表 argc:參數的個數 argv[]&#xff1a;參數的清單 為什么要…

新書速覽|鴻蒙HarmonyOS NEXT開發之路 卷2:從入門到應用篇

《鴻蒙HarmonyOS NEXT開發之路 卷2&#xff1a;從入門到應用篇》 01 本書內容 《鴻蒙HarmonyOS NEXT開發之路 卷2&#xff1a;從入門到應用篇》是一本深度聚焦HarmonyOS NEXT應用開發的全方位指導書&#xff0c;內容遵循由淺入深的原則展開。全書分為基礎知識、應用開發進階和…

經典密碼學和現代密碼學的結構及其主要區別(1)凱撒密碼——附py代碼

密碼學是一門通過使用代碼和密碼來保護信息的藝術與科學&#xff0c;其歷史可以追溯到數千年前。古典密碼學代表了這一古老學科早期的篇章。早在計算機和現代加密算法出現之前&#xff0c;歷史上的各個文明就依靠巧妙的方法來保護機密、安全通信以及獲取戰略優勢。 古典密碼學…

Python60日基礎學習打卡D30

回顧&#xff1a; 導入官方庫的三種手段導入自定義庫/模塊的方式導入庫/模塊的核心邏輯&#xff1a;找到根目錄&#xff08;python解釋器的目錄和終端的目錄不一致&#xff09; # 直接導入 from random import randint print(randint(1, 10)) # 導入自定義庫 import module m…

Linux利用多線程和線程同步實現一個簡單的聊天服務器

1. 概述 本文實現一個基于TCP/IP的簡單多人聊天室程序。它包含一個服務器端和一個客戶端&#xff1a;服務器能夠接收多個客戶端的連接&#xff0c;并將任何一個客戶端發來的消息廣播給所有其他連接的客戶端&#xff1b;客戶端則可以連接到服務器&#xff0c;發送消息并接收來自…

ubuntu系統 | dify+ollama+deepseek搭建本地應用

1、安裝 Ollama 下載并安裝 Ollama (llm) wangqiangwangqiang:~$ curl -fsSL https://ollama.ai/install.sh | bash >>> Installing ollama to /usr/local >>> Downloading Linux amd64 bundle0.3% curl -fsSL https://ollama.ai/install.sh &#xff08;下…

從紙質契約到智能契約:AI如何改寫信任規則與商業效率??——從智能合約到監管科技,一場顛覆傳統商業邏輯的技術革命

一、傳統合同的“低效困境”&#xff1a;耗時、昂貴、風險失控 近年來&#xff0c;全球商業環境加速向數字化轉型&#xff0c;但合同管理卻成為企業效率的“阿喀琉斯之踵”。據國際商會&#xff08;International Chamber of Commerce&#xff09;數據顯示&#xff0c;全球企業…

【機器學習|學習筆記】基于生成對抗網絡的孿生框架(GAN-based Siamese framework,GSF)詳解,附代碼。

【機器學習|學習筆記】基于生成對抗網絡的孿生框架(GAN-based Siamese framework,GSF)詳解,附代碼。 【機器學習|學習筆記】基于生成對抗網絡的孿生框架(GAN-based Siamese framework,GSF)詳解,附代碼。 文章目錄 【機器學習|學習筆記】基于生成對抗網絡的孿生框架(G…

UEFI Spec 學習筆記---33 - Human Interface Infrastructure Overview---33.2.6 Strings

33.2.6 Strings UEFI 環境中的 string 是使用 UCS-2 格式定義&#xff0c;每個字符由 16bit 數據表示。對于用戶界面&#xff0c;strings 也是一種可以安裝到 HIIdatabase 的一種數據。 為了本土化&#xff0c;每個 string 通過一個唯一標識符來識別&#xff0c;而每一個標識…

Stable Diffusion 學習筆記02

模型下載網站&#xff1a; 1&#xff0c;LiblibAI-哩布哩布AI - 中國領先的AI創作平臺 2&#xff0c;Civitai: The Home of Open-Source Generative AI 模型的安裝&#xff1a; 將下載的sd模型放置在sd1.5的文件內即可&#xff0c;重啟客戶端可用。 外掛VAE模型&#xff1a…