使用大语言模型 LLM 做文本分析

本文主要分享

  1. 传统聚类算法

  2. LLM与嵌入算法

  3. 嵌入算法聚类

  4. LLM的其他用法

聚类是一种无监督机器学习技术,旨在根据相似的数据点的特征将其分组在一起。使用聚类成簇,有助于解决各种问题,例如客户细分、异常检测和文本分类等。尽管传统的聚类技术被广泛使用,但它仍然面临着挑战。今天代码很少,也没有实验数据, 主要是偏思路分享。

技术提升

论文探讨、算法交流、求职内推、干货分享、解惑答疑,与2000+来自港大、北大、腾讯、科大讯飞、阿里等开发者互动学习。

项目源码、数据、技术交流提升,均可加交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

方式①、添加微信号:mlc2060,备注:来自CSDN +研究方向
方式②、微信搜索公众号:机器学习社区,后台回复:加群

在这里插入图片描述

一、编码挑战

1.1 字段单位不统一

我想在本文中解决的主要挑战是选择如何编码或转换输入特征。一般来说,您需要将每个特征转换为相同的比例,否则,聚类模型将在特征之间分配不成比例的权重。例如, 假设数据中有重量 weight1weight2 两个字段,weight1单位是市斤,而weight2单位是公斤。如果不首先对这些测量进行标准化,即使实际重量相同,我们的模型也会推断出以市斤为单位(对于类似重量的物体)测量的重量差异大于以公斤为单位的差异。

现实中,数据集中不会出现对一个信息使用两种单位进行度量。使用这个例子, 只为说明数据中不同字段分布不同,训练模型时不同字段承载的权重也不一样。为了减轻这个问题,一般是训练之前先将字段标准化。

1.2 字段之间存在相关性

让我们使用颜色组成的特征作为另一个示例。通常,许多人会选择将此特征 one-hot 编码到 n-1 个附加列中,其中 n 是唯一颜色的数量。虽然这有效,但它忽略了颜色之间的任何潜在关系。

为什么是这样?让我们考虑数据集中的一个特征具有以下颜色:红色、栗色、深红色、猩红色和绿色。如果我们要对该列进行 one-hot 编码,我们将得到一个如下所示的数据帧:

欧几里德距离空间 中,任意两个记录(行)之间的距离是相同的。

import numpy as np

def euclidean_distance(vec1, vec2):
    if len(vec1) != len(vec2):
        raise ValueError("vecs must have the same length.")
        
    squared_differences = [(a - b) ** 2 for a, b in zip(vec1, vec2)]
    distance = np.sqrt(sum(squared_differences))
    return distance
    
red = np.array([0, 0, 0, 1, 0])
maroon = np.array([0, 0, 1, 0, 0])
green = np.array([0, 1, 0, 0, 0])

print(euclidean_distance(red, maroon))
print(euclidean_distance(red, green))

Run

1.4142135623730951   1.4142135623730951   

二、有更好的办法吗?

当然, 红色栗色 是两种不同的颜色,但为了我们的聚类算法,我们其实不希望euclidean_distance(red, maroon) 与 euclidean_distance(red, green) 是相等的。

那么该如何解决这个缺点呢?

如果您阅读这篇文章的标题,我相信您可能已经get到本文的ieda……我们将结合 大语言模型 (Large language model, LLM), 将每条记录字段和数值整理成一个字符串, 并通过LLM获得每条记录对应的嵌入表示。

对于此示例,我将使用 Huggingface 中的句子转换器库以及我围绕工作申请综合创建的数据集。

让我们从句子转换器开始。该 LLM 的工作原理与 BERT 类似,只不过它经过专门训练以在句子级别而不是单词或标记级别输出嵌入。这些句子级嵌入可以更好地捕获含义,并且计算速度更快。

from sentence_transformers import SentenceTransformer
from sentence_transformers.util import cos_sim

#使用hugginface,需要科学上网
model = SentenceTransformer(r"sentence-transformers/paraphrase-MiniLM-L6-v2")

def prompt_text(x):
    #每条记录整合为一个字符串
    p_text = (
        f"Age: {x['Age']} Gender: {x['Gender'].lower()} Role: {x['Role']} "
        f"Hiring Department: {x['HiringDepartment']} "
        f"Travel Preference: {x['TravelPreference']} Extracurriculars: {x['ExtraCurriculars']} "
        f"Distance From Home: {x['DistanceFromHome']} "
        f"Internships: {x['Internships']} Education Level: {x['EducationLevel']} Education Field: {x['EducationField']} "
        f"Summary: {x['Summary']}" 
    )
    return p_text

