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
交互界面展示
相关文章:

gradio简单搭建——关键词简单筛选【2024-4-11优化】
gradio简单搭建——关键词简单筛选[2024-4-11 优化] 新的思路:标签自动标注界面搭建优化数据处理与生成过程交互界面展示 新的思路:标签自动标注 针对通过关键词,在文本数据中体现出主体的工作类型这一任务,这里使用展示工具grad…...

docker完美安装分布式任务调度平台XXL-JOB
分布式任务调度平台XXL-JOB 1、官方文档 自己看 https://www.xuxueli.com/xxl-job/#1.1%20%E6%A6%82%E8%BF%B0 2、使用docker部署 本人使用的腾讯云,安装docker暴露一下端口,就很舒服的安装这个服务了。 docker pull xuxueli/xxl-job-admin:2.4.03…...
java使用while循环输出2-100的所有素数
使用while循环输出2-100的所有素数,每行输出5个 分析:素数:只能被1和自己整除的自然数 public static void main(String[] args) {int num 2;int count 0;int count1 0;while (num < 100) {for (int i 1; i < num; i) {if (num % i 0) {count;}}if (count 2) {Sys…...

VSCode中调试C++程序
目录 一、准备工作:安装插件 1、C/C插件 编辑 2、CMake插件 3、CMake tool插件 二、调试过程 1、debug 2、打断点 3、调C/C文件 每次重新调试的时候都忘了具体步骤,直接给自己写个备忘录好了。 一、准备工作:安装插件 1、C/C插件…...

Can Transformer and GNN Help Each Other?
ABSTRACT 尽管 Transformer 在自然语言处理和计算机视觉方面取得了巨大成功,但由于两个重要原因,它很难推广到中大规模图数据:(i) 复杂性高。 (ii) 未能捕获复杂且纠缠的结构信息。在图表示学习中,图神经网络(GNN&…...

在隐私计算应用中和数链具备哪些技术特点?
在加速“可信数字化”进程的背景下,我国区块链产业将在打造新型平台经济,开启共享经济新时代的同时,带动数字经济“脱虚向实”服务实体经济。 和数软件在加速数字化进程的同时,进一步服务实体经济,提高实体经济的活力…...

【智能家居入门4】(FreeRTOS、MQTT服务器、MQTT协议、微信小程序)
前面已经发了智能家居入门的1、2、3了,在实际开发中一般都会使用到实时操作系统,这里就以FreeRTOS为例子,使用标准库。记录由裸机转到实时操作系统所遇到的问题以及总体流程。相较于裸机,系统实时性强了很多,小程序下发…...

爬取豆瓣(线程、Session)优化版本
爬取豆瓣(线程、Session)优化版本 该文章只是为了精进基础,对Session、threading、网站请求解析的理解。 此版本没有爬取详情页。还在学习阶段的读者可以尝试一下。 适用于基础刚开始学习爬虫的! 1.改进点: 将普通的r…...
拷贝控制总结
1.拷贝、值与销毁: 拷贝构造函数:如果一个构造函数的第一个参数是自身类类型的引用,且其他(如果有的话)参数都有默认实参,则此构造函数叫做拷贝构造函数;如果我们没有为类定义一个拷贝构造函数…...

无重复字符串的最长子串
题目描述:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。 第一次提交记录 class Solution:def lengthOfLongestSubstring(self, s: str) -> int:if not s:return 0lookup set()left res 0for right in range(len(s)):while s…...
javaScript Object.hasOwn()的用法
Object.hasOwn() 如果指定的对象自身有指定的属性,则静态方法 Object.hasOwn() 返回 true。如果属性是继承的或者不存在,该方法返回 false。 备注: Object.hasOwn() 旨在取代 Object.prototype.hasOwnProperty()。 **语法:**Objec…...

MINI2440 开发板 给他干出来了
环境是ubuntu14.04。不要问我为什么是这个版本,因为之前的ubuntu12.04 环境干不出来,你去试试就知道了!各种资源包下载不下来。 输入启动参数: 进入MINI2440:别说心里一万个开心,启动完成,输入p…...

上海人工智能实验室的书生·浦语大模型学习笔记(第二期第三课——上篇)
书生浦语是上海人工智能实验室和商汤科技联合研发的一款大模型,这次有机会参与试用,特记录每次学习情况。 一、课程笔记 本次学习的是RAG(Retrieval Augmented Generation)技术,它是通过检索与用户输入相关的信息片段…...
前端小白的学习之路(Vue2 三)
提示:学习vue2的第三天,笔记记录:生命周期,组件(注册,传值) 目录 一、生命周期 二、组件 1.注册组件 1)全局注册 2)局部注册 2.组件传值 1)父传子 2)子传父 3)兄弟传值 一…...
ChatGPT 之优势与缺陷
原文: 译者:飞龙 协议:CC BY-NC-SA 4.0 介绍 欢迎来到《ChatGPT:好的、坏的和丑陋的》。在本书中,我们踏上了探索 ChatGPT 多面世界的旅程,这是由 OpenAI 开发的先进自然语言处理模型。随着 ChatGPT 和类似…...

python爬虫———post请求方式(第十四天)
🎈🎈作者主页: 喔的嘛呀🎈🎈 🎈🎈所属专栏:python爬虫学习🎈🎈 ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天…...

51蓝桥杯之DS18B20
DS18B20 基础知识 代码流程实现 将官方提供例程文件添加到工程中 添加onewire.c文件到keil4里面 一些代码补充知识 代码 #include "reg52.h" #include "onewire.h" #include "absacc.h" unsigned char num[10]{0xc0,0xf9,0xa4,0xb0,0x99,…...

TiDB 组件 GC 原理及常见问题
本文详细介绍了 TiDB 的 Garbage Collection(GC)机制及其在 TiDB 组件中的实现原理和常见问题排查方法。 TiDB 底层使用单机存储引擎 RocksDB,并通过 MVCC 机制,基于 RocksDB 实现了分布式存储引擎 TiKV,以支持高可用分…...

【c++】STl-list使用list模拟实现
主页:醋溜马桶圈-CSDN博客 专栏:c_醋溜马桶圈的博客-CSDN博客 gitee:mnxcc (mnxcc) - Gitee.com 目录 1. list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 …...

号卡极团分销管理系统 index.php SQL注入漏洞复现
0x01 产品简介 号卡极团分销管理系统,同步对接多平台,同步订单信息,支持敢探号一键上架,首页多套UI+商品下单页多套模板,订单查询支持实时物流信息、支持代理商自定义域名、泛域名绑定,内置敢探号、172平台、号氪云平台第三方接口以及号卡网同系统对接! 0x02 漏洞概述…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...

Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...