词嵌入方法(Word Embedding)

news2024/11/13 13:32:58

词嵌入方法(Word Embedding)

Word Embedding是NLP中的一种技术,通过将单词映射到一个空间向量来表示每个单词

✨️常见的词嵌入方法:

  • 🌟Word2Vec:由谷歌提出的方法,分为CBOW(continuous Bag of Words)和Skip-gram两种模型。

  • 🌟Glove:斯坦福大学提出的基于统计的词嵌入方法。

  • 🌟FastText:由Facebook提出的方法,不仅考虑了单词,还考虑了字符。

  • 🌟ELMo(Embeddings from Language Models):基于双向LSTM。

  • 🌟BERT:谷歌提出的基于transformers的词嵌入方法。

Word2Vec

  • CBOW:通过预测上下文(周围的单词)来训练模型。

  • Skip-gram:通过给定一个词,来预测这个单词的上下文。

  • 优点:简单高效,能够捕捉语义关系和特征。

  • 缺点:无法处理多义词,每个单词只有一个向量表示。

 

# 训练Word2Vec模型	
model = Word2Vec(sentences=data, vector_size=100, window=5, min_count=1, workers=4, sg=1)
# 保存模型
model.save("word2vec.model")
  • vector_size=100:指定词向量的维度为 100。这意味着每个词将被表示为一个 100 维的向量。

  • window=5:指定上下文窗口的大小为 5。这意味着在训练过程中,每个词会考虑其前后各 5 个词作为上下文。

  • min_count=1:指定词的最小出现次数。只有出现次数大于或等于 min_count 的词才会被包含在模型中。这里设置为 1,表示所有词都会被包含。

  • workers=4:指定用于训练的并行工作线程数。这里设置为 4,表示使用 4 个线程进行训练。

  • sg=1:指定训练算法。sg=1 表示使用 Skip-gram 算法,sg=0 表示使用 CBOW(Continuous Bag of Words)算法。

♨️执行完上面的代码后,本地生成了 3 个文件:

  1. word2vec.model:主模型文件,包含了模型的参数、词汇表等信息。不仅存储了模型的架构信息,还包括了词汇频率、模型训练状态等。

  2. word2vec.model.wv.vectors.npy:这个文件存储了模型中所有词汇的词向量。

  3. word2vec.model.syn1neg.npy:这个文件存储的是训练过程中使用的负采样权重。

Glove

  • 基于全局统计的模型,通过矩阵分解的方法训练词向量,在Word2Vec的基础上进一步优化,以更好地捕捉词语之间的语义关系

  • 优点:利用全局实现矩阵,更好地捕捉全局统计信息

  • 缺点:离线训练,无法动态更新词向量。

✨️FastText

  • 扩展了Word2Vec的思路,考虑了词内的字符n-gram(“apple” 和“apples”)。

  • 优点:能处理未登录词问题(训练时未出现,测试时出现了的单词),对拼写错误和变形更加友好。

  • 缺点:训练时间和存储压力大。

  • 未登录词的嵌入向量是通过对其所有子词 n-gram 的嵌入向量进行平均或求和得到的

import fasttext
model1 = fasttext.train_unsupervised('data/fil9') 
model = fasttext.load_model("data/fil9.bin")
# 获取对应词向量
model.get_word_vector("the")

✨️ELMo

  • ELMo在传统静态word embedding方法(Word2Vec, GloVe)的基础上提升了很多, 但是依然存在缺陷, 有很大的改进余地

  • 缺点在于特征提取器的选择上, ELMo使用了双向双层LSTM, 而不是现在横扫千军的Transformer, 在特征提取能力上是要弱一些

  • ELMo选用双向拼接的方式进行特征融合, 这种方法不如BERT一体化的双向提取特征好

 

🔎ELMo分三个主要模块:

  • 最底层黄色标记的Embedding模块.

  • 中间层蓝色标记的两部分双层LSTM模块.

  • 最上层绿色标记的词向量表征模块.

ELMo最底层的词嵌入采用CNN对字符级进行编码, 本质就是获得一个静态的词嵌入向量作为网络的底层输入

ELMo模型是个根据当前上下文对word embedding动态调整的语言模型

🫧BERT

  • 基于Transformer架构,通过Mask任务和双向编码器实现词嵌入。

  • 性能先进,捕捉了丰富的上下文信息。

通过预训练, 加上Fine-tunning, 在11项NLP任务上取得最优结果,BERT的根基源于Transformer, 相比传统RNN更加高效, 可以并行化处理同时能捕捉长距离的语义和结构依赖,BERT采用了Transformer架构中的Encoder模块, 不仅仅获得了真正意义上的bidirectional context, 而且为后续微调任务留出了足够的调整空间。

