当前位置: 首页 > news >正文

【自然语言处理】词嵌入模型

词嵌入(Word Embedding) 是一种将词汇表示为实数向量的技术,通常是低维度的连续向量。这些向量被设计为捕捉词汇之间的语义相似性,使得语义相似的词在嵌入空间中的距离也更近。词嵌入可以看作是将离散的语言符号(如单词、短语)映射到向量空间,从而在一定程度上解决了自然语言处理中的语义表示问题。

简单来说,词嵌入就是一种将词汇转换成向量的方法,使得计算机能够理解词与词之间的关系,并在不同的NLP任务(如文本分类、机器翻译、问答系统等)中表现出色。

一、词嵌入的动机和重要性

自然语言中的单词本质上是离散的符号,对于计算机来说,直接处理这些符号是困难的。传统的词表示方法(如词袋模型(Bag of Words)TF-IDF等)会导致词与词之间的相互关系无法捕捉到,例如“king”和“queen”这两个词虽然表示不同的对象,但在某种语义上有相似性。

词嵌入技术通过以下方式克服这些问题:

  • 密集表示:将单词表示为低维的密集向量(例如100维或300维),而不是像词袋模型那样的高维稀疏向量。
  • 语义信息捕捉:相似的词(如“king”和“queen”)在向量空间中靠得更近。
  • 可用于神经网络:词嵌入作为向量输入,能够直接用于神经网络模型(如RNN、LSTM、Transformer)进行下游的NLP任务。

二、词嵌入的表示形式

  • One-hot表示:在早期,单词通常以one-hot编码表示。词汇表中的每个单词用一个长度为词汇表大小的向量表示,在向量中,目标单词的位置为1,其余位置为0。这种表示无法捕捉单词之间的语义相似性,且向量维度非常高。

    例如,假设词汇表包含 [“dog”, “cat”, “mouse”, “king”, “queen”],那么 “dog” 的 one-hot 表示是:

    [1, 0, 0, 0, 0]
    
  • 词嵌入表示:与one-hot不同,词嵌入将单词映射到低维实数向量。这个向量表示捕捉到了词汇的语义关系和上下文特性,例如,通过预训练的词嵌入,模型会“知道” “king” 和 “queen” 是相似的,因为它们的向量距离较近。

    例如,“dog” 的词嵌入可能是:

    [0.13, -0.24, 0.65, ... , 0.42]
    

三、常见的词嵌入技术

  1. Word2Vec

    • Word2Vec 是最早成功应用于词嵌入学习的技术之一,由谷歌在2013年推出。它使用浅层神经网络,将单词映射到向量空间,捕捉词汇的语义相似性。
    • Word2Vec 有两种模型:CBOW(连续词袋模型)和 Skip-gram。CBOW根据上下文词预测目标词,Skip-gram则根据目标词预测上下文。

    优点

    • 能够高效地学习到低维度且能捕捉语义关系的词向量。
    • 适用于大规模无监督文本数据。

    缺点

    • 对于词汇的不同含义(如“bank”既可以指银行,也可以指河岸),它无法根据上下文进行区分。
  2. GloVe

    • GloVe (Global Vectors for Word Representation) 是斯坦福大学提出的另一种词嵌入方法。它通过构建词汇共现矩阵并进行矩阵分解,生成词向量。它的目标是捕捉全局的语义信息,而不仅仅是局部上下文。

    优点

    • GloVe捕捉全局语义信息,能够更好地反映词与词之间的统计关系。
    • 提供了丰富的预训练模型(如Common Crawl和Wikipedia上训练的模型),可以在各种NLP任务中直接使用。
  3. FastText

    • FastText 是Facebook提出的改进版Word2Vec,能够生成单词的子词级别嵌入。例如,FastText能够将词分解为多个n-gram(如“apple”可以分解为 “app”, “ple”),然后为这些n-gram生成向量。这使得FastText在处理稀有词或拼写错误时表现更好。

    优点

    • 能够处理未见词(Out-of-Vocabulary, OOV)问题,因为它可以生成单词的子词嵌入。
    • 适合多语言和拼写错误的文本处理场景。
  4. ELMo

    • ELMo (Embeddings from Language Models) 是一个上下文相关的词嵌入模型。与Word2Vec不同,ELMo可以根据不同的上下文为同一个词生成不同的嵌入向量。例如,词“bank”在“银行”和“河岸”这两种不同的上下文中会有不同的词向量。
    • ELMo基于双向LSTM,通过联合语言模型的方式,结合上下文信息生成词向量。

    优点

    • 能够根据上下文动态调整词的表示,克服了Word2Vec静态词嵌入的问题。
    • 在NLP任务中表现优秀,尤其是在句子级别的任务上。
  5. BERT

    • BERT (Bidirectional Encoder Representations from Transformers) 是基于Transformer架构的预训练语言模型。BERT能够捕捉到单词的双向上下文信息,这意味着它不仅考虑当前单词的前后文,而且能够生成动态的词嵌入。与ELMo相似,BERT的词嵌入是上下文相关的,但BERT的架构(Transformer)使得它更强大。
    • BERT的预训练任务包括掩码语言模型(MLM)和下一个句子预测(NSP),通过这两项任务使得它在各种NLP任务中表现优异。

    优点

    • 动态的词嵌入可以根据上下文生成最符合语义的词向量。
    • 在多个NLP任务(如问答、机器翻译、文本分类)中达到了最新的性能记录。

