词的向量化和文本向量化

词的向量化和文本向量化

  • 向量化
    • one-hot编码
      • 提前准备词表
      • 不提前准备词表
      • one-hot缺点
  • 词向量
    • 简介
      • 词向量的定义和目标
      • word embedding和word vector的区别
      • onehot编码与词向量关系构建
    • 训练方式1(基于语言模型)
    • 训练方式2(基于窗口)
      • CBOW模型
      • SkipGram模型
      • 缺点
      • 缺点解决方案-Huffman树
        • Huffman树构建过程:
      • 缺点解决方案-负采样(negative sampling)
    • 训练方式3(基于共现矩阵Glove)
      • 共现矩阵
      • 共现概率
      • 共现概率比
      • 共现矩阵训练词向量
    • 总结
      • 训练流程
      • 存在的问题
    • 词向量应用
      • 1. 寻找近义词
      • 2. 句向量或文本向量
        • KMeans聚类
    • 词向量总结

向量化

引子: 向量对于机器学习非常重要,大量的算法都需要基于向量来完成

原因:

对于机器来说,字符是没有含义的,只是有区别
只使用字符无法去刻画字与字、词与词、文本与文本之间的关系
文本转化为向量可以更好地刻画文本之间的关系
而向量化后,可以启用大量的机器学习算法,具有很高的价值

文本向量化: 文本是由词和字组成的,想将文本转化为向量,首先要能够把词和字转化为向量;并且就同一个任务或者模型,向量化的维度应该是相同的,如果为n维,我们就称是n维语义空间。

如下图: 随机初始化向量后,通过训练,使得表示的向量可以表达词、字之间的语义关系:
在这里插入图片描述

one-hot编码

提前准备词表

释义:

1.首先我们会提前准备一个字表或词表,选出n个字或词;
2.然后根据词表的大小,决定向量的维度;
3.通过词的序号,在向量的对应维度上数值设为1,其余维度则为0

举例如下:

那么根据上面的编码,我们就可以将句子用向量表示:
今天不错 --> [1,0,0,1,0]
天气真不错 --> [0,1,1,1,0]

向量化文本时,也可以通过叠加,表示词频含义
今天不错不错 --》 [1,0,0,2,0]

不提前准备词表

引子: one-shot发展到后面,就考虑不准备词表,直接根据材料的字动态给生成。
举例:
假设现在有语料

  1. 你好吗?
  2. 你身体好吗?

自动的统计语料中出现的字,然后按照出现,不断的扩大向量的维度,并把新的字表示进去

在这里插入图片描述

one-hot缺点

  1. 如果词特别多,编码的向量维度会特别大,维度灾难,并且向量特别稀疏,只有词的地方才有值,这样会带来巨大的计算量
  2. 编码的向量并没有反应词与词之间的语义关系,只是做到区分不同字词的作用

词向量

简介

词向量的定义和目标

词向量,即我们希望得到一个词之间的向量能够反映语义关系的向量权重信息。
有以下三个维度

1.词义的相似性反映向量的相似性

即有三个词向量: 您好、你好、天气
有:cos(您好,你好) > cos(你好,天气)

2.向量可以通过数值的运算反应词之间的关系
即有四个向量:国王、男人、皇后、女人
有:国王 - 男人 = 皇后 - 女人

3.同时不管词表有多少词,我们希望表示词的语义空间是大小是固定的,即向量的维度相同.

word embedding和word vector的区别

简单来说,两个没有区别,我们知道词向量的作用,是将字符转化为有一定含义向量,便于后续去进行模型的计算。

在这里的区别

embedding业内更强调是将字符转为对应的向量
Word2Vec 强调的是对词向量的训练,使其具有一些特定得含义和作用,即通过向量相似度反映语义得相似度

onehot编码与词向量关系构建

即我们可以将embedding矩阵看成一个线性层,而onehot作为编码输入,由于onehot编码得稀疏性,以及只有对应词得序号所在下标才有值,通过和embedding的运算,就可以获取该词的向量了

示意图如下:在这里插入图片描述

训练方式1(基于语言模型)

