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

基于Python的自然语言处理系列(3):GloVe

        在自然语言处理(NLP)领域,GloVe(Global Vectors for Word Representation)是一种有效的词向量表示方法,与Word2Vec相辅相成。GloVe通过构建词汇的全局共现统计量来生成词向量,这使得它在捕捉词汇之间的语义关系方面非常有效。本篇文章将详细介绍GloVe模型的原理、实现方法及应用场景。

1. GloVe 原理

1.1 GloVe的背景

        GloVe模型由Jeffrey Pennington等人在2014年提出。与Word2Vec的局部上下文窗口方法不同,GloVe通过分析整个语料库中词汇的全局共现信息来生成词向量。其核心思想是:词与词之间的共现概率矩阵可以有效地揭示它们之间的语义关系。

1.2 GloVe的工作原理

        GloVe模型的基本步骤包括:

  1. 构建词汇的共现矩阵:统计每对词汇在语料库中共同出现的次数。
  2. 计算词对的共现概率:根据共现矩阵计算每对词的共现概率。
  3. 优化目标函数:通过最小化词对之间的差异,来学习词向量,使得词向量的内积能够近似共现概率。

2. GloVe 实现

2.1 定义简单数据集

        我们使用一个简单的语料库来演示GloVe模型的实现。

import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt
from collections import Counter# 定义语料库
corpus = ["apple banana fruit", "banana apple fruit", "banana fruit apple","dog cat animal", "cat animal dog", "cat dog animal"]corpus = [sent.split(" ") for sent in corpus]
print(corpus)

2.2 数据预处理

        获取词序列和唯一词汇,并进行数值化处理。

# 获取词序列和唯一词汇
flatten = lambda l: [item for sublist in l for item in sublist]
vocab = list(set(flatten(corpus)))
print(vocab)# 数值化处理
word2index = {w: i for i, w in enumerate(vocab)}
print(word2index)# 词汇表大小
voc_size = len(vocab)
print(voc_size)# 添加UNK标记
vocab.append('<UNK>')
word2index['<UNK>'] = len(word2index)
index2word = {v: k for k, v in word2index.items()}
print(vocab)

2.3 构建共现矩阵

        我们需要统计每对词汇在给定窗口大小内的共现次数。

from collections import defaultdictwindow_size = 1
co_occurrence_matrix = defaultdict(lambda: defaultdict(int))for sentence in corpus:for i, target in enumerate(sentence):context = [sentence[j] for j in range(max(0, i - window_size), min(len(sentence), i + window_size + 1)) if j != i]for ctx in context:co_occurrence_matrix[target][ctx] += 1# 将共现矩阵转化为NumPy数组
def build_co_occurrence_matrix(word2index, co_occurrence_matrix):matrix = np.zeros((len(word2index), len(word2index)))for word1 in co_occurrence_matrix:for word2 in co_occurrence_matrix[word1]:matrix[word2index[word1], word2index[word2]] = co_occurrence_matrix[word1][word2]return matrixco_occurrence_matrix_np = build_co_occurrence_matrix(word2index, co_occurrence_matrix)
print(co_occurrence_matrix_np)

2.4 GloVe模型训练

        GloVe的训练过程包括定义模型、损失函数,并通过优化算法来训练模型。