四、词嵌入的应用场景

词嵌入的主要优势在于其能够捕捉单词之间的语义相似性,并为许多NLP任务提供有力支持。以下是一些常见的应用场景:

  1. 文本分类

    • 在情感分析、垃圾邮件检测、主题分类等任务中,词嵌入可以作为输入特征,为神经网络模型(如CNN、LSTM)提供丰富的语义信息。
  2. 信息检索

    • 词嵌入帮助提高搜索系统的性能,通过嵌入空间中的语义相似性,用户查询词可以与文档中的内容更好地匹配。
  3. 机器翻译

    • 词嵌入能够捕捉不同语言中的语义关系,帮助机器翻译系统生成更符合语义的翻译结果。
  4. 命名实体识别(NER)

    • 词嵌入在命名实体识别任务中用于表示输入的单词特征,结合上下文信息帮助模型识别出人名、地名、公司名等实体。
  5. 问答系统

    • 在问答系统中,词嵌入帮助模型理解用户问题中的词语语义,并从知识库中找到最合适的答案。
  6. 推荐系统

    • 词嵌入可以用于推荐系统,将用户的文本评论或搜索词转换为语义向量,从而为用户推荐相关的产品或内容。

五、Tokenizer(分词器)

Tokenizer 是将原始文本(通常是句子或段落)**转换为可处理的离散单词或子词单位(token)**的过程。每个 token 通常表示文本中的一个单词、子词甚至字符。Tokenizer 的主要作用是将自然语言的字符串转换为模型能够理解的数值输入形式。

特点:
  • 文本到token映射:Tokenizer的工作是将文本数据(字符串形式)分割为更小的单位,即 token。通常每个 token 对应于词汇表中的一个索引(整数),这些索引被输入到模型中。
  • 词汇表:Tokenizer基于一个词汇表(vocabulary),这个词汇表定义了所有可以被模型处理的单词或子词。当遇到词汇表之外的单词时,通常会有一种机制来处理,比如用特殊的未知词符 [UNK] 表示。
  • 子词分词(如BPE、WordPiece):一些模型(如BERT、GPT)使用子词级别的tokenization,将单词拆分为多个子词单位,从而有效处理未见词(OOV)问题。例如,“playing” 可以被拆分为 “play” 和 “##ing”。
例子:

假设有如下句子:

sentence = "I love playing football."

使用 Tokenizer 后,这个句子可能会被分词为:

tokens = ["I", "love", "playing", "football", "."]

再进一步转换为索引(假设词汇表中每个单词有对应的ID):

token_ids = [101, 2000, 2030, 2079, 102]

这些 token ids 会被输入到模型中。

词嵌入和 Tokenizer 的工作流程
  • 文本 -> TokenizerTokenizer 是文本处理的第一步,用于将原始文本转换为 token(或词汇表中的索引)。这个步骤是模型的基础输入准备步骤。
  • Token -> 词嵌入词嵌入 是将 token(离散索引表示)转换为实数向量。它是模型中的输入层之一,用于将离散的单词或 token 映射为可以处理的连续向量。

