Gradio聚类

news/2024/9/13 23:49:08/ 标签: 机器学习, 深度学习, 人工智能

为了增加页面输出聚类后的结果并方便可视化分析聚类效果,下面是更新后的代码。将Gradio界面中的输出类型改为`gr.outputs.HTML`,并在返回结果时生成HTML格式的聚类结果。```python

import gradio as gr
from transformers import AutoTokenizer, AutoModel
import torch
import torch.nn.functional as F
from sklearn.cluster import KMeans, DBSCAN, AgglomerativeClusteringdef embedding(sentences):device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')tokenizer = AutoTokenizer.from_pretrained('BAAI/bge-large-zh')model = AutoModel.from_pretrained('BAAI/bge-large-zh').to(device)encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt').to(device)with torch.no_grad():model_output = model(**encoded_input)sentence_embeddings = model_output.last_hidden_state[:, 0]sentence_embeddings = F.normalize(sentence_embeddings, p=2, dim=1).to(device)return sentence_embeddingsdef cluster_sentences(sentences, cluster_num, eps, min_samples, method, distance_threshold):X = embedding(sentences)if method == 'KMeans':kmeans = KMeans(n_clusters=cluster_num)kmeans.fit(X.cpu())labels = kmeans.labels_elif method == 'DBSCAN':dbscan = DBSCAN(eps=eps, min_samples=min_samples, metric='cosine')dbscan.fit(X.cpu())labels = dbscan.labels_elif method == 'Agglomerative':clustering_model = AgglomerativeClustering(n_clusters=None, distance_threshold=distance_threshold)clustering_model.fit(X.cpu())labels = clustering_model.labels_cluster_result = dict()for i in range(len(sentences)):if labels[i] not in cluster_result:cluster_result[labels[i]] = []cluster_result[labels[i]].append(sentences[i])# 构建HTML输出html = ""for label, clustered_sentences in cluster_result.items():html += f"<h3>Cluster {label}</h3><ul>"for sentence in clustered_sentences:html += f"<li>{sentence}</li>"html += "</ul>"return htmldef main_interface(sentence_input, cluster_num, eps, min_samples, method, distance_threshold):sentences = [sentence.strip() for sentence in sentence_input.split(',')]clustered_sentences = cluster_sentences(sentences, cluster_num, eps, min_samples, method, distance_threshold)return clustered_sentences# 使用 Gradio 构建用户界面
iface = gr.Interface(fn=main_interface,inputs=[gr.inputs.Textbox(lines=5, placeholder="请输入句子列表,每个句子用逗号分隔"),gr.inputs.Slider(minimum=2, maximum=30, step=1, default=15, label="Cluster Number (KMeans)"),gr.inputs.Slider(minimum=0.01, maximum=1.0, step=0.01, default=0.15, label="eps (DBSCAN)"),gr.inputs.Slider(minimum=1, maximum=10, step=1, default=2, label="min_samples (DBSCAN)"),gr.inputs.Slider(minimum=0.01, maximum=1.0, step=0.01, default=0.85, label="distance_threshold (Agglomerative)"),gr.inputs.Radio(choices=["KMeans", "DBSCAN", "Agglomerative"], label="Clustering Method", default="KMeans")],outputs=gr.outputs.HTML(),title="句子嵌入和聚类",description="输入一组用逗号分隔的句子,选择聚类方法和相应参数,进行嵌入和聚类。"
)# 启动 Gradio 应用
iface.launch()


```

### 代码解释

1. **增加HTML格式输出**:
    - 在`cluster_sentences`函数中构建HTML格式的输出,以便在界面上直观显示聚类结果。

2. **更新输出类型**:
    - 将Gradio界面的输出类型改为`gr.outputs.HTML()`,以支持HTML格式的聚类结果展示。

3. **构建HTML输出**:
    - 在`cluster_sentences`函数中,根据聚类结果生成HTML格式的字符串,包含每个类别的标题和句子列表。

这样,用户可以在Gradio界面中查看聚类后的详细结果,并通过调整参数进行可视化分析。

