自然语言查询接口IDCQ(二)算法描述

自然语言查询接口实现算法,是可独立于特定数据库的,这里采用企业进销存管理系统做示例展示。

算法分为3大部分:分词 词性匹配 SQL语句构造

分词

使用开源的分词工具,只需导入相应的jar包,学习分词方法,即可完成。但是为了确保分词的准确性,必须采取循环多次分词的方法(由于分词工具有局限性)。举个例子:查询语句“查询房间号码为NO5200的住户信息”。如果不采取循环多次分词,“房间”和“号码”会分开作为两个词,这显然是不符合语义的。

采取循环多次分词的意思是:每一次只取句子分词结果的第一个词,剩下的词在重构成新的句子继续执行分词算法,直到分完为止。截图展示:

为了使分词结果更准确,我们需要根据数据库系统构造相应的词典。词典应当包含查询语句所有可能出现的词。保存在dict.txt文件内


词性匹配

①对上一步得到的词,需要匹配对应的属性(数据库表的列名,但是不全是)。

词典截图dict.txt(包含词和词性)



SQL语句构造

算法模拟人构造SQL语句的思路,根据所有的属性,分别确定selectfromwhere关键词后的语句。

对于每个正常的查询语句,我们要求在必要的地方包含结构助词“的”(对应的属性tttt)。因为根据它可以方便断句。举个例子:“查询黄金的单价”。分词和词性匹配后截图展示:


这样根据判断select”和“tttt”前后的属性,就可以确定跟在select后的属性是dj(单价),跟在where后面的语句是tb_spinfo.spname='黄金'

接下里需要根据所有获得的有效属性来确定表。这里包括dj’黄金’两个,可确定tb_kc(库存表)和sp_info(商品信息表),则跟在from后的语句是tb_kc natural join tb_spinfo,采用自然连接可以避免很多问题。

④表之间的关联(主键与外键)。这里出现了两个表tb_kc(库存表)和sp_info(商品信息表),所以需要在where后面加上tb_kc.id = tb_spinfo.id

⑤为了方便观察查询结果,我还把'黄金'对应的属性tb_spinfo.spname加入到了select关键词后。

⑥最后构造的SQL语句:select tb_spinfo.spname,dj from tb_kc natural join tb_spinfo where tb_kc.id = tb_spinfo.id and tb_spinfo.spname='黄金'


作者申明

上面只展示了一个简单的示例,更多查询语句的其它细节不在展示。

对于带有相对时间的查询语句(例如“查询去年8退货的商品信息”),可能在你测试的时候构造的时间表达式并不能在数据库中有某一行与之对应,即查询结果为空,望留意。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值