大模型系列:OpenAI使用技巧_使用文本向量化Embeding进行分类

文章目录

    • 使用文本向量化Embeding进行分类
    • 使用文本向量进行零样本Zero Shot分类

使用文本向量化Embeding进行分类

有许多方法可以对文本进行分类。本笔记本分享了使用嵌入进行文本分类的示例。对于许多文本分类任务,我们已经看到微调模型比嵌入效果更好。请参见微调分类.ipynb中分类的微调模型示例。我们还建议拥有比嵌入维度更多的示例,但我们在这里并没有完全实现。

在这个文本分类任务中,我们基于评论文本的嵌入预测食品评论的评分(1到5)。我们将数据集分为训练集和测试集,以便在未见数据上实际评估性能。数据集是在从数据集获取嵌入笔记本中创建的。

# 导入必要的库
import pandas as pd
import numpy as np
from ast import literal_eval
from sklearn.ensemble import RandomForestClassifier  # 随机森林分类器
from sklearn.model_selection import train_test_split  # 数据集划分函数
from sklearn.metrics import classification_report, accuracy_score  # 分类报告和准确率评估

# 加载数据
datafile_path = "data/fine_food_reviews_with_embeddings_1k.csv"  # 数据文件路径
df = pd.read_csv(datafile_path)  # 读取csv文件
df["embedding"] = df.embedding.apply(literal_eval).apply(np.array)  # 将嵌入向量从字符串转换为数组

# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    list(df.embedding.values), df.Score, test_size=0.2, random_state=42
)

# 训练随机森林分类器
clf = RandomForestClassifier(n_estimators=100)  # 创建随机森林分类器对象
clf.fit(X_train, y_train)  # 在训练集上拟合分类器
preds = clf.predict(X_test)  # 在测试集上进行预测
probas = clf.predict_proba(X_test)  # 预测每个类别的概率

# 生成分类报告并输出准确率评估
report = classification_report(y_test, preds)  # 生成分类报告
print(report)  # 输出分类报告
              precision    recall  f1-score   support

           1       0.89      0.40      0.55        20
           2       1.00      0.38      0.55         8
           3       1.00      0.18      0.31        11
           4       1.00      0.26      0.41        27
           5       0.75      1.00      0.86       134

    accuracy                           0.77       200
   macro avg       0.93      0.44      0.53       200
weighted avg       0.82      0.77      0.72       200

我们可以看到模型已经学会了很好地区分不同的类别。五星级评论总体上表现最好,这并不太令人惊讶,因为它们在数据集中最为常见。

# 从utils.embeddings_utils模块中导入plot_multiclass_precision_recall函数
from utils.embeddings_utils import plot_multiclass_precision_recall

# 调用plot_multiclass_precision_recall函数,传入probas、y_test、[1, 2, 3, 4, 5]和clf四个参数
# probas:预测结果的概率值
# y_test:测试集的真实标签
# [1, 2, 3, 4, 5]:标签的取值范围
# clf:分类器
plot_multiclass_precision_recall(probas, y_test, [1, 2, 3, 4, 5], clf)
RandomForestClassifier() - Average precision score over all classes: 0.87

毫不意外,5星和1星的评论似乎更容易预测。也许有更多的数据,2-4星之间的细微差别可以更好地预测,但人们如何使用中间分数也可能更加主观。

使用文本向量进行零样本Zero Shot分类

在这个笔记本中,我们将使用嵌入和零标签数据来对评论的情感进行分类!数据集是在从数据集中获取嵌入笔记本中创建的。

我们将定义正面情感为4星和5星的评论,负面情感为1星和2星的评论。3星的评论被认为是中性的,我们不会在这个例子中使用它们。

我们将通过嵌入每个类别的描述,然后将新样本与这些类别的嵌入进行比较来进行零样本分类。

# 导入所需的库
import pandas as pd
import numpy as np
from ast import literal_eval
from sklearn.metrics import classification_report

# 设置参数,指定使用的文本嵌入模型
EMBEDDING_MODEL = "text-embedding-ada-002"

# 加载数据文件
datafile_path = "data/fine_food_reviews_with_embeddings_1k.csv"
df = pd.read_csv(datafile_path)

# 将embedding列中的字符串转换为numpy数组
df["embedding"] = df.embedding.apply(literal_eval).apply(np.array)

# 将5星评分转换为二元情感标签
df = df[df.Score != 3] # 去除评分为3的数据
df["sentiment"] = df.Score.replace({1: "negative", 2: "negative", 4: "positive", 5: "positive"}) # 将1和2评分标记为negative,将4和5评分标记为positive

为了进行零样本分类,我们希望在没有任何训练的情况下为样本预测标签。为此,我们可以简单地嵌入每个标签的简短描述,例如正面和负面,然后比较样本和标签描述之间的余弦距离。

与样本输入最相似的标签是预测标签。我们还可以定义一个预测分数,即到正面和负面标签的余弦距离之间的差异。可以使用此分数绘制精确度-召回率曲线,通过选择不同的阈值选择不同的精确度和召回率之间的权衡。

