将自然语言转换为SQL查询
项目描述
# ln2sql
<b>ln2sql是一个用于使用自然语言查询数据库的NLP工具。</b>该工具接受数据库模型和句子作为输入,并将后者转换为能够查询输入数据模型的有效SQL语句。
##### 科学论文
以下法语论文(可在`docs/`目录中找到)描述了初始工具
<i><a rel="license" href="https://www.researchgate.net/publication/278965118_fr2sql_Interrogation_de_bases_de_donnees_en_francais">Benoît Couderc and Jérémy Ferrero. fr2sql : Database Query in French. (fr2sql : 在法语中查询数据库 [法语]). 在第17届RECITAL会议(与第22届TALN会议相关)。2015年6月。法国卡昂。ATALA。第1-12页 </a></i>
如果您使用ln2sql,请引用该论文。
#### 论文版本(fr2sql)与这个版本(ln2sql)之间的差异
由于版权原因,ln2sql不是最先进的工具。它只是一个快速的Python包装器,但有一些速度优化。
* [数据模型仅从SQL转储文件的解析中学习。因此,<b>不需要数据库连接</b>。](https://github.com/FerreroJeremy/ln2sql#database-input)
在论文中,使用<a rel="tt" href="http://www.cis.uni-muenchen.de/~schmid/tools/TreeTagger/">TreeTagger</a>根据其词性标注过滤输入句子的单词。
这样,就可以在输入句子的关键词和数据模型的关键词之间执行映射。
在ln2sql中,优先选择导入个人配置文件(包括[语言](https://github.com/FerreroJeremy/ln2sql#supported-languages)、[停用词和同义词](https://github.com/FerreroJeremy/ln2sql#thesaurus-and-stop-word-list))以提高通用性。
请注意,ln2sql因此无法自动解决性别和数量问题。因此,如果输入句子中包含单词“学生”的复数形式“学生”,则与模型数据中的表“学生”不匹配。
为了做到这一点,必须在[使用的同义词库](https://github.com/FerreroJeremy/ln2sql#thesaurus-and-stop-word-list)中存在等价关系“学生 → 学生”。
如果您想使用TreeTagger版本,存在一个Python包装器,并且可以在这里找到文档。
* 理论上,所有语言都可以得到支持。(https://github.com/FerreroJeremy/ln2sql#supported-languages)
* 语法仍然解析输入句子以生成相应的查询结构,但现在这个结构被存储在可以打印[查询结构JSON文件](https://github.com/FerreroJeremy/ln2sql/blob/master/README.md#json-output)的Python类中。因此,查询生成的哈希表已被放弃。此外,还采用了多线程实现。
## 支持的SQL语句
- [X] SELECT
- [X] 单个列
- [X] 多个列
- [X] 所有列
- [X] 不同的选择
- [X] 聚合函数
- [X] count-select
- [X] sum-select
- [X] avg-select
- [X] min-select
- [X] max-select
- [X] JOIN
- [X] 内连接
- [X] 自然连接
- [X] WHERE
- [X] 一个条件
- [X] 多个条件
- [X] 逻辑连接
- [X] 析取连接
- [X] 交叉条件
- [X] 运算符
- [X] 等于运算符
- [X] 不等于运算符
- [X] 大于运算符
- [X] 小于运算符
- [X] LIKE运算符
- [ ] BETWEEN运算符(效率不是100%)
- [X] 聚合函数
- [X] 条件中的SUM
- [X] 条件中的AVG
- [X] 条件中的MIN
- [X] 条件中的MAX
- [X] ORDER BY
- [X] ASC
- [X] DESC
- [X] GROUP BY
- [X] 多个查询
- [X] 异常和错误处理
- [ ] 值检测(效率不是100%)
## 如何使用它?
#### 支持的语言
工具可以处理任何语言,只要它有相应的配置文件(即包含语言关键词的文件)。
语言配置文件可以在`lang/`目录中找到。这些文件是CSV文件。每一行代表一种关键词类型。冒号之前的内容将被忽略。关键词必须由逗号分隔。
您可以按照英语和法语模板自行构建语言配置文件。
#### 数据库输入
为了有效,ln2sql需要学习用户想要查询的数据库的数据模型。它需要加载相应的SQL转储文件来完成此操作。
数据库转储是一个包含数据库表结构记录和/或数据的文件。(https://en.wikipedia.org/wiki/Database_dump)
##### Database类的使用
```python
database = Database()
database.load("database/tal.sql")
database.print_me()
```
对于加载的以下SQL语句,终端输出的输出如下
<p align="center"><img src="https://raw.githubusercontent.com/FerreroJeremy/ln2sql/master/docs/database_loading.png" width="700"></p>
#### 同义词库和停用词列表
您可以使用同义词库来改进关键词过滤。同义词库可以在`thesaurus/`目录中找到。您可以按照OpenOffice模板自行构建同义词库。
您可以使用停用词列表来提高停用词过滤效果。您可以按照 `stopwords/` 目录中列表的模板创建自己的停用词列表。
#### 使用方法
您可以通过以下方式直接使用Python包装器
```
使用方法
python ln2sql.py -d <path> -l <path> -i <input-sentence> [-j <path>] [-t <path>] [-s <path>]
参数
-h 打印此帮助信息
-d <path> SQL转储文件的路径
-l <path> 语言配置文件的路径
-i <input-sentence> 要解析的输入句子
-j <path> JSON输出文件的路径
-t <path> 词典文件的路径
-s <path> 停用词文件的路径
```
使用示例
```
python ln2sql.py -d database/city.sql -l lang/english.csv -j output.json -i "Count how many city there are with the name blob?"
```
或者通过图形界面,输入以下命令
```
python ln2sql_gui.py
```
将出现如下窗口
<p align="center"><img src="https://raw.githubusercontent.com/FerreroJeremy/ln2sql/master/docs/graphical_user_interface.png" width="600"></p>
## JSON输出
以下输入
```
What is the average age of students whose name is Doe or age over 25?
```
的输出为
```JSON
{
"select": {
"column": "age",
"type": "AVG"
},
"from": {
"table": "student"
},
"join": {
},
"where": {
"conditions": [
{ "column": "name",
"operator": "=",
"value": "Doe"
},
{
"operator": "OR"
},
{ "column": "age",
"operator": ">",
"value": "25"
}
]
},
"group_by": {
},
"order_by": {
}
}
```
## 设计理念
该工具是在模型-视图-控制器模式的基础上实现的。除了用于继承的类(例如 Thread 或 Exception)外,来自Python标准库的类没有出现在图中。
<p align="center"><img src="https://raw.githubusercontent.com/FerreroJeremy/ln2sql/master/docs/mvc_class_diagram.png"></p>
上述图由 <a rel="staruml" href="http://staruml.io/">StarUML</a> 模型。
<br/>
<br/>
<b>ln2sql是一个用于使用自然语言查询数据库的NLP工具。</b>该工具接受数据库模型和句子作为输入,并将后者转换为能够查询输入数据模型的有效SQL语句。
##### 科学论文
以下法语论文(可在`docs/`目录中找到)描述了初始工具
<i><a rel="license" href="https://www.researchgate.net/publication/278965118_fr2sql_Interrogation_de_bases_de_donnees_en_francais">Benoît Couderc and Jérémy Ferrero. fr2sql : Database Query in French. (fr2sql : 在法语中查询数据库 [法语]). 在第17届RECITAL会议(与第22届TALN会议相关)。2015年6月。法国卡昂。ATALA。第1-12页 </a></i>
如果您使用ln2sql,请引用该论文。
#### 论文版本(fr2sql)与这个版本(ln2sql)之间的差异
由于版权原因,ln2sql不是最先进的工具。它只是一个快速的Python包装器,但有一些速度优化。
* [数据模型仅从SQL转储文件的解析中学习。因此,<b>不需要数据库连接</b>。](https://github.com/FerreroJeremy/ln2sql#database-input)
在论文中,使用<a rel="tt" href="http://www.cis.uni-muenchen.de/~schmid/tools/TreeTagger/">TreeTagger</a>根据其词性标注过滤输入句子的单词。
这样,就可以在输入句子的关键词和数据模型的关键词之间执行映射。
在ln2sql中,优先选择导入个人配置文件(包括[语言](https://github.com/FerreroJeremy/ln2sql#supported-languages)、[停用词和同义词](https://github.com/FerreroJeremy/ln2sql#thesaurus-and-stop-word-list))以提高通用性。
请注意,ln2sql因此无法自动解决性别和数量问题。因此,如果输入句子中包含单词“学生”的复数形式“学生”,则与模型数据中的表“学生”不匹配。
为了做到这一点,必须在[使用的同义词库](https://github.com/FerreroJeremy/ln2sql#thesaurus-and-stop-word-list)中存在等价关系“学生 → 学生”。
如果您想使用TreeTagger版本,存在一个Python包装器,并且可以在这里找到文档。
* 理论上,所有语言都可以得到支持。(https://github.com/FerreroJeremy/ln2sql#supported-languages)
* 语法仍然解析输入句子以生成相应的查询结构,但现在这个结构被存储在可以打印[查询结构JSON文件](https://github.com/FerreroJeremy/ln2sql/blob/master/README.md#json-output)的Python类中。因此,查询生成的哈希表已被放弃。此外,还采用了多线程实现。
## 支持的SQL语句
- [X] SELECT
- [X] 单个列
- [X] 多个列
- [X] 所有列
- [X] 不同的选择
- [X] 聚合函数
- [X] count-select
- [X] sum-select
- [X] avg-select
- [X] min-select
- [X] max-select
- [X] JOIN
- [X] 内连接
- [X] 自然连接
- [X] WHERE
- [X] 一个条件
- [X] 多个条件
- [X] 逻辑连接
- [X] 析取连接
- [X] 交叉条件
- [X] 运算符
- [X] 等于运算符
- [X] 不等于运算符
- [X] 大于运算符
- [X] 小于运算符
- [X] LIKE运算符
- [ ] BETWEEN运算符(效率不是100%)
- [X] 聚合函数
- [X] 条件中的SUM
- [X] 条件中的AVG
- [X] 条件中的MIN
- [X] 条件中的MAX
- [X] ORDER BY
- [X] ASC
- [X] DESC
- [X] GROUP BY
- [X] 多个查询
- [X] 异常和错误处理
- [ ] 值检测(效率不是100%)
## 如何使用它?
#### 支持的语言
工具可以处理任何语言,只要它有相应的配置文件(即包含语言关键词的文件)。
语言配置文件可以在`lang/`目录中找到。这些文件是CSV文件。每一行代表一种关键词类型。冒号之前的内容将被忽略。关键词必须由逗号分隔。
您可以按照英语和法语模板自行构建语言配置文件。
#### 数据库输入
为了有效,ln2sql需要学习用户想要查询的数据库的数据模型。它需要加载相应的SQL转储文件来完成此操作。
数据库转储是一个包含数据库表结构记录和/或数据的文件。(https://en.wikipedia.org/wiki/Database_dump)
##### Database类的使用
```python
database = Database()
database.load("database/tal.sql")
database.print_me()
```
对于加载的以下SQL语句,终端输出的输出如下
<p align="center"><img src="https://raw.githubusercontent.com/FerreroJeremy/ln2sql/master/docs/database_loading.png" width="700"></p>
#### 同义词库和停用词列表
您可以使用同义词库来改进关键词过滤。同义词库可以在`thesaurus/`目录中找到。您可以按照OpenOffice模板自行构建同义词库。
您可以使用停用词列表来提高停用词过滤效果。您可以按照 `stopwords/` 目录中列表的模板创建自己的停用词列表。
#### 使用方法
您可以通过以下方式直接使用Python包装器
```
使用方法
python ln2sql.py -d <path> -l <path> -i <input-sentence> [-j <path>] [-t <path>] [-s <path>]
参数
-h 打印此帮助信息
-d <path> SQL转储文件的路径
-l <path> 语言配置文件的路径
-i <input-sentence> 要解析的输入句子
-j <path> JSON输出文件的路径
-t <path> 词典文件的路径
-s <path> 停用词文件的路径
```
使用示例
```
python ln2sql.py -d database/city.sql -l lang/english.csv -j output.json -i "Count how many city there are with the name blob?"
```
或者通过图形界面,输入以下命令
```
python ln2sql_gui.py
```
将出现如下窗口
<p align="center"><img src="https://raw.githubusercontent.com/FerreroJeremy/ln2sql/master/docs/graphical_user_interface.png" width="600"></p>
## JSON输出
以下输入
```
What is the average age of students whose name is Doe or age over 25?
```
的输出为
```JSON
{
"select": {
"column": "age",
"type": "AVG"
},
"from": {
"table": "student"
},
"join": {
},
"where": {
"conditions": [
{ "column": "name",
"operator": "=",
"value": "Doe"
},
{
"operator": "OR"
},
{ "column": "age",
"operator": ">",
"value": "25"
}
]
},
"group_by": {
},
"order_by": {
}
}
```
## 设计理念
该工具是在模型-视图-控制器模式的基础上实现的。除了用于继承的类(例如 Thread 或 Exception)外,来自Python标准库的类没有出现在图中。
<p align="center"><img src="https://raw.githubusercontent.com/FerreroJeremy/ln2sql/master/docs/mvc_class_diagram.png"></p>
上述图由 <a rel="staruml" href="http://staruml.io/">StarUML</a> 模型。
<br/>
<br/>
项目详情
关闭
ln2sql-0.1.tar.gz 哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 52d9f2ae1f5c3135cd4a88d457e564cdcb69d6ce254e58ae9a900cec216f4f58 |
|
MD5 | e288bf099efc4f775e5e863a0cdfd571 |
|
BLAKE2b-256 | 27124360db8a6432caf2f29dfea43fb8591d5ea6540e3d5d67ea8a619ee9aef9 |