class GloVe(nn.Module):def __init__(self, vocab_size, embedding_dim, alpha=0.75, x_max=100):super(GloVe, self).__init__()self.alpha = alphaself.x_max = x_maxself.embedding_dim = embedding_dimself.W = nn.Embedding(vocab_size, embedding_dim)self.W_out = nn.Embedding(vocab_size, embedding_dim)def forward(self, target, context, co_occurrence):target_emb = self.W(target)context_emb = self.W_out(context)dot_product = torch.sum(target_emb * context_emb, dim=1)return torch.mean((dot_product - torch.log(co_occurrence + 1e-10)) ** 2)# 初始化模型
embedding_dim = 50
model = GloVe(voc_size, embedding_dim)
optimizer = optim.Adam(model.parameters(), lr=0.01)# 构建训练数据
def generate_training_data(co_occurrence_matrix_np):target = []context = []co_occurrence = []for i, word1 in enumerate(vocab):for j, word2 in enumerate(vocab):if co_occurrence_matrix_np[i, j] > 0:target.append(i)context.append(j)co_occurrence.append(co_occurrence_matrix_np[i, j])return torch.LongTensor(target), torch.LongTensor(context), torch.FloatTensor(co_occurrence)target, context, co_occurrence = generate_training_data(co_occurrence_matrix_np)# 训练模型
epochs = 10
for epoch in range(epochs):model.train()optimizer.zero_grad()loss = model(target, context, co_occurrence)loss.backward()optimizer.step()print(f'Epoch {epoch + 1}/{epochs}, Loss: {loss.item()}')

2.5 可视化结果

        训练完成后,我们可以通过可视化来检查词向量的效果。

def plot_embeddings(model, vocab, index2word):embeddings = model.W.weight.data.numpy()plt.figure(figsize=(10, 10))for i, word in enumerate(vocab):plt.scatter(embeddings[i, 0], embeddings[i, 1])plt.text(embeddings[i, 0], embeddings[i, 1], word, fontsize=9)plt.xlabel('Dimension 1')plt.ylabel('Dimension 2')plt.title('Word Embeddings')plt.show()plot_embeddings(model, vocab, index2word)

结语

        在本篇文章中,我们详细介绍了GloVe模型的原理和实现过程。通过实现GloVe模型,我们能够生成高质量的词向量,这些词向量在许多NLP任务中具有广泛的应用。在下一篇文章中,我们将探讨GloVe的改进和应用,包括如何在实际任务中有效利用这些词向量。敬请期待!

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • “声”临其境:iKF Ultra 降噪耳机,音乐与静谧的完美融合
  • 2024国赛数学建模C题论文:基于优化模型的农作物的种植策略
  • 安防监控/视频汇聚平台EasyCVR无法启动并报错“error while loading shared libraries”,如何解决?
  • Ribbon快速了解
  • 如何在5个步骤中编写更好的ChatGPT提示
  • React Native防止重复点击
  • Prompt - 将图片的表格转换成Markdown
  • Django学习实战篇三(适合略有基础的新手小白学习)(从0开发项目)
  • 关于Hadoop重新格式化之后集群的崩溃问题
  • 服务器禁用远程(22)
  • 龙良曲pytorch笔记14-33
  • vc-align源码分析 -- ant-design-vue系列
  • RHEL 7 安装配置( Linux 网络操作系统 02)
  • 【Qt】实现顶部导航栏自适应滑动效果
  • Linux TCP服务器和客户端学习
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • [deviceone开发]-do_Webview的基本示例
  • 230. Kth Smallest Element in a BST
  • 30秒的PHP代码片段(1)数组 - Array
  • Android 架构优化~MVP 架构改造
  • Apache Pulsar 2.1 重磅发布
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • Git学习与使用心得(1)—— 初始化
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • MaxCompute访问TableStore(OTS) 数据
  • Mithril.js 入门介绍
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • node-glob通配符
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 彻底搞懂浏览器Event-loop
  • 搭建gitbook 和 访问权限认证
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 关于Flux,Vuex,Redux的思考
  • 观察者模式实现非直接耦合
  • 好的网址,关于.net 4.0 ,vs 2010
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 基于HAProxy的高性能缓存服务器nuster
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 移动端 h5开发相关内容总结(三)
  • 7行Python代码的人脸识别
  • Java总结 - String - 这篇请使劲喷我
  • NLPIR智能语义技术让大数据挖掘更简单
  • postgresql行列转换函数
  • Semaphore
  • ​iOS实时查看App运行日志
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (四)模仿学习-完成后台管理页面查询
  • (一) 初入MySQL 【认识和部署】