# 导入所需的函数和类
from utils.embeddings_utils import cosine_similarity, get_embedding
from sklearn.metrics import PrecisionRecallDisplay

# 定义评估嵌入方法的函数
def evaluate_embeddings_approach(
    labels = ['negative', 'positive'], # 定义标签列表,用于计算标签的嵌入向量
    model = EMBEDDING_MODEL, # 定义嵌入模型
):
    # 获取标签的嵌入向量
    label_embeddings = [get_embedding(label, model=model) for label in labels]

    # 定义计算评分的函数,用于计算嵌入向量与标签嵌入向量之间的余弦相似度
    def label_score(review_embedding, label_embeddings):
        return cosine_similarity(review_embedding, label_embeddings[1]) - cosine_similarity(review_embedding, label_embeddings[0])

    # 计算每个评论的评分,并将评分转换为预测标签
    probas = df["embedding"].apply(lambda x: label_score(x, label_embeddings))
    preds = probas.apply(lambda x: 'positive' if x>0 else 'negative')

    # 生成分类报告
    report = classification_report(df.sentiment, preds)
    print(report)

    # 生成精度-召回率曲线
    display = PrecisionRecallDisplay.from_predictions(df.sentiment, probas, pos_label='positive')
    _ = display.ax_.set_title("2-class Precision-Recall curve")

# 调用评估嵌入方法的函数,并传入标签和嵌入模型
evaluate_embeddings_approach(labels=['negative', 'positive'], model=EMBEDDING_MODEL)
              precision    recall  f1-score   support

    negative       0.61      0.88      0.72       136
    positive       0.98      0.90      0.94       789

    accuracy                           0.90       925
   macro avg       0.79      0.89      0.83       925
weighted avg       0.92      0.90      0.91       925

我们可以看到,这个分类器已经表现得非常好了。我们使用了相似性嵌入和最简单的标签名称。让我们尝试通过使用更具描述性的标签名称和搜索嵌入来改进它。

evaluate_embeddings_approach(labels=['An Amazon review with a negative sentiment.', 'An Amazon review with a positive sentiment.'])

              precision    recall  f1-score   support

    negative       0.98      0.73      0.84       136
    positive       0.96      1.00      0.98       789

    accuracy                           0.96       925
   macro avg       0.97      0.86      0.91       925
weighted avg       0.96      0.96      0.96       925

使用搜索嵌入和描述性名称可以进一步提高性能。

evaluate_embeddings_approach(labels=['An Amazon review with a negative sentiment.', 'An Amazon review with a positive sentiment.'])

              precision    recall  f1-score   support

    negative       0.98      0.73      0.84       136
    positive       0.96      1.00      0.98       789

    accuracy                           0.96       925
   macro avg       0.97      0.86      0.91       925
weighted avg       0.96      0.96      0.96       925

如上所示,使用嵌入进行零样本分类可以获得很好的结果,特别是当标签比简单的单词更具描述性时。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

命令模式-举例

开关和电灯之间并不存在直接耦合关系,在命令模式中,发送者与接收者之间引入了新的命令对象,将发送者的请求封装在命令对象中,再通过命令对象来调用接收者的方法。 命令模式的主要缺点如下: 使用命令模式可能会导致某…

Android 13 - Media框架(27)- ACodec(五)

前面几节我们了解了OMXNodeInstance是如何处理setPortMode、allocateBuffer、useBuffer的,这一节我们再回到ACodec,来看看 ACodec start 的其他部分。 我们首先来回顾一下,ACodec start 的状态切换以及处理的事务,我们用一张不太准…

sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set问题解决方案

sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set问题解决方案 当我们使用sudo su切换权限时提示错误: sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set该错误出现原因:是因为/usr/bin/sudo的权限被…

GPT4All : 便捷易用的本地智能问答推理软件(乱记)

安装与使用 去官网 https://gpt4all.io/index.html下载可执行文件。 打开应用即可看到是否共享数据的选项: 然后自动进入模型下载界面 测试 内存占用 缺点:在我本地的轻薄本上运行时,风扇会有轻微噪声,关闭软件很久都没停止。…

详解Vue3中的常见的监听事件click、input和change

本文主要介绍Vue3中的常见的监听事件click、input和change。 目录 一、click点击事件二、input输入事件三、change改变事件 在Vue3中,常见的监听事件有以下几种: 一、click点击事件 click事件是最常见的用户交互事件之一。它在元素被点击时触发&#xf…

简单了解SQL堆叠注入与二次注入(基于sqllabs演示)

1、堆叠注入 使用分号 ; 成堆的执行sql语句 以sqllabs-less-38为例 ?id1 简单测试发现闭合点为单引号 ?id1 order by 3 ?id1 order by 4使用order by探测发现只有三列(字段数) 尝试简单的联合注入查询 ?id-1 union select 1,database(),user()-…

【Linux系统】文件fd