为了增加统计每个聚类下的句子数量以及每个聚类下重复的句子数量,我更新了代码。以下是改进后的版本:```python
import gradio as gr
from transformers import AutoTokenizer, AutoModel
import torch
import torch.nn.functional as F
from sklearn.cluster import KMeans, DBSCAN, AgglomerativeClustering
from collections import Counterdef embedding(sentences):device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')tokenizer = AutoTokenizer.from_pretrained('BAAI/bge-large-zh')model = AutoModel.from_pretrained('BAAI/bge-large-zh').to(device)encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt').to(device)with torch.no_grad():model_output = model(**encoded_input)sentence_embeddings = model_output.last_hidden_state[:, 0]sentence_embeddings = F.normalize(sentence_embeddings, p=2, dim=1).to(device)return sentence_embeddingsdef cluster_sentences(sentences, cluster_num, eps, min_samples, method, distance_threshold):X = embedding(sentences)if method == 'KMeans':kmeans = KMeans(n_clusters=cluster_num)kmeans.fit(X.cpu())labels = kmeans.labels_elif method == 'DBSCAN':dbscan = DBSCAN(eps=eps, min_samples=min_samples, metric='cosine')dbscan.fit(X.cpu())labels = dbscan.labels_elif method == 'Agglomerative':clustering_model = AgglomerativeClustering(n_clusters=None, distance_threshold=distance_threshold)clustering_model.fit(X.cpu())labels = clustering_model.labels_cluster_result = dict()for i in range(len(sentences)):if labels[i] not in cluster_result:cluster_result[labels[i]] = []cluster_result[labels[i]].append(sentences[i])# 构建HTML输出html = ""for label, clustered_sentences in cluster_result.items():sentence_count = len(clustered_sentences)sentence_counter = Counter(clustered_sentences)duplicate_count = sum(count for count in sentence_counter.values() if count > 1)html += f"<h3>Cluster {label} - Total Sentences: {sentence_count}, Duplicates: {duplicate_count}</h3><ul>"for sentence in clustered_sentences:html += f"<li>{sentence}</li>"html += "</ul>"return htmldef main_interface(sentence_input, cluster_num, eps, min_samples, method, distance_threshold):sentences = [sentence.strip() for sentence in sentence_input.split(',')]clustered_sentences = cluster_sentences(sentences, cluster_num, eps, min_samples, method, distance_threshold)return clustered_sentences# 使用 Gradio 构建用户界面
iface = gr.Interface(fn=main_interface,inputs=[gr.inputs.Textbox(lines=5, placeholder="请输入句子列表,每个句子用逗号分隔"),gr.inputs.Slider(minimum=2, maximum=30, step=1, default=15, label="Cluster Number (KMeans)"),gr.inputs.Slider(minimum=0.01, maximum=1.0, step=0.01, default=0.15, label="eps (DBSCAN)"),gr.inputs.Slider(minimum=1, maximum=10, step=1, default=2, label="min_samples (DBSCAN)"),gr.inputs.Slider(minimum=0.01, maximum=1.0, step=0.01, default=0.85, label="distance_threshold (Agglomerative)"),gr.inputs.Radio(choices=["KMeans", "DBSCAN", "Agglomerative"], label="Clustering Method", default="KMeans")],outputs=gr.outputs.HTML(),title="句子嵌入和聚类",description="输入一组用逗号分隔的句子,选择聚类方法和相应参数,进行嵌入和聚类。"
)# 启动 Gradio 应用
iface.launch()
```### 代码解释1. **增加HTML格式输出**:- 在`cluster_sentences`函数中构建HTML格式的输出,以便在界面上直观显示聚类结果。2. **更新输出类型**:- 将Gradio界面的输出类型改为`gr.outputs.HTML()`,以支持HTML格式的聚类结果展示。3. **统计句子数量和重复句子数量**:- 使用`Counter`统计每个聚类中的句子数量和重复句子数量,并在HTML输出中显示这些统计信息。这样,用户可以在Gradio界面中查看详细的聚类结果,包括每个聚类的句子数量和重复句子数量。通过调整参数,用户可以直观地分析和可视化聚类效果。
为了满足输出HTML格式的聚类结果的需求,包括每个聚类下包含的句子的详细信息,以及每个聚类的句子数量和每个聚类里重复句子数量统计,我对代码进行了更新:```python
import gradio as gr
from transformers import AutoTokenizer, AutoModel
import torch
import torch.nn.functional as F
from sklearn.cluster import KMeans, DBSCAN, AgglomerativeClustering
from collections import Counterdef embedding(sentences):device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')tokenizer = AutoTokenizer.from_pretrained('BAAI/bge-large-zh')model = AutoModel.from_pretrained('BAAI/bge-large-zh').to(device)encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt').to(device)with torch.no_grad():model_output = model(**encoded_input)sentence_embeddings = model_output.last_hidden_state[:, 0]sentence_embeddings = F.normalize(sentence_embeddings, p=2, dim=1).to(device)return sentence_embeddingsdef cluster_sentences(sentences, cluster_num, eps, min_samples, method, distance_threshold):X = embedding(sentences)if method == 'KMeans':kmeans = KMeans(n_clusters=cluster_num)kmeans.fit(X.cpu())labels = kmeans.labels_elif method == 'DBSCAN':dbscan = DBSCAN(eps=eps, min_samples=min_samples, metric='cosine')dbscan.fit(X.cpu())labels = dbscan.labels_elif method == 'Agglomerative':clustering_model = AgglomerativeClustering(n_clusters=None, distance_threshold=distance_threshold)clustering_model.fit(X.cpu())labels = clustering_model.labels_cluster_result = dict()for i in range(len(sentences)):if labels[i] not in cluster_result:cluster_result[labels[i]] = []cluster_result[labels[i]].append(sentences[i])# 构建HTML输出html = "<div>"for label, clustered_sentences in cluster_result.items():sentence_count = len(clustered_sentences)sentence_counter = Counter(clustered_sentences)duplicate_count = sum(count for count in sentence_counter.values() if count > 1)html += f"<h3>Cluster {label} - Total Sentences: {sentence_count}, Duplicates: {duplicate_count}</h3><ul>"for sentence in clustered_sentences:count = sentence_counter[sentence]html += f"<li>{sentence} (Count: {count})</li>"html += "</ul>"html += "</div>"return htmldef main_interface(sentence_input, cluster_num, eps, min_samples, method, distance_threshold):sentences = [sentence.strip() for sentence in sentence_input.split(',')]clustered_sentences = cluster_sentences(sentences, cluster_num, eps, min_samples, method, distance_threshold)return clustered_sentences# 使用 Gradio 构建用户界面
iface = gr.Interface(fn=main_interface,inputs=[gr.inputs.Textbox(lines=5, placeholder="请输入句子列表,每个句子用逗号分隔", label="句子输入"),gr.inputs.Slider(minimum=2, maximum=30, step=1, default=15, label="KMeans 聚类数"),gr.inputs.Slider(minimum=0.01, maximum=1.0, step=0.01, default=0.15, label="DBSCAN eps"),gr.inputs.Slider(minimum=1, maximum=10, step=1, default=2, label="DBSCAN min_samples"),gr.inputs.Slider(minimum=0.01, maximum=1.0, step=0.01, default=0.85, label="Agglomerative distance_threshold"),gr.inputs.Radio(choices=["KMeans", "DBSCAN", "Agglomerative"], label="聚类方法", default="KMeans")],outputs=gr.outputs.HTML(label="聚类结果"),title="句子嵌入和聚类",description="输入一组用逗号分隔的句子,选择聚类方法和相应参数,进行嵌入和聚类。",theme="compact"
)# 启动 Gradio 应用
iface.launch()
```### 主要更新内容
1. **嵌入生成**:- 使用 `embedding` 函数生成句子嵌入。
2. **聚类方法**:- 实现了 `KMeans`、`DBSCAN` 和 `Agglomerative` 三种聚类方法,并允许用户调节相应参数。
3. **输出HTML格式聚类结果**:- 生成HTML格式的聚类结果,包括每个聚类的句子数量和重复句子数量统计,并在每个句子旁边显示出现次数。
4. **用户界面**:- 使用Gradio创建用户界面,允许用户输入句子列表并调节聚类参数。- 界面更加紧凑和美观,便于用户操作。### 运行方式
将代码保存为Python文件(例如 `clustering_app.py`),然后在终端运行:```bash
python clustering_app.py
```这将启动Gradio应用,并在浏览器中打开用户界面,用户可以输入句子并进行聚类分析。


