python实现表格搜索脚本

  • Post author:
  • Post category:python




一、🍕整体实现方案

本人查阅大量网上的资料发现,大多数实现表格搜索的功能都是通过

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仓库地址🙉



博客首页🙊



版权声明:本文为booze_原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。