一.预备知识 文件内容属性进程如果想要访问文件,必须先打开文件,即先将其加载到内存,这个工作由操作系统完成一个进程可以打开多个文件,多个进程可以打开多个文件操作系统要想对这么多打开的文件进行管理,必须“先描述…

4~20mA恒流源 --PLC自控控制

输出部分不接地 1.1&#xff0c; 常规恒流源的方式 用采样电阻 * 电流 控制电压的方式。 负载电阻 * 电流 < 工作电压 1.2&#xff0c;根据运放高阻的特性 Ir Ui/ R, Ir IL, 最大输出电流限制于 RL * Il < Ui. 输出部分接地&#xff0c;工程上更多是用于豪兰德恒流源…

基于yolov2深度学习网络的血细胞检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1YOLOv2算法原理 4.2 YOLOv2网络结构 4.3 血细胞检测算法实现 数据集准备 数据预处理 网络训练 模型评估与优化 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MAT…

Can‘t locate IPC/Cmd.pm in @INC (@INC contains:解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

18国签署,全球首份《安全AI系统开发指南》发布

内容概述&#xff1a; 2023年11月27日&#xff0c;美国、英国和其他十几个国家公布了首份关于如何保护AI免受流氓行为侵害的详细国际协议《安全AI系统开发指南》&#xff0c;敦促企业打造“设计安全”的AI系统。协议由英国国家网络安全中心&#xff08;NCSC&#xff09;主导&a…

【Java 进阶篇】深入浅出 Jedis 连接池与工具类

​ 在现代的软件开发中&#xff0c;高效地与数据存储系统进行交互是至关重要的。而对于 Redis 这样的高性能键值存储系统&#xff0c;连接池成为了一个不可或缺的工具。本文将围绕 Jedis 连接池及其工具类展开详细解说&#xff0c;让我们一起揭开连接池的神秘面纱。 走进 Red…

m3u8网络视频文件下载方法

在windows下&#xff0c;使用命令行cmd的命令下载m3u8视频文件并保存为mp4文件。 1.下载ffmpeg&#xff0c;访问FFmpeg官方网站&#xff1a;https://www.ffmpeg.org/进行下载 ffmpeg下载&#xff0c;安装&#xff0c;操作说明 https://blog.csdn.net/m0_53157282/article/det…

鸿蒙OS应用开发之气泡提示

前面学习了弹窗提示,其实有时候只是想在旁边做一些说明,那么采用弹窗的方式就比较麻烦一些,这时可以采用系统里面的气泡提示方式。 系统也提供了几种方式弹出气泡提示,最简单的一种是采用bindPopup属性。它的定义如下: 在后面的参数设置里,也是比较复杂的形式。我们先来演…

【滑动窗口】【差分数组】C++算法:K 连续位的最小翻转次数

作者推荐 动态规划 多源路径 字典树 LeetCode2977:转换字符串的最小成本 本题涉及知识点 滑动窗口 差分数组 LeetCode995: K 连续位的最小翻转次数 给定一个二进制数组 nums 和一个整数 k 。 k位翻转 就是从 nums 中选择一个长度为 k 的 子数组 &#xff0c;同时把子数组中…

Halcon颜色通道的处理decompose3/image_to_channels/channels _to _image

Halcon颜色通道的处理 文章目录 Halcon颜色通道的处理一. 图像的通道二. 访问通道1.访问通道2.获取通道的数量 三. 通道分离与合并1. decompose3算子2. image_to_channels 算子3. compose3算子4. channels_to_image算子 四. 处理RGB信息 由于彩色图像通常包含不止一个通道&…

@Zabbix监控网络设备Trap接口UPDOWN关联告警配置

网络设备Trap接口UPDOWN关联告警配置 文章目录 网络设备Trap接口UPDOWN关联告警配置SNMPTrap描述1.监控平台监控项配置2.监控平台日志接收3.监控平台触发器配置4.监控平台触发器功能测试1&#xff09;告警触发2&#xff09;告警恢复 5.告警解析 SNMPTrap描述 在Zabbix中&#x…

网络基础操作练习

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 手把手教你操作华为设备&#xff0c;新手必看。 实验拓扑图 关于命令行视图 1&#xff09;用户视图 <Huawei> 2&#xff09;系统视图 [Hu…

超维空间S2无人机使用说明书——51、基础版——使用yolov8进行目标跟踪

引言&#xff1a;为了提高yolo识别的质量&#xff0c;提高了yolo的版本&#xff0c;改用yolov8进行物体识别&#xff0c;同时系统兼容了低版本的yolo&#xff0c;包括基于C的yolov3和yolov4&#xff0c;以及yolov7。 简介&#xff0c;为了提高识别速度&#xff0c;系统采用了G…

添加 Android App Links

添加 Android App Links功能 介绍一个简单的效果Android配置Add Url intent filtersAdd logic to handle the intentAssociate website 搭建网页支持AppLinks 介绍 Android App Links 是指将用户直接转到 Android 应用内特定内容的 HTTP 网址。Android App Links 可为您的应用带…