六、Word2Vec + LSTM 代码举例

以下是使用 Word2Vec 词嵌入与 LSTM 网络进行文本分类的完整代码。

import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
from nltk.tokenize import word_tokenize
from sklearn.model_selection import train_test_split
from gensim.models import Word2Vec
import nltknltk.download('punkt')# 示例数据集
data = [("I love programming and coding.", "positive"),("Python is an amazing language.", "positive"),("I hate bugs in the code.", "negative"),("Debugging is so frustrating.", "negative"),("Machine learning is fascinating.", "positive"),("I don't like syntax errors.", "negative")
]# 提取文本和标签
sentences = [text for text, label in data]
labels = [1 if label == "positive" else 0 for text, label in data]# 分词
tokenized_sentences = [word_tokenize(sentence.lower()) for sentence in sentences]# 训练 Word2Vec 模型
word2vec_model = Word2Vec(sentences=tokenized_sentences, vector_size=100, window=5, min_count=1, workers=4)# 为单词构建词汇表并映射单词到索引
vocab = {word: index for index, word in enumerate(word2vec_model.wv.index_to_key)}
vocab_size = len(vocab)# 将每个句子转换为索引序列
def sentence_to_indices(sentence, vocab):return [vocab[word] for word in word_tokenize(sentence.lower()) if word in vocab]# 将句子转换为索引序列
X_indices = [sentence_to_indices(sentence, vocab) for sentence in sentences]# 找出最长句子长度,确保所有输入有相同长度
max_length = max(len(seq) for seq in X_indices)# 填充句子,使得它们长度一致(填充0)
def pad_sequence(seq, max_length):padded = np.zeros(max_length, dtype=int)padded[:len(seq)] = seqreturn paddedX_padded = np.array([pad_sequence(seq, max_length) for seq in X_indices])
y = np.array(labels)# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_padded, y, test_size=0.2, random_state=42)# 将数据转换为 PyTorch 张量
X_train_tensor = torch.tensor(X_train, dtype=torch.long)
X_test_tensor = torch.tensor(X_test, dtype=torch.long)
y_train_tensor = torch.tensor(y_train, dtype=torch.long)
y_test_tensor = torch.tensor(y_test, dtype=torch.long)# 生成嵌入矩阵,大小为 (vocab_size, vector_size)
embedding_matrix = np.zeros((vocab_size, word2vec_model.vector_size))
for word, index in vocab.items():embedding_matrix[index] = word2vec_model.wv[word]# 将嵌入矩阵转换为 PyTorch 张量
embedding_tensor = torch.tensor(embedding_matrix, dtype=torch.float32)# 定义 LSTM 模型,使用 Word2Vec 词嵌入
class LSTMClassifier(nn.Module):def __init__(self, embedding_matrix, hidden_size, output_size, num_layers, trainable=False):super(LSTMClassifier, self).__init__()vocab_size, embedding_dim = embedding_matrix.shapeself.embedding = nn.Embedding.from_pretrained(embedding_matrix, freeze=not trainable)self.lstm = nn.LSTM(embedding_dim, hidden_size, num_layers, batch_first=True)self.fc = nn.Linear(hidden_size, output_size)def forward(self, x):embedded = self.embedding(x)_, (hn, _) = self.lstm(embedded)out = self.fc(hn[-1])return out# 定义超参数
input_size = word2vec_model.vector_size  # Word2Vec 生成的词向量维度
hidden_size = 128  # LSTM 隐藏层大小
output_size = 2  # 二分类问题
num_layers = 1  # LSTM 层数
learning_rate = 0.001
num_epochs = 10# 初始化模型、损失函数和优化器
model = LSTMClassifier(embedding_tensor, hidden_size, output_size, num_layers, trainable=False)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)# 训练模型
for epoch in range(num_epochs):model.train()outputs = model(X_train_tensor)loss = criterion(outputs, y_train_tensor)optimizer.zero_grad()loss.backward()optimizer.step()print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}")# 测试模型
model.eval()
with torch.no_grad():test_outputs = model(X_test_tensor)_, predicted = torch.max(test_outputs, 1)accuracy = (predicted == y_test_tensor).sum().item() / len(y_test_tensor)print(f"测试集准确率: {accuracy:.4f}")