http://www.ppmy.cn/news/1475496.html

相关文章

绝区捌--将GPT幻觉的发生率从20%以上降低到2%以下

总结&#xff1a;我们没有使用微调&#xff0c;而是结合使用提示链和预处理/后处理来将幻觉发生率降低一个数量级&#xff0c;但这确实需要对 OpenAI 进行 3-4 倍的调用。还有很大的改进空间&#xff01; 使用 GPT 等大型语言模型面临的最大挑战之一是它们倾向于捏造信息。 这…

关于maven工程编译的一些问题

首先抛问题&#xff0c;在maven clean的时候出现下面的错误&#xff1a; 错误源代码如下&#xff1a; [ERROR] The build could not read 1 project -> [Help 1] [ERROR] [ERROR] The project com.**:**:2.0.0 (D:\JAVA\**-policy\pom.xml) has 1 error [ERROR] N…

音视频开发—FFmpeg处理流数据的基本概念详解

文章目录 多媒体文件的基本概念相关重要的结构体操作数据流的基本步骤1.解复用&#xff08;Demuxing&#xff09;2.获取流&#xff08;Stream&#xff09;3. 读取数据包&#xff08;Packet&#xff09;4. 释放资源&#xff08;Free Resources&#xff09;完整示例 多媒体文件的…