def output_embedding(text):
    #返回的嵌入表示的尺寸(记录数, 384)
    #sentence-transformers/paraphrase-MiniLM-L6-v2 模型的词向量维度是384
    embd = model.encode(text)
    return pd.DataFrame(embd.reshape(-1, 384))

def preprocess_text(x):
    text = prompt_text(x)
    embd = output_embedding(text)
    return embd

df['combined_text'] = df.apply(lambda x: preprocess_text(x), axis=1)

我们的数据集包括有关求职者的信息,例如招聘部门、职位、年龄和教育水平等特征。这是一个数据截图:

我们的目标是将所有求职者分为不同的簇(可以理解为群体)。

让我们看看如何将句子嵌入应用于每个求职者。第一步是通过将所有功能连接到一个字符串中来创建单个文本prompt。

Age: 28.
Gender: male.
Role: Research Scientist.
Hiring Department: Research & Development.
Travel Preference: Travel_Frequently.
Extracurriculars: nan.
Distance From Home: 4.
Internships: 9.
Education Level: 3.
Education Field: Engineering.
Summary: As you can see, I am very dedicated and I am ready to start at your firm immediately.

将原记录(行)转为如上图所示的文本,之后调用 SBERT LLM 检索文本对应的嵌入向量。为方便展示,这里使用 dataframe.style 功能来突出显示低值和大值,以使表格更容易扫描:

三、用嵌入编码有什么益处?

之前讲了传统聚类算法使用one-hot编码方式的不足,但没有解释用嵌入表示的益处。先不讲理论, 就像探索颜色编码,我们看一个例子。我想测量 Role (岗位角色) 的相似程度, 我更倾向于用余弦相似度,而不是欧几里德距离, 请问这其中的差异是?

  • 欧几里得距离 是两点之间几何距离的度量,而 余弦相似度 度量向量的方向。

  • 欧几里得距离对向量的大小敏感,而余弦相似度则不然。

  • 欧氏距离的值范围从 0(相同向量)到无穷大,而 余弦相似度的范围从 -1(完全不相似)到 1(完全相似)

让我们选择两个岗位角色:销售代表(sales representative)和销售主管(sales executive)。

  • 使用 one-hot 编码的 销售代表 和 销售主管 的余弦相似度为 0.5,这意味着他们有些相关。这是有道理的,因为他们都是销售角色。

  • 使用嵌入编码的余弦相似度为 0.82。它们的相关性要高得多。这更有意义,因为销售代表和销售主管在实践中是极其相似的角色。

3.1 传统的聚类

传统聚类算法大致流程如下图所示,

原文作者实验使用K=3的聚类算法,但k如何设置不是最关键的点。我们的聚类模型中最重要的字段是求职者的个人总结(Summary),其次是 招聘部门(HiringDepartment)、是否喜欢旅行(TravelPreference)。

为了更好的理解3个簇, 我们输出了数据汇总,每个数值字段平均值 及 非数值字段的高频项。

按道理聚类算法的结果应该不同簇之间的差异尽可能的大。糟糕的是不同簇之间的, 年龄(Age)、实习次数(Internships) 差异很小,而更糟糕的是招聘部门(HiringDepartment) 和 岗位角色(Role) 完全相同。

3.2 嵌入的聚类

使用嵌入编码的聚类算法流程如下图所示。与传统 聚类方法相比,使用嵌入的流程只需处理数字特征, 因为由求职者提示信息(代码里的prompt_text)转化来的嵌入是严格数字化的。

在这里,我们不能像上次那样直接计算字段重要性。我们有数百个难以理解的特征,它们的重要性各不相同,我们无法理解。那么我们该怎么办?让我们训练另一个模型(这次是有监督的三类分类模型),使用原始特征集来预测嵌入模型生成的类标签。这样就可以以同类的方式重现字段重要性。结果如下

我们找到一种新的嵌入表示来编码求职者信息, 并运算出了聚类结果。

从统计信息(上图)中可以看出,不同簇之间的差异变的更加清晰。使用嵌入编码, 让更多申请销售岗位的的销售主管划分到cluster2, 让更多申请研发岗位的的科学家划分到cluster1 和 cluster3.

四、启发

