文章
一、🍕整体实现方案
本人查阅大量网上的资料发现,大多数实现表格搜索的功能都是通过
nlp2sql(text2sql)
的方式实现的😅,对于没有接触过自然语言处理或者没有接触过数据库的小白
非常的不友好
😶,所以这里我们采用一种
取巧的办法
来实现表格搜索的功能,
虽然效果可能没有nlp2sql(text2sql)好
,但是对于
数据量不大
的情况下还是可以取得
不错的效果
的🥳。
二、🍳什么是nlp2sql(text2sql)呢?
1.nlp2sql(text2sql)概述🔎
nlp2sql(text2sql)
( 以下
简称Text2SQL
),是
将自然语言文本(Text)转换成结构化查询语言SQL
的过程,属于自然语言处理-语义分析(Semantic Parsing)领域中的子任务。
它的目的可以简单概括为:
“打破人与结构化数据之间的壁垒”
,即普通用户可以通过
自然语言描述
完成复杂数据库的查询工作,得到想要的结果。
2.nlp2sql(text2sql) 简单示例 (Demo)
示例
表_1-1
代码 | 名称 | 上市地点 | 收盘价 | 周涨跌幅 | 月涨跌幅 |
---|---|---|---|---|---|
SINA.O | 新浪 | 纳斯达克 | 58.93 | -4.52 | 8.791 |
BITA.N | 易车 | 纽约证券交易所 | 18.11 | -4.78 | -11.742 |
JRJC.O | 金融界 | 纳斯达克 | 1.09 | -9.17 | 2.834 |
SFUN.N | 淘屏 | 纳斯达克 | 1.09 | -9.17 | 2.834 |
SFUN.N | 搜房网 | 纽约证券交易所 | 1.71 | -9.52 | 28.575 |
RENN.N | 人人网 | 纽约证券交易所 | 1.61 | -9.55 | 14.18 |
Query:新浪和人人网的周涨跌幅分别是多少?
SQL:
SELECT
周涨跌幅
FROM
表_1-1
WHERE
名称=‘新浪’
OR
名称=‘人人网’
用户输入一句普通文本,模型将其转换为 SQL,查询数据库得到结果:“-4.52, -9.55”
当然实际场景或业务中,需要查询的内容可能更加复杂(例如涉及跨表、嵌套查询,group by/having 等查询条件等)。
SQL组成
SQL组成来自三部分:
数据库中元素
(表名、列名)、
问题中的词汇
、
SQL关键字
。
三、🍖取巧的办法
假设我们有一张表格如下:
姓名 | 语文 | 数学 | 英语 |
---|---|---|---|
张三 | 98 | 96 | 88 |
李四 | 76 | 77 | 65 |
我们要
怎样实现
表格搜索呢?☜(゚ヮ゚☜)我们通过
比较文本相似度
来实现表格相似度。
比较哪两段
文本的相似度呢?(☞゚ヮ゚)☞
比如说目前有一个问题是:
张三的语文成绩是多少?
,我们通过对表格进行处理(
将表头和字段进行合并
)可以得到一个形如
{问题:答案}
的字典:
{"张三语文":98,"张三数学":96,"张三英语":88,"李四语文":76,"李四数学":77,"李四英语":65}
我们将
问题
依次与字典中的
键
进行
文本相似度比对
,找出与问题相似度最高的
键
,最终可以发现我们的问题
张三的语文成绩是多少?
和
张三语文
的相似度最高,再通过
键值索引
将
张三语文
对应的
值
索引出来,这就相当于我们
变相的实现了表格搜索
的功能。这样虽然实现了表格搜索但是
缺陷
也是
十分的明显
。
缺陷
-
进行文本相似度比较时,需要与字典中的每一个
键
进行比较,所以如果
数据量很大
的话,这种方式会
消耗
很多的
时间
在比较当中,所以这种方法适用于较小数据量的场景。
四、🍯文本相似度计算
参考博客
Python+gensim-文本相似度分析(小白进)
五、🍴脚本的实际应用
1.整体思路
(1)🌱数据预处理(process_data.py)
注意:
process_data.py
可以
根据表格的不同,写自己的数据预处理代码
,只要最终处理完的文件
保存为dict.txt的形式,并保存在res_dict文件夹下
即可🧐。
将excel表格中的内容转化为字典形式文本,其中数据预处理部分的代码会生成字典形式的文本文件,形如(dict.txt),保存在res_dict文件夹下:
{
'张三语文': '98', '张三数学': '96', '张三英语': '88',
'李四语文': '76', '李四数学': '77', '李四英语': '65',
'王二麻子语文': '76', '王二麻子数学': '92', '王二麻子英语': '90',
'隔壁老王语文': '95', '隔壁老王数学': '80', '隔壁老王英语': '79'
}
📽效果演示

(2)🌺计算文本相似度(cal_similarity.py)
通过数据预处理的步骤,可以说我们已经得到了
{问题:答案}
字典类型的dict.txt文件了,现在只需要
输入问题
,然后我们
将问题依次与
字典中的
键
进行文本
相似度比对
,
找出与问题相似度最高的键
,再通过
键值索引
得出对应的值(也就是回答)。
📽效果演示

(3)🌷数据库补充(add_data.py)
为了对我们的
dict.txt
中的问答
数据
进行
扩展
,我还另外写了一个对dict.txt数据进行扩展的脚本。首先你需要一个下面这种格式的
excel表格
。
question | answer |
---|---|
今天吃了饭没? | 没 |
今天天气怎么样? | 还可以没有下雨 |
⋯ \cdots ⋯ |
⋯ \cdots ⋯ |
然后
将需要添加的excel文件路径传入add_data.py即可将excel表格中的问答数据更新到dict.txt中
。
更新前的dict.txt
{
'张三语文': '98', '张三数学': '96', '张三英语': '88',
'李四语文': '76', '李四数学': '77', '李四英语': '65',
'王二麻子语文': '76', '王二麻子数学': '92', '王二麻子英语': '90',
'隔壁老王语文': '95', '隔壁老王数学': '80', '隔壁老王英语': '79'
}
更新后的dict.txt
{
'今天吃完了饭没': '没', '今天天气怎么样': '还可以没有下雨','今天晚上一起去散步吗': '可以',
'张三语文': '98', '张三数学': '96', '张三英语': '88',
'李四语文': '76', '李四数学': '77', '李四英语': '65',
'王二麻子语文': '76', '王二麻子数学': '92', '王二麻子英语': '90',
'隔壁老王语文': '95', '隔壁老王数学': '80', '隔壁老王英语': '79'
}
📽效果演示


六、🌵完整项目代码
完整代码已上传至gitee以及github,有需要的朋友可以去fork。
github仓库地址🙈
gitee仓库地址🙉
博客首页🙊