相关文章:

【自然语言处理】词嵌入模型

词嵌入(Word Embedding) 是一种将词汇表示为实数向量的技术,通常是低维度的连续向量。这些向量被设计为捕捉词汇之间的语义相似性,使得语义相似的词在嵌入空间中的距离也更近。词嵌入可以看作是将离散的语言符号(如单词…...

了解针对基座大语言模型(类似 ChatGPT 的架构,Decoder-only)的重头预训练和微调训练

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 随着自然语言处理(NLP)技术的飞速进步,基于 Transformer 架构的大语言模型在众多任务中取得了显著成就。特别是 Decoder-only 架构,如 GPT 系列模型&…...

cmake如何在编译时区分-std=c++17和-std=gnu++17?检查宏

如何在编译时区分-stdc17和-stdgnu17&#xff1f;检查宏&#xff1f;-腾讯云开发者社区-腾讯云 我正在使用__int128扩展的g。-stdc17的问题是&#xff0c;一些C库不具备对该扩展的全部支持(即std::make_unsigned<>失败)。当使用-stdgnu17时&#xff0c;它工作得很好。 我…...

速通数据结构与算法第七站 排序

系列文章目录 速通数据结构与算法系列 1 速通数据结构与算法第一站 复杂度 http://t.csdnimg.cn/sxEGF 2 速通数据结构与算法第二站 顺序表 http://t.csdnimg.cn/WVyDb 3 速通数据结构与算法第三站 单链表 http://t.csdnimg.cn/cDpcC 4 速通…...

灵当CRM index.php接口SQL注入漏洞复现 [附POC]

文章目录 灵当CRM index.php接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 灵当CRM index.php接口SQL注入漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技…...

修复: Flux女生脸不再油光满面, 屁股下巴 -- 超实用Comfyui小技巧

ComfyUI上目前最强画图模型公认为Flux. 初次用Flux基础模型画真实的女生时, 和SD比起来, 会觉得画出来细节更多, 更真实. 但是当画多了, 就会觉得画出来的女生总是似曾相识. 仔细观察, 会发现一些共同的特征. 人偏老气, 像30~50的女生. 改了提示词也效果不大. 颧骨凸起, 嘴…...

Actions Speak Louder than Words Meta史诗级的端到端推荐大模型落地

发现好久之前整理的推荐系统被遗忘在了草稿箱&#xff0c;让它出来见见世面。。。后续空了持续更新 文章目录 1.Background2.Related works2.1 典型推荐模型2.1.1 DIN2.1.2 DIEN2.1.3 SIM2.1.4 MMoE2.1.5 其他 2.2. 生成式推荐 3.Method3.1 统一特征空间3.2 重塑召回排序模型3.…...

金智维KRPA之Excel自动化

Excel自动化操作概述 Excel自动化主要用于帮助各种类型的企业用户实现Excel数据处理自动化&#xff0c;Excel自动化是可以从单元格、列、行或范围中读取数据&#xff0c;向其他电子表格或工作簿写入数据等活动。 通过相关命令&#xff0c;还可以对数据进行排序、进行格式…...

哪款宠物空气净化器能有效去除浮毛?希喂、352实测分享

你是否曾经站在家电卖场里&#xff0c;面对琳琅满目的宠物空气净化器产品而感到无所适从&#xff1f;或者在浏览网上商城时&#xff0c;被海量的参数和功能描述搞得头晕眼花&#xff1f;别担心&#xff0c;你不是一个人。在这个科技飞速发展的时代&#xff0c;选择一台既能满足…...

2024.9.28更换启辰R30汽车火花塞

2024.9.28周六汽车跑了11万公里&#xff0c;实在加速肉&#xff0c;起步顿挫&#xff0c;油耗在8个&#xff0c;决定更换火花塞。第一个火花塞要拆掉进气歧管。第二和第三个可以直接换。打开第二个火花塞一看电极都被打成深坑&#xff0c;针电极都被打凸。我有两个旧的火花塞&a…...

2024上海网站建设公司哪家比较好TOP3

判断一家网建公司的好坏&#xff0c;第一是看公司背景&#xff0c;包括成立时间&#xff0c;工商注册信息等&#xff0c;第二可以去看看建站公司做的案例&#xff0c;例如&#xff0c;网站开发、设计、引流等等的以往案例&#xff0c;了解清楚具体的业务流程。 一、公司背景 …...

TDesign组件库+vue3+ts 如何视觉上合并相同内容的table列?(自定义合并table列)

背景 当table的某一列的某些内容相同时&#xff0c;需要在视觉上合并这一部分的内容为同个单元格 如上图所示&#xff0c;比如需要合并当申请人为同个字段的列。 解决代码 <t-table:data"filteredData":columns"columns":rowspan-and-colspan"…...

BACnet协议-(基于ISO 8802-3 UDP)(2)

1、模拟设备的工具界面如下&#xff1a; 2、使用yet another bacnet explorer 用作服务&#xff0c;用于发现设备&#xff0c;界面如下&#xff1a; 3、通过wireshark 抓包如下&#xff1a; &#xff08;1&#xff09;、整体包如下&#xff1a; &#xff08;2&#xff09;、m…...

android 根据公历日期准确节气计算年月日时天干地支 四柱八字

1 年柱 判断当前日期是否超过本年的立春 未超过年份-1 已超过按当前年份计算 2月柱 当前日期是否超过当月的第一个节气 未超过-1 超过当前月份计算 节气对日柱时柱没影响。 获取某年某月第一个节气的准确日期 private int sTerm(int y, int n) {int[] sTermInfo…...

VMware虚拟机连接公网,和WindTerm

一、项目名称 vmware虚拟机连接公网和windterm 二、项目背景 需求1&#xff1a;windows物理机&#xff0c;安装了vmware虚拟机&#xff0c;需要访问公网资源&#xff0c;比如云服务商的yum仓库&#xff0c;国内镜像加速站的容器镜像&#xff0c;http/https资源。 需求2&#xf…...

游戏盾SDK真的能无视攻击吗

游戏盾SDK真的能无视攻击吗&#xff1f;在当今的互联网环境中&#xff0c;游戏行业蓬勃发展&#xff0c;但同时也面临着日益严峻的安全挑战。DDoS攻击、CC攻击、外挂作弊等恶意行为频发&#xff0c;不仅威胁着游戏的稳定性和公平性&#xff0c;也严重影响了玩家的游戏体验。为了…...

【QT】亲测有效:“生成的目标文件包含了过多的段,超出了编译器或链接器允许的最大数量”错误的解决方案

在使用dlib开发人脸对齐功能时&#xff0c;出现了”生成的目标文件包含了过多的段&#xff0c;超出了编译器或链接器允许的最大数量的错误“。 主要功能代码如下&#xff1a; #include <QApplication> #include <QImage> #include <QDebug>#include <dlib…...

什么是 Apache Ingress

Apache Ingress 主要用于管理来自外部的 HTTP 和 HTTPS 流量&#xff0c;并将其路由到合适的 Kubernetes 服务。 容器化与 Kubernetes 是现代云原生应用程序的基础。Kubernetes 的主要职责是管理容器集群&#xff0c;确保它们的高可用性和可扩展性&#xff0c;同时还提供自动化…...

SpringBoot助力墙绘艺术市场创新

3 系统分析 当用户确定开发一款程序时&#xff0c;是需要遵循下面的顺序进行工作&#xff0c;概括为&#xff1a;系统分析–>系统设计–>系统开发–>系统测试&#xff0c;无论这个过程是否有变更或者迭代&#xff0c;都是按照这样的顺序开展工作的。系统分析就是分析系…...

Antlr的使用

概念 ANTLR&#xff08;ANother Tool for Language Recognition&#xff09;是一个强大的解析器生成工具&#xff0c;用于读取、处理、执行或翻译结构化文本或二进制文件。ANTLR通过定义文法&#xff08;grammar&#xff09;来识别、构建和访问语言中的元素。 ANTLR为包括Jav…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...