gradio简单搭建——关键词匹配筛选【进一步优化】

news2025/9/21 22:45:45

gradio简单搭建——关键词匹配筛选[进一步优化]

    • 任务回顾
    • 新的想法:无效元素筛选
    • 界面搭建
    • 数据处理与生成过程
    • 交互界面展示

任务回顾

apply \text{apply} apply方法的使用一节中,简单提到了任务目标:通过关键词的形式,在文本数据中体现出主体的工作类型

但这个目标执行之前,可以尝试对数据先一步进行清洗:如果文本数据满足一些关键词构成的模板,这种数据更容易地被查找出与工作性质相关的信息,而不需要去观察文本数据的其他位置。例如如下几组关键词组成模板:

mode = {
	1:['进行','作业'],
    2:['进行','工作'],
    3:['操作','时'],
    4:['操作','过程中']
}

在一些示例中,可以轻松地通过这些模板推理出主体对应的工作性质。例如:

某人在车间内操作钻床,不小心被铁屑蹭伤。

结合上述模板,可以直接观察出:主体的工作性质和钻床相关。从而引出上一节使用展示工具gradio实现一个通过单元素/多元素顺序匹配筛选表格数据的简单交互平台,本节将对其进行进一步优化
初始版本展示

新的想法:无效元素筛选

单元素/多元素思路的启发后,想起了《三体3:死神永生》中的低光速黑域

若星球被低光速黑域笼罩,外星文明远远地看上一眼,就知道是绝对安全的——光都无法逃离出来,黑域内的生物自然无法逃离,这就是宇宙安全声明。

言归正传,在文本数据中是否也可能存在这种情况——“远远”地看上一眼,就可以知道:文本内信息对于主体工作性质的描述几乎无关联。例如:

某人在上班途中,与电动车相撞受伤。

分析:首先文本中并没有直接描述主体的工作性质信息(岗位、职位),其次可以通过推理:上班途中,意味着其没有到达预定岗位开始工作,可以归纳出:上班途中发生的事情,大概率与主体的工作性质无关。
也存在极个别情况~但减轻工作量的目的确实达到了。

想法有了,继续使用展示工具gradio对交互平台进行优化,包含两个方面:

  • 加入无效元素筛选功能:只要数据中出现关键词,将该数据在本次匹配筛选过程中去除
  • 关键词模板功能不冲突:各自可以单独执行,也可以混用。

界面搭建

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,
           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 '\\' 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 invalid_task and not task:
        raise gr.Error('[无效元素匹配]与[单/多元素匹配]至少选择一个')
    else:
        # [无效元素匹配]逻辑描述
        if invalid_task:
            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()
        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() # 未选择使用[单/多元素匹配]

    output = generate_file(input_file,task,invalid_task,keyword_list,invalid_keyword_list)
    return output

description = """
1. 单元素匹配:筛选出包含输入元素的样本;
2. 多元素匹配:筛选出按输入元素顺序,包含输入元素的样本;

3. 无效元素匹配:元素匹配过程中,一旦出现无效元素,则不包含该样本;
一次性可以输入多个元素,使用逗号(英文)分隔;
例: 上班途中,下班途中,...

4. [无效元素匹配]与[单/多元素匹配]操作之间可单独使用,也可混用;
"""

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.Radio(
        choices=['单元素匹配','多元素匹配'],
        label='选择元素匹配模式'
    ),
    gr.Textbox(
        label='匹配关键词',
        placeholder='请输入匹配关键词'
    ),
    gr.Text(
        description,
        label='使用说明'
    )],
    outputs=gr.File(label='输出文件'),
    title='单元素/多元素匹配筛选数据',
    examples=[['测试文件.xlsx','启用','上班途中,下班途中','',''],
              ['测试文件.xlsx','禁用','','',''],
              ['测试文件.xlsx','','','单元素匹配','作业时'],
              ['测试文件.xlsx','','','多元素匹配','操作,过程中'],
              ['测试文件.xlsx','启用','上班途中,下班途中','多元素匹配','操作,时']]
)

demo.launch(share=True, server_name='0.0.0.0',server_port=8706)

数据处理与生成过程

import pandas as pd
import os

def sorted_keywords_update(df,task,invalid_task,keyword_list,invalid_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 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()]

    # 筛选无效元素过程
    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)

    contain_df.to_excel(output_path,index=False)
    return output_path


