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

news2024/11/29 3:49:00

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

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

新的思路:标签自动标注

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

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

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

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

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

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

界面搭建优化

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

import gradio as gr
from file_generator import generate_file

class 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 output

description = """
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 os

def 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 = 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 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_input
    
    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
    
    # 去除已标注过的数据
    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_keyword
        df.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_path

def 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.coloradmin.cn/o/1586746.html

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

相关文章

Claude使用教程

claude 3 opus面世后&#xff0c;网上盛传吊打了GPT-4。网上这几天也已经有了许多应用&#xff0c;但竟然还有很多小伙伴不知道国内怎么用gpt&#xff0c;也不知道怎么去用这个据说已经吊打了gpt-4的claude3。 今天我们想要进行的一项尝试就是—— 用claude3和gpt4&#xff0c…

猝不及防 CCF-B ICPP 2024投稿延期至4月22日提交摘要 机会来了别错过

会议之眼 快讯 第53届ICPP&#xff08;International Conference on Parallel Processing&#xff09;即国际并行处理会议将于 2024年 8月12日-15日在瑞典哥特兰岛举行&#xff01;ICPP是世界上最古老的连续举办的并行计算计算机科学会议之一。它是学术界、工业界和政府的研究…

Vue项目页面中快速使用JSON数据格式化模块插件

页面中快速使用JSON数据格式化模块插件 JSON数据格式化模块插件&#xff0c;可以用来展示JSON数据&#xff0c;也可以验证某数据是否为JSON格式 1、可以使用 b-code-editor插件 来实现效果&#xff0c;方便快捷&#xff0c; 安装命令&#xff1a;npm install bin-code-editor…

suno有了新对手udio炸裂音乐圈;又一个开源AI Devin 程序员;完全开源轻量级的文本到语音可生成特定说话者的风格

✨ 1: udio 由音乐和科技界重量级人物支持的强大 AI 音乐生成器&#xff0c;被称为音乐界的另一个 ChatGPT。 Udio 由前 Google DeepMind的研究院和工程师创立&#xff0c;得到了a16z的支持&#xff0c;总部在伦敦和纽约。 目前是一个免费的V1测试版产品&#xff0c;每个人每…

docker完美安装分布式任务调度平台XXL-JOB

分布式任务调度平台XXL-JOB 1、官方文档 自己看 https://www.xuxueli.com/xxl-job/#1.1%20%E6%A6%82%E8%BF%B0 2、使用docker部署 本人使用的腾讯云&#xff0c;安装docker暴露一下端口&#xff0c;就很舒服的安装这个服务了。 docker pull xuxueli/xxl-job-admin:2.4.03…

飞书api增加权限

1&#xff0c;进入飞书开发者后台&#xff1a;飞书开放平台 给应用增加权限 2&#xff0c;进入飞书管理后台 https://fw5slkpbyb3.feishu.cn/admin/appCenter/audit 审核最新发布的版本 如果还是不行&#xff0c;则需要修改数据权限&#xff0c;修改为全部成员可修改。 改完…

KVM+GFS分布式存储

本章内容&#xff1a; 学会KVMGFS分布式存储高可用 1.0 案例环境 1.案例环境 大规模使用 KVM 虚拟机来运行业务&#xff0c;为了保证公司虚拟机能够安全稳定运行&#xff0c; 决定采用 KVMGlusterFS 模式&#xff0c;来保证虚拟机存储的分布部署&#xff0c;以及分布冗余。避…

2024.4.11

1.思维导图 2.指针形式验证大小端存储 #include<myhead.h>int main(int argc, const char *argv[]) {int num 0x12345678;char* ptr (char *)&num;if(*ptr 0x12){printf("big endian\n");}else if(*ptr 0x78){printf("little endian\n");}r…

正则表达式与JSON序列化:去除JavaScript对象中的下划线键名

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

vue源码解析——v-if和v-for哪个优先级高,如何避免两者同时使用

首先&#xff0c;官方不推荐v-if和v-for在同一个元素上使用。其次&#xff0c;如果两者同时使用&#xff0c;v-if和v-for的优先级怎么确定&#xff1f;在vue2和vue3中这两者的优先级顺序不一样。vue2是v-for优先&#xff0c;条件不存在时也会渲染多个注释节点。在vue3中进行了改…

关于01背包和完全背包问题的细节思考

01背包问题 #include<iostream> #include<stdlib.h> #include<vector> #include<cmath> int main() {int M0; //材料数int N0; //背包容量std::cin>>M>>N;std::vector<int>space(M,0);for(int i0;i<M;i) std::cin>>…

Nodejs 第六十二章(短链接)

短链接介绍 短链接是一种缩短长网址的方法&#xff0c;将原始的长网址转换为更短的形式。它通常由一系列的字母、数字和特殊字符组成&#xff0c;比起原始的长网址&#xff0c;短链接更加简洁、易于记忆和分享。 短链接的主要用途之一是在社交媒体平台进行链接分享。由于这些…

Offline RL : Efficient Planning in a Compact Latent Action Space

ICLR 2023 paper Intro 采用Transformer架构的Planning方法对马尔可夫序列重构,(et. TT)在面对高维状态动作空间&#xff0c;容易面对计算复杂度高的问题。本文提出TAP算法&#xff0c;基于Transformer的VQ-VAE&#xff0c;利用提取的状态动作在隐空间的低微特征进行Planning…

表单,表格小练习

表格练习&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document&…

创新指南|战略衡量的增长组织:用人工智能增强关键绩效指标(KPI)

传统的关键绩效指标 (KPI)越来越无法提供领导者取得成功所需的信息和见解。他们在跟踪进展、协调人员和流程、确定资源优先级以及推进问责制方面存在不足。本文是 2024 年第一份麻省理工学院 SMR - BCG 人工智能和商业战略全球高管学习和研究项目的调查结果——人工智能和业务战…

成为 Jira 大师:效率达人的必备秘诀

&#x1f525; 效率达人喜欢使用 Jira 的快捷键和命令面板&#xff0c;因为他们能够在不移动鼠标的情况下&#xff0c;快速执行各种命令和导航操作&#xff0c;从而更有效地完成 Jira 中的常见任务。 &#x1f3d6;️ 通过熟练掌握这些快捷键和命令&#xff0c;效率达人能够更…

Python+Selenium+Unittest 之Unittest5(常用装饰器-跳过用例执行)

目录 1、unittest.skip()&#xff08;跳过该装饰器下的用例&#xff09; 2、unittest.skipIf()&#xff08;跳过该装饰器下判断条件为True的用例&#xff09; 3、unittest.skipUnless()&#xff08;跳过该装饰器下判断条件为False的用例&#xff09; 4、unittest.expectedF…

qt进阶2:windows下可执行程序崩溃生成dmp,定位崩溃问题。

系列文章目录 文章目录 系列文章目录前言一、dmp文件生成二、使用步骤1.代码案例2.运行截图 前言 qt编译的可执行程序在windows下崩溃可生成dmp文件&#xff0c;用于调试定位崩溃原因。 一、dmp文件生成 略 二、使用步骤 1.代码案例 代码如下&#xff08;示例&#xff09;&…

PCB封装库的创建及引入

法1 1.创建lib 2.放置 找到你想要画的封装的器件的数据手册了解相关信息。 直插式选Multi-layer 贴片选Top-layer 焊盘尺寸 焊盘空尺寸 法2 嘉立创eda直接copy 再嘉立创中找到你想要的pcb&#xff0c;导出为ad 然后再ad中找到我们导出的文件 复制他 然后再库中粘贴 pcb库…

十进制,二进制,八进制,十六进制之间转换

一. 十进制转二进制 二. 二进制转十进制 三. 十进制转八进制 四. 八进制转十进制 五. 十进制转十六进制