语言模型释义: 语言模型就是输入几个词,它能预测下一词;预测的下一词由它前面的n个词决定,那么就需要理解词的含义。

比如:

晴空 万里 碧波 如洗 我们 出去 玩 吧
晴空 -->万里
模型根据晴空预测出下一个词万里

本质: 这种预测本质是一个分类的问题,即我们由一个词表,我们将前面输入的词或者一句话作为分类任务,判别它是属于词表中的词的哪一类;即可达成预测效果。根据词表分类

好处: 我们的分类任务需要标注;但是上述中,我们只需要把前面的n个词输入,将句子的下一个词做输出即可进行训练;降低了标注的工作。

训练方式2(基于窗口)

基于窗口: 如果两个词在文本中出现时,它前后出现的词相似,则这两个词相似,我们可以通过前后的词来表示中间词
如下图所示
在这里插入图片描述
释义: 窗口是指需要前后抓取几个词去表示目标词

CBOW模型

基于前述的思想,用窗口中的词(即目标词周围的词)来表示预测中间词
示意图如下:
在这里插入图片描述
模型结构:

第一层:即embedding层
第二层:即模型的pooling层
第三层:即线性层将结果转为我们需要的维度

好处:

1.相对于基于模型的训练,结构很简单,所以训练的资源相对较小
2.相对于基于模型训练出来的embedding,训练的效果,更能体现embedding好;简单说就是,窗口训练的embedding和模型训练出来的,窗口的embedding更能表示词关系。因为模型简单,效果更依赖于embedding

举例:

窗口:你想明白 了吗?
输入:你想了吗?
输出:明白

SkipGram模型

释义: 与CBOW模型原理类似,区别在于用中间词,去预测两边的词
示意图
在这里插入图片描述
举例:

窗口: 你 想 明白 了 吗
(输入,输出) :
(明白,你)(明白,想)(明白,了)(明白,吗)

缺点

在当时提出上述的训练方法时,在最后一层,即将结果映射到词表的维度,由于词表非常的大,并且输出层使用的是onehot(因为预测某个词),所以会面临维度灾难,并且会导致收敛缓慢
当然当前已经不存在这个问题了,因为由于时代的发展,机器的性能提高了很多倍,上面的就变成小kiss

缺点解决方案-Huffman树

Huffman树是对所有词进行二进制编码,使其符合以下特点:

  1. 保证不同的词编码不同
  2. 每一个词的编码不会成为另外一个词编码的前缀(即:某个词的编码011;则不能有词的编码为0110;0111等等)
  3. 构造出的词编码总体长度最小,且越高频词编码越短
Huffman树构建过程:

1.我们先要将编码的词统计出词频
如下:

你 50
我 10
他 8
你们 7
我们 6
他们 3
它们 2

2.将词构建在二叉树上,将词频由低到高进行构建,先将最小的两个词频的词放到树的两个叉上,节点为两个词频的之后,下一次构建时,则将该二叉树作为一个节点进行比较
如下:
在这里插入图片描述
3.有第一个二叉树后,在新的词频上,再次选择最小的两个词频进行二叉树构建,将词频低的放到左侧,高的放到右侧,如果相等,就您随意。如下:

你 50
我 10
他 8
你们 7
我们 6
它们 | 他们 5

构建如下:在这里插入图片描述
4.在第3步的基础上完成新的二叉树构建后,我们在这个基础上进行下一轮构建,直到所有词都在一个树上为止。如下:

你 50
它们 | 他们 | 我们 11
我 10
他 8
你们 7
继续下一轮构建

5.在得到完整的词频构建的树后,我们从初始的节点开始,往右移动一次,则编码为1;往左移动一次,则编码0;最终可以得到下面的结果
在这里插入图片描述
Huffman树的编码结果为:

你 1
我 010
他 001
你们 000
我们 0111
他们 01101
它们 01100

达成目标:
1.每个词的编码不同
2.每个词的编码不会成为其他词的前缀
3.词频越高编码长度越短

训练方案