🫧BERT的MLM任务中为什么采用了80%, 10%, 10%的策略?

  • 首先, 如果所有参与训练的token被100%的[MASK], 那么在fine-tunning的时候所有单词都是已知的, 不存在[MASK], 那么模型就只能根据其他token的信息和语序结构来预测当前词, 而无法利用到这个词本身的信息, 因为它们从未出现在训练过程中, 等于模型从未接触到它们的信息, 等于整个语义空间损失了部分信息. 采用80%的概率下应用[MASK], 既可以让模型去学着预测这些单词, 又以20%的概率保留了语义信息展示给模型.

  • 保留下来的信息如果全部使用原始token, 那么模型在预训练的时候可能会偷懒, 直接照抄当前token信息. 采用10%概率下random token来随机替换当前token, 会让模型不能去死记硬背当前的token, 而去尽力学习单词周边的语义表达和远距离的信息依赖, 尝试建模完整的语言信息.

  • 最后再以10%的概率保留原始的token, 意义就是保留语言本来的面貌, 让信息不至于完全被遮掩, 使得模型可以"看清"真实的语言面貌

🥇BERT预训练模型所接收的最大sequence长度是512,对于长文本(文本长度超过512的句子), 就需要特殊的方式来构造训练样本. 核心就是如何进行截断:

  • head-only方式: 只保留长文本头部信息的截断方式, 具体为保存前510个token (要留两个位置给[CLS]和[SEP]).

  • tail-only方式: 只保留长文本尾部信息的截断方式, 具体为保存最后510个token (要留两个位置给[CLS]和[SEP]).

  • head+only方式: 选择前128个token和最后382个token (文本总长度在800以内), 或者前256个token和最后254个token (文本总长度大于800)

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

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

相关文章

2024下半年系统架构师考试【回忆版】

2024年11月10日,系统架构师考试如期举行,屡战屡败的参试倒是把北京的学校转了好几所。 本次考试时间 考试科目考试时间综合知识、案例分析8:30 - 12:30论文14:30 - 16:30 案例分析 1、RESTful 对于前后端的优势; 2、心跳相对于ping/echo的…

最简单解决NET程序员在centos系统安装c#网站

目前随着技术栈转移,c#程序员如何在linux服务器中部署net程序呢? 我做了一次实验:一般来说runtime和sdk都要装。 1.centos系统内命令行输入命令 sudo yum install dotnet-sdk-6.0 安装6.0版 2.检测下是否成功:dotnet --versio…

参数估计理论

估计理论的主要任务是在某种信号假设下,估算该信号中某个参数(比如幅度、相位、达到时间)的具体取值。 参数估计:先假定研究的问题具有某种数学模型, 如正态分布,二项分布,再用已知类别的学习样…

java多线程stop() 和 suspend() 方法为何不推荐使用?

大家好,我是锋哥。今天分享关于【java多线程stop() 和 suspend() 方法为何不推荐使用?】面试题。希望对大家有帮助; java多线程stop() 和 suspend() 方法为何不推荐使用? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网…

嵌入式硬件电子电路设计(三)电源电路之负电源

引言:在对信号线性度放大要求非常高的应用需要使用双电源运放,比如高精度测量仪器、仪表等;那么就需要给双电源运放提供正负电源。 目录 负电源电路原理 负电源的作用 如何产生负电源 负电源能作功吗? 地的理解 负电压产生电路 BUCK电…

C++高级编程(8)

八、标准IO库 1.输入输出流类 1)非格式化输入输出 2)put #include <iostream> #include <string> ​ using namespace std; int main() {string str "123456789";for (int i str.length() - 1; i > 0; i--) {cout.put(str[i]); //从最后一个字符开…

Python 分子图分类,GNN Model for HIV Molecules Classification,HIV 分子图分类模型;整图分类问题,代码实战

一、分子图 分子图&#xff08;molecular graph&#xff09;是一种用来表示分子结构的图形方式&#xff0c;其中原子被表示为节点&#xff08;vertices&#xff09;&#xff0c;化学键被表示为边&#xff08;edges&#xff09;。对于HIV&#xff08;人类免疫缺陷病毒&#xff…

如何调整pdf的页面尺寸

用福昕阅读器打开pdf&#xff0c;进入打印页面&#xff0c;选择“属性”&#xff0c;在弹出的页面选择“高级” 选择你想调成的纸张尺寸&#xff0c;然后打印&#xff0c;打印出来的pdf就是调整尺寸后的pdf