def generate_file(file_path,
                  task,
                  invalid_task,
                  keyword_input,
                  invalid_keyword_input):
    """
    file_path: 待优化数据文件路径
    task: 匹配模式:[单模式匹配,多模式匹配]
    invalid_task: 无效匹配模式:[启用,禁用]
    keyword_input: 匹配关键词
    invalid_keyword_input: 无效匹配关键词
    """
    df = pd.read_excel(file_path)
    # 数据生成平台
    output_file_path = sorted_keywords_update(df,task,invalid_task,keyword_input,invalid_keyword_input)
    return output_file_path

交互界面展示

初始状态下,交互界面的展示效果如下:
试了几个例子~
初始状态界面
执行结束后,交互界面的展示效果如下:
执行结束界面

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

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

相关文章

DNS 各记录类型说明及规则

各记录类型使用目的 记录类型使用目的A 记录将域名指向一个 IP 地址。CNAME 记录将域名指向另一个域名&#xff0c;再由另一个域名提供 IP 地址。MX 记录设置邮箱&#xff0c;让邮箱能收到邮件。NS 记录将子域名交给其他 DNS 服务商解析。AAAA 记录将域名指向一个 IPv6 地址。…

VMware vSphere虚拟化基础管理平台

VMware简介 VMware介绍 官网&#xff1a;https://www.vmware.com/cn.html VMware公司成立于1998年&#xff0c;2003年存储厂商EMC以6.35亿美元收购了VMware&#xff1b;2015年10月&#xff0c;戴尔宣布以670亿美元收购EMC。VMware公司在2018年全年收入79.2亿美元。 VMware主…

20240326-1-KNN面试题

KNN面试题 1.简述一下KNN算法的原理 KNN算法利用训练数据集对特征向量空间进行划分。KNN算法的核心思想是在一个含未知样本的空间&#xff0c;可以根据样本最近的k个样本的数据类型来确定未知样本的数据类型。 该算法涉及的3个主要因素是&#xff1a;k值选择&#xff0c;距离度…

AOF文件重写

1.2.3.AOF文件重写 因为是记录命令&#xff0c;AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作&#xff0c;但只有最后一次写操作才有意义。通过执行bgrewriteaof命令&#xff0c;可以让AOF文件执行重写功能&#xff0c;用最少的命令达到相同效果。 如图&am…

SolidWorks上手直接开整

本科学3D建模的时候&#xff0c;学习过犀牛Rhine&#xff0c;当时就惊叹于入籍紧密集成的可视化编程环境&#xff0c;后来又简单学习过了3DMax、Maya&#xff0c;平时使用的频率不多&#xff0c;所以还是初学者水平&#xff0c;现在课题组需要自研一个原型机&#xff0c;需要工…

图片管理系统:原理、设计与实践

title: 图片管理系统&#xff1a;原理、设计与实践 date: 2024/4/9 20:04:25 updated: 2024/4/9 20:04:25 tags: 图片管理存储组织上传采集处理编辑搜索检索展示分享AI应用 第一章&#xff1a;图片管理系统概述 1.1 图片管理系统简介 图片管理系统是一种用于存储、组织、处理…

Redux和Redux Toolkit

Redux 概念&#xff1a;redux是react最常用的集中状态管理工具&#xff0c;类似于Vue中的Pinia(vuex)&#xff0c;可以独立于框架运行作用&#xff1a;通过集中管理的方式管理应用的状态 Redux快速体验 不和任何框架绑定&#xff0c;不使用任何构建工具&#xff0c;使用纯Re…

kali linux 安装 VirtualBox for Linux Hosts

sudo vim /etc/apt/sources.list deb [archamd64] https://download.virtualbox.org/virtualbox/debian buster contrib添加源文件 sudo apt update sudo apt install linux-headers-$(uname -r) dkms sudo apt install virtualbox virtualbox-ext-pack 扩展包 echo "d…

干货分享|JumpServer三种常见的文件传输方式效果对比

JumpServer开源堡垒机支持对文件的上传和下载&#xff0c;并对传输记录进⾏审计。JumpServer的文件传输功能是用户使用频率较高的功能&#xff0c;常见的文件传输方式包括&#xff1a;rz和sz命令方式、文件管理方式和客户端工具方式。 在使用JumpServer进行文件传输的时候&…

【SpringBoot3】Bean管理

