跳转到主要内容

将自然语言转换为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/>

项目详情


发布历史 发布通知 | RSS源

下载文件

为您的平台下载文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分布

ln2sql-0.1.tar.gz (4.6 kB 查看哈希值)

上传时间

由以下赞助

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面