本人查阅大量网上的资料发现,大多数实现表格搜索的功能都是通过nlp2sql(text2sql) 的方式实现的😅,对于没有接触过自然语言处理或者没有接触过数据库的小白 非常的不友好😶,所以这里我们采用一种取巧的办法来实现表格搜索的功能,虽然效果可能没有nlp2sql(text2sql)好,但是对于数据量不大的情况下还是可以取得不错的效果的🥳。
假设我们有一张表格如下:
姓名 | 语文 | 数学 | 英语 |
---|---|---|---|
张三 | 98 | 96 | 88 |
李四 | 76 | 77 | 65 |
我们要怎样实现表格搜索呢?☜(゚ヮ゚☜)我们通过比较文本相似度来实现表格相似度。比较哪两段文本的相似度呢?(☞゚ヮ゚)☞
比如说目前有一个问题是:张三的语文成绩是多少?,我们通过对表格进行处理(将表头和字段进行合并)可以得到一个形如{问题:答案}
的字典:
{"张三语文":98,"张三数学":96,"张三英语":88,"李四语文":76,"李四数学":77,"李四英语":65}
我们将问题依次与字典中的键进行文本相似度比对,找出与问题相似度最高的键,最终可以发现我们的问题张三的语文成绩是多少?
和张三语文
的相似度最高,再通过键值索引将张三语文
对应的值索引出来,这就相当于我们变相的实现了表格搜索的功能。这样虽然实现了表格搜索但是缺陷也是十分的明显。
进行文本相似度比较时,需要与字典中的每一个键进行比较,所以如果数据量很大的话,这种方式会消耗很多的时间在比较当中,所以这种方法适用于较小数据量的场景。
**注意:**process_data.py、 cal_similarity.py、add_data.py这三个脚本文件都是可以独立运行的。
正常的执行顺序是process_data.py ⇨ cal_similarity.py ⇨ add_data.py。
Table Q&A
┣━━add_data.py # 扩展dict.txt,添加数据的py脚本
┣━━cal_similarity.py # 计算文本相似度的py脚本
┣━━data # data为存放待处理数据的文件夹
┃ ┣━━data.xlsx
┃ ┗━━data2.xlsx
┣━━main.py # 为主函数,可以在其中调用其他脚本文件
┣━━process_data.py # 预处理xlsx表格文件的py脚本
┣━━README.md
┣━━res_dict # res_dict文件夹用于存储py脚本运行过程中生成的过渡文件
┃ ┗━━dict.txt # dict.txt为预处理产生类字典形的文本文件
┣━━test # test文件夹用于存储测试代码及与项目无关的代码
┃ ┣━━generate_tree.py
┃ ┗━━test.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'
}
📽效果演示
通过数据预处理的步骤,可以说我们已经得到了{问题:答案}
字典类型的dict.txt文件了,现在只需要输入问题,然后我们将问题依次与字典中的键进行文本相似度比对,找出与问题相似度最高的键,再通过键值索引得出对应的值(也就是回答)。
📽效果演示
为了对我们的dict.txt中的问答数据进行扩展,我还另外写了一个对dict.txt数据进行扩展的脚本。首先你需要一个下面这种格式的excel表格。
question | answer |
---|---|
今天吃了饭没? | 没 |
今天天气怎么样? | 还可以没有下雨 |
然后将需要添加的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'
}
📽效果演示
如果本仓库对你有帮助,可以请作者喝杯卡布奇诺☜(゚ヮ゚☜)