读完以上内容,大邓想到一个问题, 假设 没有简历系统,没有大数据,求职者与面试官坐在现场, 数据就是面试过程中的交流, 而交流必然通过话语这一媒介。例如求职者的个人信息

“大家好,我叫张三, 今年24岁,哈尔滨人。本科毕业于哈尔滨工业大学,市场营销专业。 我是一个很外向的人,对销售很感兴趣,在大学期间摆了很多地摊。很希望获得贵公司的机会,让我在营销岗位上大发异彩。”   

面试期间,记录人员将该哈尔滨张三的个人信息被整理为

name: 张三
age: 24
city: 哈尔滨
edu: 哈尔滨工业大学
major: 市场营销
experience: 摆摊
summary: 我是外向的人,对销售很感兴趣。

求职者的信息汇总成xlsx, 每个人的信息都或多或少的被压缩了。这种表示方式, 在小规模时, 求职者的总结summary还是有很大信息量的,能够让面试者回忆起当时的场景和情景。但是当求职者的规模上升到几千上万, 备注note信息这种很重要的信息反而无法利用。

使用大语言模型LLM,将文本提示转化为嵌入表示。我们可以将LLM看成是一个察言观色,见微知著,明察秋毫的智者。 这个智者可以

  • 分类

  • 提取信息

  • 补全

  • 相似性

以往缺失数据, 用插值或者其他技巧, 现在我们可以借助LLM, 只有有其他字段残存的微弱线索, LLM就能帮我们补全缺失值。

4.1 分类

如图所示, 对于很多短文本, 我们可以推断话题,也可以推断情绪。

https://huggingface.co/morit/chinese_xlm_xnli   

4.2 提取信息

假设有一些信息存储在文本中, 可以用正则表达式提取, 下面的例子用正则会很难设计, 但用LLM很简单。

https://huggingface.co/luhua/chinese_pretrain_mrc_roberta_wwm_ext_large   

4.3 补全

填充缺失值信息

4.4 相似性

当然LLM功能还有很多,大家可以自己探索探索。

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

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

相关文章

济南数字孪生赋能工业制造,加速推进制造业数字化转型

济南数字孪生赋能工业制造,加速推进制造业数字化转型。数字孪生是指通过数字模型对现实世界进行模拟和描述,从而实现数字化转型的技术。数字孪生技术通过利用先进传感与测量技术、实时数据融合及分析技术、虚拟现实技术和仿真技术,在数字空间…

vs code git问题:文件明明已加入忽略文件中,还是出现

vs code git问题:文件明明已加入忽略文件中,还是出现 原因: 因为之前这些文件都已经提交过,线上GIT已经存在,已存在就不能忽略, 解决办法: 先要删除这些文件提交上去,然后把这些文…

企业级固态硬盘如何稳定运行?永铭固液混合铝电解电容来帮忙

企业级 固态硬盘 永铭固液混合铝电解电容 企业级固态硬盘(SSD)主要应用于互联网、云服务、金融和电信等客户的数据中心,企业级SSD具备更快传输速度、更大单盘容量、更高使用寿命以及更高的可靠性要求。 企业级固态硬盘的运行要求—固液混合电…

STM32:OLED屏幕开发

一、OLED原理 所谓的屏幕就是由一个个小灯组成,每个小灯称之为一个像素。只要在屏幕上有选择地点亮一部分小灯,就可以显示我们想要的图案。所谓下分辨率就是屏幕上的小灯数量。常见单片机中常见的屏幕分辨率常见的就是128(列长)*64(行高)。如果每个小灯都…

沸点 | Ultipa 图数据库金融应用场景优秀案例首批入选,金融街论坛年会发布

为推进图数据库在金融行业的创新应用试点,近日,在2023金融街论坛年会“全球金融科技中心网络年会暨ZIBS北京论坛”上,北京前沿金融监管科技研究院发布了基于国际标准组织——国际关联数据基准委员会(LDBC)的《图数据库…

NX二次开发UF_CAM_ask_blank_matl_db_object 函数介绍

文章作者:里海 来源网站:里海NX二次开发3000例专栏 UF_CAM_ask_blank_matl_db_object Defined in: uf_cam.h int UF_CAM_ask_blank_matl_db_object(UF_CAM_db_object_t * db_obj ) overview 概述 This function provides the database object which …

五、程序员指南:数据平面开发套件