原来的词向量训练中,我们采用三次,embedding、pooling层、一个线性层
困难点: 在线下层需要映射到词表的词上,也就是说线下层的参数为: embedding_size X vector_size
现在我把一个线下层任务,按照上面的Huffman树构建成多个二分类的线性层;即原来是一次从词表中1万个词中找到预测词;现在我只需要在每层编码,判断下是往左还是往右就可以了;其次,对于高频的词,编码的短,所有二分类计算的线下层也就少,训练的速度也就更
现在线下层的参数:embedding_size X 2 * 词的最长编码数

当然,上面那个例子的参数并没有减少多少;这是因为实际实现中,还需要一些工程上的优化操作。这样就可以快速训练出效果较好的词向量。

缺点解决方案-负采样(negative sampling)

引子: 我们知道词表特别大,导致最后得到预测词的分布,由于预测的分类太多了,所以存在维度爆炸的问题,对机器性能要求很高

解决: 负采样的逻辑即,我们在算预测词分布时,需要算的分类太多了;一次任务训练,其中其实只有一个词是我们要预测的,我们希望预测它的概率接近1,其他的词的概率为0

步骤:
1.如果词表有1万个词;我们正常需要计算embedding_size * 10001词
2.现在每一次训练,我找出需要预测的词,其他非预测词,我木门把它拆成1000词一份,就一个10份
3.那么原来是一次训练计算1万个词;现在我分为10次训练,每次训练计算其中的1001个词;多出来的这一个词,就我们的要预测的词
那么我们就可以大幅降低模型训练对机器的性能要求了
注意:上面我们训练10次举个例子,实际中并不是平均分为10份进行训练的,而是随机选择训练的词,加上预测词训练

即随机选取非预测词的方案就是负采样。
按照词频进行随机采样,有一个经验公式
在这里插入图片描述

训练方式3(基于共现矩阵Glove)

释义: 共现,就是说两个词共同出现的次数

共现矩阵

示例

现在有语料:
今天 天气 不错
今天 天气 很 好
天气 很 好
天气 不错

从上面语料中,构建词表:

今天、天气、很、好、不错

我们基于共现窗口为1,即词与左右相邻词算共现:
在这里插入图片描述
这样就可以得到,每个词和它相邻词共同出现的次数

共现概率

释义:词(天气)出现在词(今天)周围的概率,被称为词(今天)与词的(天气)共现概率

P(天气|今天) = 2/2 = 1

公式:在这里插入图片描述

共现概率比

释义: 两个共现概率的比值
在这里插入图片描述
价值:

共现概率比反映了一定的语义信息
a.如果词A与词B的相关性,大于词A与词C的相关性,则共享概率比 P(A|B)/P(A|C) 会较高,反之亦然
b.P(A|B)/P(A|C)共享概率比较大,或者较小;都说明B与C有一个词和A的关系更加紧密
c.P(A|B)/P(A|C)共享概率接近1;要么说明B与C词和A的词关系都很密切,要么都没什么关系

共现矩阵训练词向量

根据共现矩阵的价值,我们就有了新的训练词向量的目标:

1.给定三个词的词向量,Va, Vb, Vc三者的通过某个函数映射后,其比值应接近ABC的共现概率比
2.即目标为找到向量使得 f(Va, Vb, Vc) = P(A|B)/P(A|C)
3.预测数值,属于回归问题, 损失函数使用均方差;设计论文中给出的是f(Va, Vb, Vc) = (Va - Vb )·Vc

总结

训练流程

1、根据词与词之间关系的某种假设,制定训练目标,这个假设不一定完全正确,但是它代表了词与词之间的某种关系。

2、设计模型,以词向量为输入

3、随机初始化词向量,开始训练

4、训练过程中词向量作为参数不断调整,获取一定的语义信息

5、使用训练好的词向量做下游任务

存在的问题

1.词向量是“静态”的。每个词使用固定向量,没有考虑前后文

2.一词多义的情况。西瓜 - 苹果 - 华为

3.影响效果的因素非常多
维度选择、随机初始化、skip-gram/cbow/glove、分词质量、词频截断、未登录词、窗口大小、迭代轮数、停止条件、语料质量等

4.没有好的直接评价指标。常需要用下游任务来评价

词向量应用

1. 寻找近义词

输入:红烧肉