1.Bean扫描 1.1传统Spring 标签&#xff1a;<context:component-scan base-package"com. example "/>注解&#xff1a;ComponentScan(basePackages "com.example") 1.2SpringBoot SpringBoot默认扫描启动类所在的包及其子包 2.Bean注册 如果要注…

Qt 多窗体

前言 在 Qt编程中经常会遇到要在多个界面之间切换的情况&#xff0c;如从登录界面跳转到主界面&#xff0c;从主界面跳转到设置界面&#xff0c;再返回到主界面。我们将会用一个简单的示例来实现多窗体功能。 登录窗口 创建基类为QMainWindow&#xff0c;类名为LoginWin。再使用…

手机放枕边真的很危险吗

从小我的妈妈就告诉我&#xff1a;睡觉的时候手机放枕头边上&#xff0c;辐射会对身体有害&#xff0c;但事实真是这样吗&#xff1f; 首先只要是会发热的物体就都有辐射&#xff0c;但是手机的辐射是电磁辐射&#xff0c;对人无害&#xff0c;它造成的电磁辐射甚至没有太阳造…

【Figma】安装指南及基础操作

先前做UI设计一直都是用PS等绘图软件设计&#xff0c;但发现在纠结像素和排版问题上会花很多时间&#xff0c;再加上AI没来得及上手&#xff0c;就需要迅速出成图&#xff0c;此时通过论坛发现了figma&#xff0c;基本上可以满足足够的需求&#xff0c;并且可以在windows系统上…

编译器如何理解C++的指针和引用?

初学引用时&#xff0c;往往很难真正理解引用&#xff0c;它与指针究竟有什么区别和联系。下面我们不妨看看编译器如何理解引用和指针的。 一.函数通过指针传参 1.1 示例代码 #include <iostream>using namespace std;void swap(int *x,int *y)//指针传参 {int tmp;t…

静态页面上传服务器无法显示css效果

今天做比赛的项目&#xff0c;把静态页面上传到服务器&#xff0c;发现外联的css文件的效果无法显示&#xff0c;一开始以为是路径问题&#xff0c;后面改了发现没有改变。 然后发现在浏览器上css文件中content-type: text/plain的问题 这才是正确的&#xff1a; 修改办法&…

水牛社:互联网赚钱秘籍,免费项目,你真敢要吗?

免费是最贵的。真正理解并使用这句话的只有少数人&#xff0c;今天在网上分享一下免费项目背后的逻辑&#xff0c;抛开现象&#xff0c; 本质是最重要的。 我从事互联网工作15年。不管是过去还是现在&#xff0c;总有人喜欢问有没有免费项目&#xff1f; 其实我平时懒得回答…

【智能算法】省时方便,智能算法统计指标——一键运行~

目录 1.常用统计指标2.参数统计检验3.结果展示4.自定义修改测试框架 1.常用统计指标 测试智能算法性能时&#xff0c;常常会用到以下5种常用指标&#xff0c;简单不赘述&#xff1a; 最优值、最差值、均值、中位数、标准差 2.参数统计检验 单纯依靠常用统计指标说服力不足&…

每天五分钟深度学习PyTorch:面对Tensorflow,为何我选择PyTorch

这篇专栏文章不是为了挑起tenserflow和pytorch中哪个更好&#xff0c;众所周知tensorflow诞生以来&#xff0c;已经成为最流行的深度学习框架&#xff0c;可以说github中大多数的深度学习代码实现是以tensorflow实现的&#xff0c;也就是说资源众多&#xff0c;社区强大&#x…

Platforms Jumping(贪心,处理策略)

文章目录 题目描述输入格式输出格式样例输入1样例输出1样例输入2样例输出2样例输入3样例输出3提交链接提示 解析参考代码 题目描述 有一条宽度为 n n n 的河流。河的左岸是 0 0 0 单元格&#xff0c;右岸是 n 1 n1 n1 单元格(更正式地说&#xff0c;这条河可以表示为一串从…

APP被DDoS攻击时,企业应该如何防护?

某平台遭到分布式拒绝服务攻击&#xff0c;大规模、持续性的攻击&#xff0c;导致平台的APP、网站的部分用户出现间歇性无法登录、加载失败或缓慢等情况。据了解&#xff0c;平台在一个月的时间内陆续遭受到近30次的网络攻击。在这段时间内&#xff0c;平台不断地接收到短时间、…