服务质量 (QoS) 框架 本章介绍 DPDK 服务质量 (QoS) 框架。 21.1 带有 QoS 支持的数据包流水线 下图显示了一个具有 QoS 支持的复杂数据包处理流水线的示例 表21.1:带有 QoS 支持的复杂数据包处理流水线 这个流水线可以使用可重用的 DPDK 软件库构建。在这个流…

队列的实现和OJ练习

目录 概念 队列的实现 利用结构体存放队列结构 为什么单链表不使用这种方法? 初始化队列 小提示: 队尾入队列 队头出队列 获取队头元素 获取队尾元素 获取队列中有效元素个数 检测队列是否为空 销毁队列 最终代码 循环队列 队列的OJ题 …

FFmpeg常用命令行讲解及实战一

文章目录 前言一、学习资料参考二、FFmpeg 选项1、主要选项①、主要命令选项②、举例 2、视频选项①、主要命令选项②、举例1)提取固定帧2)禁止输出视频3)指定视频的纵横比 3、音频选项①、主要命令选项②、举例 4、字幕选项①、主要命令选项…

基于混沌博弈算法优化概率神经网络PNN的分类预测 - 附代码

基于混沌博弈算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于混沌博弈算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于混沌博弈优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神…

二分查找——34. 在排序数组中查找元素的第一个和最后一个位置

文章目录 1. 题目2. 算法原理2.1 暴力解法2.2 二分查找左端点查找右端点查找 3. 代码实现4. 二分模板 1. 题目 题目链接:34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode) 给你一个按照非递减顺序排列的整数数组 nums&#…

python实战—核心基础2(数字大小写转换) lv1

目录 一、核心代码解释 二、代码 三、运行截图 一、核心代码解释 1、range函数 函数语法:range(start, stop[, step]) 参数说明: start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0&#x…

11.15 监控目录文件变化

监视对指定目录的更改,并将有关更改的信息打印到控制台,该功能的实现不仅可以在内核层,在应用层同样可以。程序中使用ReadDirectoryChangesW函数来监视目录中的更改,并使用FILE_NOTIFY_INFORMATION结构来获取有关更改的信息。 Re…

【Java】线程状态

1、线程状态 初始-NEW: Thread : 对象已经创建,但start 方法还没调用. 终止-TERMINATED: Thread 对象还在,内核中的线程已经没了 运行-RUNNABLE: 就绪状态(线程已经在 cpu 上执行了/线程正在排队等待上 cpu 执行) 超时等待-TIMED WAITING: 阻塞.由于 sleep 这种固定…

从暗黑3D火炬之光技能系统说到-Laya非入门教学一~资源管理

我不知道那些喷Laya没有浏览器,嘲笑别人编辑器做不好,是什么水平? 首先目前国内除了WPS和飞书,就没有第三家公司能把编辑器做好。 要是一般的游戏开发者,如我,有一点点引擎代码(某项目&#x…

时间序列预测实战(十七)PyTorch实现LSTM-GRU模型长期预测并可视化结果(附代码+数据集+详细讲解)

一、本文介绍 本文给大家带来的实战内容是利用PyTorch实现LSTM-GRU模型,LSTM和GRU都分别是RNN中最常用Cell之一,也都是时间序列预测中最常见的结构单元之一,本文的内容将会从实战的角度带你分析LSTM和GRU的机制和效果,同时如果你…

铝合金钻孔铣削去毛刺加工之高速电主轴解决方案

铝合金是一种轻质、高强度的材料,其出色的机械性能和良好的导电性、导热性使其在工业领域广受青睐特别是在航空、航天和汽车制造中,铝合金的身影更是随处可见。在铝合金加工过程中,高速电主轴可精准而高效地完成钻孔、铣削和去毛刺等任务&…

贪吃蛇游戏制作

首先在ecilsp里面创建两个包,启动和图形界面 在创建一个文件夹用来放图片 1.绘制图形界面 package com.snaketuxing.view;import java.awt.Color; import java.awt.EventQueue; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import …

go语言的某些开发素质真低,完全就是缺教养。

我本人在github提过一个错误处理的提案,2023年11月20日微信公众号“脑子进煎鱼了” 记录了这个提案,在评论区有个微信名为:【hello哥已开始躺平】的微信用户一来就喷粪,这种人到底是欠打呢还是心理变态呢?对别人的提案…

docker更换国内源

docker更换国内源 1、编辑Docker配置文件 在终端中执行以下命令,编辑Docker配置文件: vi /etc/docker/daemon.json2、添加更新源 在打开的配置文件中,添加以下内容: {"registry-mirrors": ["https://hub-mirror…