【自动驾驶/机器人面试C++八股精选】专栏介绍

目录 一、自动驾驶和机器人技术发展前景二、C在自动驾驶和机器人领域的地位三、专栏介绍四、订阅需知 一、自动驾驶和机器人技术发展前景 随着人工智能、机器学习、传感器技术和计算能力的进步&#xff0c;自动驾驶和机器人的技术水平不断提升&#xff0c;使得它们更加智能、可…

js项目生产环境中移除 console

1、terser-webpack-plugin webpack 构建的项目中安装使用 安装&#xff1a; npm install terser-webpack-plugin --save-dev 配置 在webpack.config.js文件中 new TerserPlugin({terserOptions: {output: {comments: false, // 去除注释},warnings: false, // 去除黄色警告,co…

Python酷库之旅-第三方库Pandas(021)

目录 一、用法精讲 52、pandas.from_dummies函数 52-1、语法 52-2、参数 52-3、功能 52-4、返回值 52-5、说明 52-6、用法 52-6-1、数据准备 52-6-2、代码示例 52-6-3、结果输出 53、pandas.factorize函数 53-1、语法 53-2、参数 53-3、功能 53-4、返回值 53-…

在InternStudio上创建一台GPU服务器

填写配置 创建完成 ssh连接&#xff0c;并测试常用指令 查看开发机信息 查看gpu信息 创建conda环境 跑个test

康谋分享 | 自动驾驶联合仿真——功能模型接口FMI(三)

在之前的两篇文章中&#xff08;文末往期回顾中可查看&#xff09;&#xff0c;我们主要介绍了功能模型接口FMI的主要组成部分和一些使用场景&#xff0c;今天就以康谋自动驾驶仿真软件aiSim为例&#xff0c;来展示一下如何建立一个FMU并实现基于UDP和FMI联合仿真&#xff08;c…

GitHub+Picgo图片上传

Picgo下载&#xff0c;修改安装路径&#xff0c;其他一路下一步&#xff01; 地址 注册GitHub&#xff0c;注册过程不详细展开&#xff0c;不会的百度一下 地址 新建GitHub仓库存放图片 生成Token令牌 点击头像&#xff0c;点击Settings 滑到最后 过期时间&#xff1a;No expi…

MyBatisPlus实现增删改查

文章目录 MyBatisPlus实现增删改查基本操作分页查询配置分页插件 MyBatisPlus实现增删改查 实体类GkUser package com.geekmice.springbootselfexercise.entity;import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField;…

uniapp 初始学习1