注意:
依赖分词正确,与A最接近的词是B,不代表B最接近的是A,有时也会有反义词很相似,会有很多badcase

2. 句向量或文本向量

步骤:
1.将一句话或一段文本分成若干个词
2.找到每个词对应的词向量
3.所有词向量加和求平均或通过各种网络模型,得到文本向量
4.使用文本向量计算相似度或进行聚类等

KMeans聚类

步骤:

1.随机选择k个点作为初始质心
2.将每个点指派到最近的质心,形成k个簇,即k类
3.重新计算每个簇(类)的质心 (可以通过求平均等)
4.反复执行2-3步骤,直到质心不在发生变化

KMeans优点:

1.速度很快,可以支持很大量的数据
2.样本均匀特征明显的情况下,效果不错

KMeans缺点:

1.人为设定聚类数量
2.初始化中心影响效果,导致结果不稳定
3.对于个别特殊样本敏感,会大幅影响聚类中心位置
4.不适合多分类或样本较为离散的数据

KMeans使用技巧:

1.先设定较多的聚类类别
2.聚类结束后计算类内平均距离
3.排序后,舍弃类内平均距离较长的类别
4.计算距离时可以尝试欧式距离、余弦距离或其他距离
5.短文本的聚类记得先去重,以及其他预处理

词向量总结

1.质变:将离散的字符转化为连续的数值

2.通过向量的相似度代表语义的相似度

3.词向量的训练基于很多不完全正确的假设,但是据此训练的词向量是有意义的

4.使用无标注的文本的一种好方法

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Javascript前端面试基础(八)