查缺补漏----用户上网过程(HTTP,DNS与ARP)

&#xff08;1&#xff09;HTTP 来自湖科大计算机网络微课堂&#xff1a; ① HTTP/1.0采用非持续连接方式。在该方式下&#xff0c;每次浏览器要请求一个文件都要与服务器建立TCP连接当收到响应后就立即关闭连接。 每请求一个文档就要有两倍的RTT的开销。若一个网页上有很多引…

koa、vue安装与使用

koa官网&#xff1a;https://koajs.com/ 首选创建一个文件夹&#xff1a;mkdir koaDemo (cmd即可) 文件夹初始化&#xff1a;npm init (cmd即可) 初始化完成后就会产生一个package.json的文件。 安装&#xff1a; npm install koa --save (vscode的控制台中安装&a…

Linux:版本控制器git的简单使用+gdb/cgdb调试器的使用

一&#xff0c;版本控制器git 1.1概念 为了能够更方便我们管理不同版本的文件&#xff0c;便有了版本控制器。所谓的版本控制器&#xff0c;就是能让你 了解到⼀个文件的历史&#xff0c;以及它的发展过程的系统。通俗的讲就是⼀个可以记录工程的每⼀次改动和版本迭代的⼀个…

ML 系列:第 21 节 — 离散概率分布(二项分布)

一、说明 二项分布描述了在固定数量的独立伯努利试验中一定数量的成功的概率&#xff0c;其中每个试验只有两种可能的结果&#xff08;通常标记为成功和失败&#xff09;。 二、探讨伯努利模型 例如&#xff0c;假设您正在抛一枚公平的硬币 &#xff08;其中正面成功&#xff…

【优选算法篇】微位至简,数之恢宏——解构 C++ 位运算中的理与美

文章目录 C 位运算详解&#xff1a;基础题解与思维分析前言第一章&#xff1a;位运算基础应用1.1 判断字符是否唯一&#xff08;easy&#xff09;解法&#xff08;位图的思想&#xff09;C 代码实现易错点提示时间复杂度和空间复杂度 1.2 丢失的数字&#xff08;easy&#xff0…

存算分离与计算向数据移动:深度解析与Java实现

背景 随着大数据时代的到来&#xff0c;数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构&#xff0c;即计算资源与存储资源紧密耦合&#xff0c;在处理海量数据时逐渐显露出其局限性。为了应对这些挑战&#xff0c;存算分离&#xff08;Disaggrega…

WPS单元格重复值提示设置

选中要检查的所有的单元格 设置提示效果 当出现单元格值重复时&#xff0c;重复的单元格就会自动变化 要修改或删除&#xff0c;点击

Linux笔记之pandoc实现各种文档格式间的相互转换

Linux笔记之pandoc实现各种文档格式间的相互转换 code review! 文章目录 Linux笔记之pandoc实现各种文档格式间的相互转换1.安装 Pandoc2.Word转Markdown3.markdown转html4.Pandoc 支持的一些常见格式4.1.输入格式4.2.输出格式 1.安装 Pandoc sudo apt-get install pandoc # …

MySQL重难点(一)索引

目录 一、引子&#xff1a;MySQL与磁盘间的交互基本单元&#xff1a;Page 1、重要问题&#xff1a;为什么 MySQL 每次与磁盘交互&#xff0c;都要以 16KB 为基本单元&#xff1f;为什么不用多少加载多少&#xff1f; 2、有关MySQL的一些共识 3、如何管理 Page 3.1 单个 P…

solo博客使用非docker方式进行https部署

solo博客使用非docker方式进行https部署 数据库配置启动命令讲解设置自定义访问端口&#xff1a;9168 配置https访问部署效果 服务器上请通过 Docker 部署。但是我服务器资源有限&#xff0c;不想安装docker&#xff0c;直接以编译包的形式运行&#xff0c;节省资源。 如果不会…

【Steam登录】protobuf协议逆向 | 续

登录接口&#xff1a; ‘https://api.steampowered.com/IAuthenticationService/BeginAuthSessionViaCredentials/v1’ 精准定位&#xff0c;打上条件断点 this.CreateWebAPIURL(t) ‘https://api.steampowered.com/IAuthenticationService/BeginAuthSessionViaCredentials/v1…

环形链表问题(图 + 证明 + 题)

文章目录 判断链表是否有环返回链表开始入环的第一个结点 判断链表是否有环 题目链接 思路&#xff1a; 可以明确的是&#xff1a;若一个链表带环&#xff0c;那么用指针一直顺着链表遍历&#xff0c;最终会回到某个地方。 我们可以定义两个指针&#xff08;快慢指针&#xf…