gradio简单搭建——关键词匹配筛选
- 界面搭建
- 数据处理过程
- 执行效果展示
上一节使用DataFrame
中的apply
方法提升了表格数据的筛选效率,本节使用gradio
结合apply
方法搭建一个关键词匹配筛选的交互界面。
界面搭建
import gradio as gr
import pandas as pd
from file_generator import generate_file
class CONST:
# 指定传入文件格式
file_type_list = ['xlsx']
def submit(input_file,radio_input,keyword_input,desc):
"""
参数desc指下面的description,
没有在submit函数中起作用,但gr.Interface中定义了说明文本框gr.Text(),
如果不加该参数,会报错.
"""
# 输入文件路径格式设置
if '\\' in input_file:
input_file = input_file.replace('\\','/')
suf = input_file.split('.')[-1]
if suf not in CONST.file_type_list:
raise gr.Error('不支持的格式:{},请检查文件格式'.format(suf))
# 单选框设置
if not radio_input:
raise gr.Error('请选择一个任务')
else:
task = radio_input
# 关键词设置
# 分隔符统一,防止输入法切换问题
if ',' in keyword_input:
keyword_input = keyword_input.replace(',',',')
if ',' in keyword_input:
keyword_list = keyword_input.split(',')
else:
keyword_list = [keyword_input]
output = generate_file(input_file,task,keyword_list)
return output
description = """
1. 单元素匹配:筛选出包含输入元素的样本;
2. 多元素匹配:筛选出按输入元素顺序,包含输入元素的样本;
"""
demo = gr.Interface(
fn=submit,
inputs = [
# 上传文件框
gr.File(
file_count="single",
label="上传文件",
file_types=CONST.file_type_list),
# 单选框
gr.Radio(
choices=['单元素匹配','多元素匹配'],
label='选择匹配模式:'),
# 关键词输入文本框
gr.Textbox(
label='输入匹配关键词:',
placeholder='输入元素,若存在多个元素用逗号(英文)分隔'),
# 使用说明文本框
gr.Text(
description,
label='使用说明')
],
outputs=gr.File(label='输出文件'),
title='单元素/多元素匹配筛选数据'
)
# 需要手动安装frpc_windows_amd64_v0.2文件
demo.launch(share=True, server_name='0.0.0.0',server_port=8706)
数据处理过程
import pandas as pd
import os
def sorted_keywords_update(df,mode_input,keyword_list):
def sorted_keywords(str_input,sorted_word_list):
"""查找列表中的关键词,如果关键词有序地匹配成功返回True,否则返回False"""
count = 0
while count < len(sorted_word_list):
if sorted_word_list[count] in str_input:
str_input = "".join(str_input.split(sorted_word_list[count])[1:])
count += 1
else:
break
if count == len(sorted_word_list):
return True
else:
return False
def mode_2_rules(row):
"""多元素匹配模式规则"""
return sorted_keywords(row['文本信息'],keyword_list) == True
def mode_1_rules(df_input, keyword_list):
"""单元素匹配模式的规则"""
assert len(keyword_list) == 1
contain_df = df_input[df_input['文本信息'].str.contains(keyword_list[0])]
return contain_df
assert mode_input in ['单元素匹配','多元素匹配']
# 去除数据中的nan值
sub_df = sub_df[~sub_df['文本信息'].isna()]
if mode_input == '单元素匹配':
contain_df = mode_1_rules(sub_df,keyword_list)
else:
contain_df = sub_df[sub_df.apply(mode_2_rules,axis=1)]
# 创建输出文件夹并将数据写入文件
output_dir = f'./output/match_keyword/{mode_input}'
output_path = f'{output_dir}/{mode_input}_res.xlsx'
os.makedirs(output_dir, exist_ok=True)
contain_df.to_excel(output_path,index=False)
return output_path
def generate_file(file_path,task,keyword_input):
"""
file_path: 待筛选数据文件路径
task: 匹配模式:[单元素匹配,多元素匹配]
keyword_input: 匹配关键词
"""
df = pd.read_excel(file_path)
# 数据生成平台
output_file_path = sorted_keywords_update(df,task,keyword_input)
return output_file_path
执行效果展示
初始状态下,交互框的展示效果如下:
执行过程中,交互框的展示效果如下: