gradio简单搭建——关键词简单筛选【2024-4-11优化】

gradio简单搭建——关键词简单筛选[2024-4-11 优化]

    • 新的思路:标签自动标注
    • 界面搭建优化
    • 数据处理与生成过程
    • 交互界面展示

新的思路:标签自动标注

针对通过关键词,在文本数据中体现出主体的工作类型这一任务,这里使用展示工具gradio制作一个简单的交互平台。在前两天的优化后,我们可以通过无效关键词、单元素/多元素关键词顺序匹配的方式对文本数据进行约束,从而找出符合匹配条件的数据信息,并更加高效地执行下游的标注任务

当对数据信息存在一定程度的了解后,我们可以找出一些针对性极强的关键词,就像上一节描述的低光速黑域一样——“简单、潦草”地看上一眼,就能知道主体的动作、行为大概率描述某一具体工作。例如:

某人对材料进行焊接过程中,不小心被烫伤。

分析:焊接这个词更多是电焊工/焊接工的专业动作;过程中则描述过去正在进行专业动作的状态。这两个词的组合成的关键词,可以极大概率指向电焊工/焊接工这个工种。

但是发现:如果仅仅是查找单元素关键词匹配已经实现了,但标注工作还是要亲自去做。为了减少操作步骤、简化工作量,我们更希望:这类指向性强关键词,直接将对应标签标注上去。这也是本次优化目标

  • 添加一组标注相关的单选框,将单/多元素关键词匹配的查找结果对应的标签信息更新到原始数据中,最终输出完整数据;
  • 给单选框设置默认值,减少greet函数内的判断逻辑。

界面搭建优化

这里并没有强制性地赋予单/多元素匹配单选框默认选项主要因为上一节关于该单选框均为空也可以执行.

import gradio as gr
from file_generator import generate_fileclass CONST:file_type_list = ['xlsx']def submit(input_file,invalid_task,invalid_keyword_input,task,keyword_input,mask_task,mask_keyword,desc):print(f'task:{task}')print(f'keyword_input:{keyword_input}')print(f'invalid_task:{invalid_task}')print(f'invalid_keyword_input:{invalid_keyword_input}')# 输入文件格式设置if not input_file:raise gr.Error('请上传文件')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))# 2024-4-11 优化:添加了无效元素匹配单选框的默认选项,减少一部分判断操作if invalid_keyword_input:if invalid_task == '禁用':raise gr.Error('无效元素匹配[禁用]时,无法输入无效元素') # 选择禁用时,文本框不可用else:if ',' in invalid_keyword_input:invalid_keyword_input = invalid_keyword_input.replace(',',',')if ',' in invalid_keyword_input:invalid_keyword_list = invalid_keyword_input.split(',')else:invalid_keyword_list = [invalid_keyword_input]else:if invalid_task == '启用':raise gr.Error('无效元素匹配[启用]时,请输入无效元素') # 选择启用时,文本框内必须输入无效元素else:invalid_keyword_list = list()# [单/多元素匹配]逻辑描述# 暂未添加单选框的[默认]选项if task:if not keyword_input:raise gr.Error('请输入匹配关键词')  # 已选择[单/多元素匹配]条件下,文本框内必须输入匹配元素else:if ',' in keyword_input:keyword_input = keyword_input.replace(',',',')if ',' in keyword_input:if task == '单元素匹配':raise gr.Error('单元素匹配模式不支持输入多个关键词')else:keyword_list = keyword_input.split(',')else:if task == '多元素匹配':raise gr.Error('多元素匹配模式不支持输入单个关键词')else:keyword_list = [keyword_input]else:task = '无元素匹配'keyword_list = list() # 未选择使用[单/多元素匹配]# [仅执行查找,填充]逻辑操作if mask_keyword:if mask_task == '仅执行查找':raise gr.Error('仅执行查找模式不支持输入标注关键词')# bug修改:必须保证[元素匹配关键词]中有值else:try:assert len(keyword_list)except AssertionError:raise gr.Error('填充状态下,匹配关键词文本框不能为空')else:if mask_task == '填充':raise gr.Error('填充模式,请输入标注关键词')output = generate_file(input_file,task,invalid_task,mask_task,keyword_list,invalid_keyword_list,mask_keyword)return outputdescription = """
1. 单元素匹配:筛选出包含输入元素的样本;
2. 多元素匹配:筛选出按输入元素顺序,包含输入元素的样本;2024/4/10
3. 无效元素匹配:元素匹配过程中,一旦出现无效元素,则不包含该样本;
一次性可以输入多个元素,使用逗号(英文)分隔;
例: 上班途中,下班途中,...4. [无效元素匹配]与[单/多元素匹配]操作之间可单独使用,也可混用;2024/4/11
5. 仅执行查找:仅找出与1,2,3,4步骤的筛选结果;最终返回[仅包含筛选结果]的数据文件;
6. 填充:将待填充关键词写入文本框中,最终返回[填充筛选结果]对应标注信息的[完整数据文件];
"""demo = gr.Interface(fn=submit,inputs = [gr.File(file_count="single",label="上传文件",file_types=CONST.file_type_list),# 无效元素匹配单选框gr.Radio(choices=['启用','禁用'],label='无效元素匹配',value='禁用',),gr.Textbox(label='无效关键词',placeholder='可以一次输入多个数据,使用逗号(英文)间隔;若选择禁用,文本框为空',),# 匹配单元素,多元素单选框gr.Radio(choices=['单元素匹配','多元素匹配'],label='选择元素匹配模式',),gr.Textbox(label='匹配关键词',placeholder='请输入匹配关键词'),# 仅执行查找,填充单选框gr.Radio(choices=['仅执行查找','填充'],label='选择填充模式',value='填充'),gr.Textbox(label='输入标准标注',placeholder='若选择填充,请输入对应标准标注(唯一);若选择仅执行查找,文本框为空',),gr.Text(description,label='使用说明')],outputs=gr.File(label='输出文件'),title='单元素/多元素匹配筛选数据',examples=[['测试文件.xlsx','启用','上班途中','单元素匹配','焊接过程中','填充','焊接工']]
)demo.launch(share=False, server_name='192.168.11.115',server_port=8706)

数据处理与生成过程

update方法更新df

import pandas as pd
import time
import osdef sorted_keywords_update(df, task, invalid_task, mask_task, keyword_list, invalid_keyword_list, mask_keyword):def sorted_keywords(str_input,sorted_word_list):"""查找列表中的关键词,如果关键词有序地匹配成功返回True,否则返回False"""count = 0while 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 += 1else:breakif count == len(sorted_word_list):return Trueelse:return Falsedef eliminate_invalid(df_input,invalid_keyword_list):"""无效元素匹配[启用]状态下,筛除包含invalid_keyword_list内词对应的行"""for invalid_word in invalid_keyword_list:df_input = df_input[~df_input['文本信息'].str.contains(invalid_word)]return df_inputdef mode_2_rules(row):"""多元素匹配模式规则"""return sorted_keywords(row['文本信息'],keyword_list) == Truedef mode_1_rules(df_input, keyword_list):"""单元素匹配模式规则"""assert len(keyword_list) == 1contain_df = df_input[df_input['文本信息'].str.contains(keyword_list[0])]return contain_df# 去除已标注过的数据sub_df = df[df['标注信息'].isna()]# 去除数据中的nan值sub_df = sub_df[~sub_df['文本信息'].isna()]# 筛选无效元素过程if invalid_task == '启用':invalid_sub_df = eliminate_invalid(sub_df,invalid_keyword_list)else:invalid_sub_df = sub_df# 元素匹配过程if task == '单元素匹配':contain_df = mode_1_rules(invalid_sub_df,keyword_list)elif task == '多元素匹配':contain_df = invalid_sub_df[invalid_sub_df.apply(mode_2_rules,axis=1)]else:contain_df = invalid_sub_df# 创建输出文件夹output_dir = f'./output/match_keyword/{task}'output_path = f'{output_dir}/{task}_res.xlsx'os.makedirs(output_dir, exist_ok=True)# 标准标注填充与写入过程并输出完整数据if mask_task == '填充':start = time.time()contain_copy = contain_df.copy()contain_copy['标注信息'] = mask_keyworddf.update(contain_copy) # 注意,在选择扩充时,返回完整数据;end = time.time()print(f'spend time:{round(end - start,4)}')df.to_excel(output_path, index=False)# 查找状态下,仅输出查找相关的数据else:contain_df.to_excel(output_path, index=False)return output_pathdef generate_file(file_path, task, invalid_task, mask_task, keyword_input, invalid_keyword_input, mask_keyword):"""file_path: 待优化数据文件路径task: 匹配模式:[单模式匹配,多模式匹配]invalid_task: 无效匹配模式:[启用,禁用]mask_task:标准标注填充模式:[仅执行查找,填充]keyword_input: 匹配关键词invalid_keyword_input: 无效匹配关键词mask_keyword: 标准标注关键词"""df = pd.read_excel(file_path)# 数据生成平台output_file_path = sorted_keywords_update(df, task, invalid_task, mask_task, keyword_input, invalid_keyword_input, mask_keyword)return output_file_path

交互界面展示

交互界面展示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/808391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2012年认证杯SPSSPRO杯数学建模A题(第二阶段)蜘蛛网全过程文档及程序

2012年认证杯SPSSPRO杯数学建模 A题 蜘蛛网 原题再现&#xff1a; 第二阶段问题   现在我们假设一个具体的环境。假设有一个凸多边形的区域&#xff0c;蜘蛛准备在这个区域&#xff08;或其一部分&#xff09;上结一张网。   问题一&#xff1a; 在区域的边界上安置有若干…

HarmonyOS开发实例:【手势截屏】

介绍 本篇Codelab基于手势处理和截屏能力&#xff0c;介绍了手势截屏的实现过程。样例主要包括以下功能&#xff1a; 根据下滑手势调用全屏截图功能。全屏截图&#xff0c;同时右下角有弹窗提示截图成功。根据双击手势调用区域截图功能。区域截图&#xff0c;通过调整选择框大…

GeoServer:忘记密码重置

操作步骤 1. 找到data_dir/security/usergroup/default目录下的users.xml文件&#xff0c; 2.修改password为plain:geoserver&#xff0c; 这里无论原来的密码是什么&#xff0c;改为plain:geoserver之后&#xff0c;就可以通过admin&#xff1a;geoserver默认账户密码登录了。…

室内定位中文综述阅读

1 室内高精度定位技术总结与展望 [4]柳景斌,赵智博,胡宁松等.室内高精度定位技术总结与展望[J].武汉大学学报(信息科学 版),2022,47(07):997-1008.DOI:10.13203/j.whugis20220029. 1.1.1 WiFi‐RTT定位 2016 年 12 月&#xff0c;随着新版 IEEE802.11 标准的公布&#xff0c…

开一家抖音小店都需要准备什么?今天一篇文章带你成功开店!

大家好&#xff0c;我是电商小布。 想要来玩抖店&#xff0c;第一件事情当然就是来开一家属于自己的抖店。 那么大家开抖店需要准备什么内容呢&#xff1f;这个是很多新手小伙伴不了解的东西。 所以呢今天&#xff0c;小布就从所需的材料和资金方面&#xff0c;来带大家详细的…

直播带货行业将迎来大地震

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 为什么这么多人喊着关闭直播带货?实体经济是到底因为什么萧条的?为什么大街上冷冷清清的?是房租、虚高的价格、还是直播带货引起的? 在4月9日的国务院政策吹风会上&#xff0c;市场监管明确指出&#xff1a; …

选择程序员是为什么?

本章节是关于为什么会选择一名程序员的经验分享 首先&#xff0c;我为什么会选择这个方向&#xff0c;可能是因为钱多&#xff0c;学东西不就是为了赚钱嘛&#xff1f;这是一点&#xff0c;不过最让我接收这个行业的是好奇世界的新大陆&#xff0c;可以简单的说就是&#xff0c…

ubuntu系统安装python虚拟环境

一、安装python&#xff1a; 步骤1&#xff1a;在Ubuntu系统中打开终端&#xff0c;你可以使用快捷键CtrlAltT来打开终端&#xff0c;或者在应用程序菜单中找到终端。 步骤2&#xff1a;更新软件包列表&#xff0c;在终端中输入以下命令&#xff0c;更新软件包列表&#xff1…

MobX原理剖析:基于可观察状态和自动依赖追踪的响应式状态管理

我们用代码示例来说明 MobX 的核心原理。 首先,我们定义一个简单的 Store 类,其中包含一个可观察的计数器状态: import { observable, action } from mobx;class CounterStore {observable count 0;actionincrement () > {this.count;};actiondecrement () > {this.…

Linux Shell:`alias`命令

Linux Shell&#xff1a;alias命令 alias命令是Linux和Unix系统中Shell的内置命令&#xff0c;用于创建命令的简短名称&#xff0c;即别名。这些别名通常用来缩短长命令或为常用命令序列创建便捷的缩写&#xff0c;从而提高工作效率。别名在当前Shell会话中有效&#xff0c;除…

Leetcode算法训练日记 | day20

一、合并二叉树 1.题目 Leetcode&#xff1a;第 617 题 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要将这两棵树合并成一棵新…

基于SSM的电影网站(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的电影网站&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringMv…

196算法之谜在 JSP 中使用内置对象 request 获取 form 表单的文本框 text 提交的数据。

(1&#xff09;编写 inputNumber . jsp &#xff0c;该页面提供一个 form 表单&#xff0c;该 form 表单提供一个文本框 text &#xff0c;用于用户输入一个正整数&#xff0c;用户在 form 表单中输入的数字&#xff0c;单击 submit 提交键将正整数提交给 huiwenNumber . jsp 页…

开源项目ChatGPT-Next-Web的容器化部署(四)-- k8s容器部署使用configmap配置

一、接着上文 本文的内容是在k8s容器中&#xff0c;如何使用configmap对.env文件进行挂载&#xff0c;实现环境的差异化配置。 二、源码结构 项目ChatGPT-Next-Web使用了.env文件来配置不同环境下的值&#xff1a; 所以&#xff0c;我们同理新增两个配置文件&#xff0c;见下…

windows上使用influx2.7学习

参考 官方文档&#xff1a;https://docs.influxdata.com/influxdb/v2/ 下载 需要下载两样东西&#xff1a;influxd.exe和influx.exe influxd:influx数据库的服务端。下载地址&#xff1a;https://dl.influxdata.com/influxdb/releases/influxdb2-2.7.5-windows.zipinflux:连…

Linux 计算机网络

目录 一、网络协议 1、 "协议" 是一种约定 2、协议分层 二、网络模型 1、OSI七层模型 2、TCP/IP五层(或四层)模型 三、网络传输基本流程 四、数据包封装和分用 五、网络中的地址管理 六、网络编程套接字 1、理解源IP地址和目的IP地址 2、端口号 理解 &q…

Prototype 原型

意图 用原型实例指定创建对象的种类&#xff0c;并且通过复制这些原型创建新的对象。 结构 Prototype声明一个复制自身的接口。ConcretePrototype实现一个复制自身的操作。Client让一个原型复制自身从而创建一个新的对象。 适用性 当一个系统应该独立于他的产品创建、构成和…

第四百五十三回

文章目录 1. 问题描述2. 优化方法2.1 缩小范围2.2 替代方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取AppBar的高度"相关的内容&#xff0c;本章回中将介绍关于MediaQuery的优化.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 问题描述 我们在…

微信小程序uniapp+vue电力巡线任务故障报修管理系统2q91t

uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 前端开发:vue 语言&#xff1a;javapythonnodejsphp均支持 运行软件:idea/eclipse/vscode/pycharm/wamp均支持 框架支持:Ssm/django/flask/t…

《看漫画学C++》第12章 可大可小的“容器”——向量

在C编程的世界里&#xff0c;数组是一种基础且广泛使用的数据结构。然而&#xff0c;传统的静态数组在大小固定、管理不便等方面的局限性&#xff0c;常常让开发者感到束手束脚。幸运的是&#xff0c;C标准库中的vector类为我们提供了一种更加灵活、高效的动态数组解决方案。 …