uni-app代码基本包括js,vue,css.在app端支持原生渲染nvue&#xff0c;可编译的kotlin和swift 掌握js就可以进行不同应用的开发 页面文件遵循 Vue 单文件组件 (SFC) 规范&#xff0c;即每个页面是一个.vue文件 .vue文件是一个自定义的文件类型&#xff0c;用类HTML语法描述一…

2024年中国网络安全市场全景图 -百度下载

是自2018年开始&#xff0c;数说安全发布的第七版全景图。 企业数智化转型加速已经促使网络安全成为全社会关注的焦点&#xff0c;在网络安全边界不断扩大&#xff0c;新理念、新产品、新技术不断融合发展的进程中&#xff0c;数说安全始终秉承科学的方法论&#xff0c;以遵循…

02:项目二:感应开关盖垃圾桶

感应开关盖垃圾桶 1、PWM开发SG901.1、怎样通过C51单片机输出PWM波&#xff1f;1.2、通过定时器输出PWM波来控制SG90 2、超声波测距模块的使用3、感应开关盖垃圾桶 需要材料&#xff1a; 1、SG90舵机模块 2、HC-SR04超声波模块 3、震动传感器 4、蜂鸣器 5、若干杜邦线 1、PWM开…

【系统架构设计】操作系统(一)

操作系统&#xff08;一&#xff09; 操作系统的类型和结构操作系统基本原理进程管理进程三态模型挂起状态进程互斥 / 进程同步前趋图进程调度死锁 存储管理设备管理文件管理作业管理 操作系统原理的关键在于“一个观点、两条线索”&#xff1a;一个观点是以资源管理的观点来定…

SpringBoot实用篇

一、运维实用篇 1.工程的打包与运行 ①对SpringBoot项目打包&#xff08;执行Maven构建指令package&#xff09; ②运行项目&#xff08;执行启动指令&#xff09; java -jar 工程打包的文件名.jar jar支持命令行启动需要依赖maven插件支持&#xff0c;请确认打包时是否具有…

集成excel工具:自定义导入回调监听器、自定义类型转换器、web中的读

文章目录 I 封装导入导出1.1 定义工具类1.2 自定义读回调监听器: 回调业务层处理导入数据1.3 定义文件导入上下文1.4 定义回调协议II 自定义转换器2.1 自定义枚举转换器2.2 日期转换器2.3 时间、日期、月份之间的互转2.4 LongConverterIII web中的读3.1 使用默认回调监听器3.2…

Python爬虫技术从去哪儿网获取旅游数据,对攻略进行可视化分析,提供全面的旅游攻略和个性化的出行建议

背景 随着信息技术的快速发展和互联网的普及&#xff0c;旅游行业也迎来了数字化和智能化的变革。去哪儿网作为中国领先的在线旅游平台之一&#xff0c;提供了丰富的旅游产品和服务&#xff0c;涵盖了机票、酒店、旅游度假等各个方面。用户通过去哪儿网可以方便地查询、预订和…

Adobe Photoshop 2024(Beta) v 25.11(2675) 旭日 免安装版

Adobe Photoshop 2024(Beta) v 25.11(2675) 旭日 免安装版&#xff0c;直接下载解压即可使用&#xff0c;感兴趣的同学可以下载体验。 文件下载:Photoshop 2024(Beta) .zip 安装报错解决方法 1、由于找不到msvcp140 dll无法继续执行 一、重新注册 msvcp140.dll 运行库文件&…

语言模型演进:从NLP到LLM的跨越之旅

在人工智能的浩瀚宇宙中&#xff0c;自然语言处理&#xff08;NLP&#xff09;一直是一个充满挑战和机遇的领域。随着技术的发展&#xff0c;我们见证了从传统规则到统计机器学习&#xff0c;再到深度学习和预训练模型的演进。如今&#xff0c;我们站在了大型语言模型&#xff…

【持续集成_06课_Jenkins高级pipeline应用】

一、创建项目选择pipeline的风格 它主要是以脚本&#xff08;它自己的语言&#xff09;的方式进行运行&#xff0c;一般由运维去做的事情&#xff0c;作为测试而言。了解即可。 --- 体现形式全部通过脚本去实现&#xff1a;执行之前&#xff08;拉取代码&#xff09;执行&…