window.onload和$(document).ready区别 window.onload()方法是必须等到页面内包括图片的所有元素加载完毕后才能执行$(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕 window.onload 触发时机:window.onload 事件会在整个页面&#xf…

[css3] 如何设置边框颜色渐变

div {border: 4px solid;border-image: linear-gradient(to right, #8f41e9, #578aef) 1; }参考: 5种CSS实现渐变色边框(Gradient borders方法的汇总

银行贷款信用评分不足?大数据帮你找回失去的“分”

在这个信息爆炸的时代,无论是个人还是企业,数据都成为了衡量信用和评估风险的重要依据。贷款、融资、求职甚至是日常消费,都可能因为一份好的数据报告而变得更加顺畅。那么,如何高效地查询自己的大数据,面对评分不足时…

文件上传漏洞(ctfshow web151-161)

Web151 F12修改源代码 exts后面png改为php 这样就可以上传php的文件了 Web152: 考点:后端不能单一校验 就是要传图片格式,抓个包传个png的图片 然后bp抓包修改php后缀解析 然后放包 Web153-web156 在php代码中可以使用“{}”代替“[]” …

uniapp时间戳转时间

时间戳转时间 utils页面 function timestampToTime(time) { const date new Date(time); const year date.getFullYear(); const month String(date.getMonth() 1).padStart(2, 0); // 月份从0开始,所以要加1,并补齐0 const day String(date…

尚庭公寓(五)

图片上传管理 由于公寓、房间等实体均包含图片信息,所以在新增或修改公寓、房间信息时,需要上传图片,因此我们需要实现一个上传图片的接口。 **1. 图片上传流程** 下图展示了新增房间或公寓时,上传图片的流程。 可以看出图片上传…

深度学习Week21——学习DenseNet算法

文章目录 深度学习Week21——学习DenseNet算法 一、前言 二、我的环境 三、学习DenseNet算法 四、代码复现 4.1 配置数据集 4.2 构建模型 五、模型应用与评估 5.1 编写训练函数 5.2 编写测试函数 5.3 训练模型 5.4 结果可视化 一、前言 🍨 本文为🔗365天…

第一个设计模式——单例模式

目录 一、特点: 二、实现单例模式步骤 三、饿汉式 四、懒汉式 五、双重检查锁 六、静态内部类 七、枚举 八、可能被反序列化和反射破坏什么意思? 九、如何解决呢? 一、特点: 唯一性,单例模式确保程序中只有一…

Qt自定义带前后缀图标的PushButton

写在前面 Qt提供QPushButton不满足带前后缀图标的需求,因此考虑自定义实现带前后缀图标的PushButton,方便后续快速使用。 效果如下: 同时可设置前后缀图标和文本之间间隙: 代码实现 通过前文介绍的Qt样式表底层实现 可以得…

HiveSQL中last_value和first_value函数的应用

概述 今天做一个数据分析,其中有一列数据有些有数据有些没数据,因此我们需要把每数据的进行补充进来因此我们需要使用last_value 函数和over 结合使用,但是遇到一个比较奇葩的问题不能按照预期进行处理。 新说原因: 由于我们要处…

vue3-环境变量-JavaScript-axio-基础使用-lzstring-字符串压缩-python

文章目录 1.Vue3环境变量1.1.简介1.2.全局变量的引用1.3.package.json文件 2.axio2.1.promise2.2.安装2.3.配置2.3.1.全局 axios 默认值2.3.2.响应信息格式 2.4.Axios的拦截器2.4.1.请求拦截器2.4.2.响应拦截器2.4.3.移除拦截器2.4.4.自定义实例添加拦截器 3.lz-string3.1.java…

java项目数据库 mysql 迁移到 达梦

目录 一、下载安装达梦数据库 1、下载 2、解压 3、安装 二、迁移 三、更改SpringBoot 的 yml文件 1、达梦创建用户 2、修改yml 一、下载安装达梦数据库 1、下载 下载地址 https://eco.dameng.com/download/ 点击下载 开发版 (X86平台) , 然后选择操作系统并点击立…

“科技创新‘圳’在变革”2025深圳电子展

电子产业作为现代社会的核心驱动力之一,正以前所未有的速度发展。在这样的背景下,深圳作为中国的经济特区和创新高地,又一次迎来了备受瞩目的盛会——2025深圳电子展览会。本次展览会定于2025年4月9日至11日,在深圳会展中心&#…

剪画小程序:手机提取人声和伴奏

在音乐的海洋中,我们常常渴望更纯粹地感受歌手的嗓音魅力。 如今,有了 剪画,人声分离不再是难题! 想象一下,当您沉浸在一首动人的歌曲中,却希望更清晰地捕捉到歌手声音中的每一个微妙情感。 无论是经典老…

算能端侧 AI 盒子 Stable Diffusion 一秒一张图:AirBox BM1684X

本篇文章聊聊基于 端侧 AI 计算设备,20~30 瓦功耗运行大模型的算能 AirBox。 写在前面 去年的双十二的时候,在群里看到了一张照片,“手掌大小的 NUC”,但是能够跑大模型。 这个草就种下了。 今年 7 月初的时候,在上…

学习008-02-04-09 Assign a Standard Image(分配标准图像)

Assign a Standard Image(分配标准图像) This lesson explains how to associate an entity class with a standard image from the DevExpress.Images assembly. This image illustrates the entity class in the following sections of the UI: 本课介…

C# 知识点总结

入门 C#程序在.NET上运行,.NET framework包含两个部分: ①:.NET framework类库 ②:公共语言运行库CLR(.NET虚拟机) CLS(公共语言规范) CTS(通用类型系统) .N…

ubuntu20.04安装nginx,mysql8,php7.4详细教程,包成功

目录 1.更新索引 2.安装 Nginx 1.安装 Nginx: 2.启动 Nginx 服务并设置为开机自启: 3.开放防火墙的 80 端口: 4.检查 Nginx 是否正常运行: 3.安装 MySQL 8.0 1.首先,安装 MySQL 的仓库: 安装过程中你会看…

RewardBench:Evaluating Reward Models for Language Modeling

Leaderboard: https://hf.co/spaces/allenai/reward-bench Code: https://github.com/allenai/reward-bench Dataset: https://hf.co/datasets/allenai/reward-bench 在人类偏好的强化学习(RLHF)过程中,奖励…

【Vulnhub系列】Vulnhub_Seattle_003靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub_Seattle_003靶场渗透 原文转载已经过授权 原文链接:Lusen的小窝 - 学无止尽,不进则退 (lusensec.github.io) 一、环境准备 1、从百度网盘下载对应靶机的.ova镜像 2、在VM中选择【打开】该.ova 3、选择存储路径&#xff0…