AlexSun1995 / ch2sql

Chinese natural language to sql(under development) 2017年<软件项目实训>项目 CST.ZJU

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

ch2sql

目标是用自然语言查询电子表格中的数据(区别于关系型数据库,我们只关心单表问题) . 总体思路是以查询输入语句和电子表格信息为输入, 结合自然语言处理工具将查询语句映射到数据库语义相关的节点中,最后转换为SQL类似的JSON表示结构

特性列表

  • 结合数据表语义分词, 确保字段名,常见的值不会被分词算法拆分.例如: 'APP下载量' 是表格的一个属性名, 不能拆分为'APP'和'下载量'两个词

  • 用词向量方法映射属性节点(AN)和值节点(NN) AN ,NN 以外的节点采用硬编码匹配方法, 优先匹配. 则剩下的节点可能是AN,NN,UN(UNKNOWN NODE) 三种可能. 依次与Table中记录的Column name 列表与Column Value比对,比对的结果是(0,1)之间的一个score, score越大, 则两者之间越匹配

  • 修改了开源的Synonyms, 开源版本中对word2vec模型中不存在的词统一返回size 为(100,) 值全部为0的向量. 这样会造成的问题是,如果用户比较的两个词都不在模型中,返回的score会比较大,尽管两个词没有多大的关系. 我们将不存在词的 向量设置为随机向量.显著提高了word2vec模型中不存在词的判定准确度

  • 查询改写 对输入的查询语言进行处理. 通过正则表达式将"比...大|高|多"的形式统一改写称为大于... 的形式. 将"在...和|到 ... 之间"的查询形式统一改写成'小于...并且大于...'的形式

转换策略

开发日志

  • (在此之前没有记录)
  • 2018-2-5 查询改写函数(sentence 模块中query_rewrite函数)

使用方法

TODO LIST

  • [ ]目前仍然有一个缺陷, 我们可以结合数据表的属性和值改变结巴分词的分词策略,让这些特定值不能拆分. 属性名"客户类别"不会被拆分,但是如果用户的 输入是"客户分类", 显然和"客户类别"是同一个意思, 但是这个词会被拆分为"客户", "分类"两个词.这显然是不正确的. 改进想法: "编码", "类别"这些词通常会和其他的名词一起组合出现在数据表的属性名中. 如"客户类别", "用户编码", 在扫描数据表信息时 将"客户"与"类别"拆开,然后将"客户"与"类别"的近义词组合, 这样会生成很多"客户类别","客户种类"等标准属性名的别名.将这些别名存储在一起 ;在对查询语句分词时添加到词典列表中,就能确保这些词不会被拆分开
  • [ ]比较问题中,中文中常常使用"比***大"的形式,考虑使用正则解决这个问题

About

Chinese natural language to sql(under development) 2017年<软件项目实训>项目 CST.ZJU


Languages

Language:Python 100.0%