【自然语言处理(NLP)】生成词向量:GloVe(Global Vectors for Word Representation)原理及应用
文章目录
- 介绍
- GloVe 介绍
- 核心思想
- 共现矩阵
- 1. 共现矩阵的定义
- 2. 共现概率矩阵的定义
- 3. 共现概率矩阵的意义
- 4. 共现概率矩阵的构建步骤
- 5. 共现概率矩阵的应用
- 6. 示例
- 7. 优缺点
- 优点
- 缺点
- **总结**
- 目标函数
- 训练过程
- 使用预训练的GloVe词向量
- 优点
- 应用
- 总结
个人主页:道友老李
欢迎加入社区:道友老李的学习社区
介绍
**自然语言处理(Natural Language Processing,NLP)**是计算机科学领域与人工智能领域中的一个重要方向。它研究的是人类(自然)语言与计算机之间的交互。NLP的目标是让计算机能够理解、解析、生成人类语言,并且能够以有意义的方式回应和操作这些信息。
NLP的任务可以分为多个层次,包括但不限于:
- 词法分析:将文本分解成单词或标记(token),并识别它们的词性(如名词、动词等)。
- 句法分析:分析句子结构,理解句子中词语的关系,比如主语、谓语、宾语等。
- 语义分析:试图理解句子的实际含义,超越字面意义,捕捉隐含的信息。
- 语用分析:考虑上下文和对话背景,理解话语在特定情境下的使用目的。
- 情感分析:检测文本中表达的情感倾向,例如正面、负面或中立。
- 机器翻译:将一种自然语言转换为另一种自然语言。
- 问答系统:构建可以回答用户问题的系统。
- 文本摘要:从大量文本中提取关键信息,生成简短的摘要。
- 命名实体识别(NER):识别文本中提到的特定实体,如人名、地名、组织名等。
- 语音识别:将人类的语音转换为计算机可读的文字格式。
NLP技术的发展依赖于算法的进步、计算能力的提升以及大规模标注数据集的可用性。近年来,深度学习方法,特别是基于神经网络的语言模型,如BERT、GPT系列等,在许多NLP任务上取得了显著的成功。随着技术的进步,NLP正在被应用到越来越多的领域,包括客户服务、智能搜索、内容推荐、医疗健康等。
GloVe 介绍
GloVe(Global Vectors for Word Representation)是一种用于获取词向量的无监督学习算法,由斯坦福大学的Jeffrey Pennington、Richard Socher和Christopher D. Manning于2014年提出。GloVe通过结合全局统计信息和局部上下文信息来生成词向量,旨在捕捉词语之间的语义关系。
核心思想
GloVe的核心思想是利用词与词之间的共现概率来捕捉语义信息。具体来说,GloVe通过构建一个共现矩阵(co-occurrence matrix)来记录词语在语料库中共同出现的频率。然后,通过优化一个目标函数,使得词向量能够反映这些共现关系。
共现矩阵
共现概率矩阵(Co-occurrence Probability Matrix)是自然语言处理中用于捕捉词语之间关系的一种重要工具。它记录了词语在特定上下文窗口中共同出现的频率或概率,是许多词向量模型(如GloVe)的基础。
1. 共现矩阵的定义
共现矩阵 X X X 是一个 V × V V \times V V×V 的矩阵,其中 V V V 是词汇表的大小。矩阵中的每个元素 X i j X_{ij} Xij 表示词语 i i i 和词语 j j j 在某个上下文窗口内共同出现的次数。
- 上下文窗口:通常定义一个固定大小的窗口(例如,窗口大小为5表示当前词左右各5个词的范围),统计词语在这个窗口内共同出现的次数。
- 对称性:共现矩阵通常是对称的,即 X i j = X j i X_{ij} = X_{ji} Xij=Xji,因为词语 i i i 和 j j j 共同出现的次数与词语 j j j 和 i i i 共同出现的次数相同。
2. 共现概率矩阵的定义
共现概率矩阵是在共现矩阵的基础上,将共现次数转化为概率。具体来说,共现概率矩阵 P P P 中的每个元素 P i j P_{ij} Pij 表示词语 j j j 在词语 i i i 的上下文中出现的条件概率:
P i j = P ( j ∣ i ) = X i j X i P_{ij} = P(j|i) = \frac{X_{ij}}{X_i} Pij=P(j∣i)=XiXij
其中:
- X i j X_{ij} Xij 是词语 i i i 和词语 j j j 共同出现的次数。
- X i = ∑ k = 1 V X i k X_i = \sum_{k=1}^{V} X_{ik} Xi=∑k=1VXik 是词语 i i i 与所有其他词语共同出现的总次数。
3. 共现概率矩阵的意义
共现概率矩阵的核心思想是通过词语之间的共现概率来捕捉语义关系。例如:
- 如果 P i j P_{ij} Pij 很高,说明词语 j j j 经常出现在词语 i i i 的上下文中,两者可能有较强的语义关联。
- 如果 P i j P_{ij} Pij 很低,说明词语 j j j 很少出现在词语 i i i 的上下文中,两者可能没有明显的语义关联。
通过分析共现概率矩阵,可以发现词语之间的语义相似性、类比关系(如“国王-男人+女人=女王”)等。
4. 共现概率矩阵的构建步骤
- 定义词汇表:从语料库中提取所有唯一的词语,构建词汇表 V V V。
- 定义上下文窗口:选择一个固定大小的窗口(例如,窗口大小为5)。
- 统计共现次数:遍历语料库,统计每对词语在窗口内共同出现的次数,填充共现矩阵 X X X。
- 计算共现概率:对共现矩阵 X X X 进行归一化,计算共现概率矩阵 P P P。
5. 共现概率矩阵的应用
共现概率矩阵是许多词向量模型的基础,例如:
- GloVe:利用共现概率矩阵来优化词向量,使得词向量能够反映词语之间的共现关系。
- Word2Vec:虽然没有显式使用共现矩阵,但其Skip-gram模型本质上也是在捕捉词语之间的共现关系。
- 主题模型:共现矩阵可以用于构建主题模型,如LDA(Latent Dirichlet Allocation)。
6. 示例
假设有一个简单的语料库:
"I like deep learning."
"I like NLP."
"I enjoy learning."
定义词汇表 V = { I , l i k e , d e e p , l e a r n i n g , N L P , e n j o y } V = \{I, like, deep, learning, NLP, enjoy\} V={I,like,deep,learning,NLP,enjoy},窗口大小为2。
共现矩阵 X X X 可能如下(简化示例):
| I | like | deep | learning | NLP | enjoy | |
|---|---|---|---|---|---|---|
| I | 0 | 2 | 1 | 1 | 1 | 1 |
| like | 2 | 0 | 1 | 1 | 1 | 0 |
| deep | 1 | 1 | 0 | 1 | 0 | 0 |
| learning | 1 | 1 | 1 | 0 | 0 | 1 |
| NLP | 1 | 1 | 0 | 0 | 0 | 0 |
| enjoy | 1 | 0 | 0 | 1 | 0 | 0 |
共现概率矩阵 P P P 可以通过归一化得到。例如,对于词语 “I”:
P ( like ∣ I ) = X I , like X I = 2 6 ≈ 0.33 P(\text{like}|I) = \frac{X_{I,\text{like}}}{X_I} = \frac{2}{6} \approx 0.33 P(like∣I)=XIXI,like=62≈0.33
7. 优缺点
优点
- 直观且易于理解。
- 能够捕捉词语之间的全局统计信息。
缺点
- 矩阵维度高( V × V V \times V V×V),存储和计算成本大。
- 对于稀疏矩阵,可能需要降维或优化。
总结
共现概率矩阵是自然语言处理中一种重要的统计工具,能够捕捉词语之间的语义关系。它是许多词向量模型(如GloVe)的基础,广泛应用于文本分析、语义建模等任务。
目标函数
GloVe的目标函数如下:
J = ∑ i , j = 1 V f ( X i j ) ( w i T w ~ j + b i + b ~ j − log X i j ) 2 J = \sum_{i,j=1}^{V} f(X_{ij}) (w_i^T \tilde{w}_j + b_i + \tilde{b}_j - \log X_{ij})^2 J=∑i,j=1Vf(Xij)(wiTw~j+bi+b~j−logXij)2
其中:
- w i w_i wi 和 w ~ j \tilde{w}_j w~j 是词语 i i i 和 j j j 的词向量。
- b i b_i bi 和 b ~ j \tilde{b}_j b~j 是偏置项。
- f ( X i j ) f(X_{ij}) f(Xij) 是一个权重函数,用于减少高频词对目标函数的过度影响。
权重函数 f ( X i j ) f(X_{ij}) f(Xij) 通常定义为:
f ( X i j ) = { ( X i j x max ) α if X i j < x max 1 otherwise f(X_{ij}) = \begin{cases} \left(\frac{X_{ij}}{x_{\text{max}}}\right)^\alpha & \text{if } X_{ij} < x_{\text{max}} \\ 1 & \text{otherwise} \end{cases} f(Xij)={(xmaxXij)α1if Xij<xmaxotherwise
其中, x max x_{\text{max}} xmax 和 α \alpha α 是超参数。
训练过程
- 构建共现矩阵:从语料库中统计词语的共现频率,构建共现矩阵。
- 初始化词向量:随机初始化词向量和偏置项。
- 优化目标函数:使用梯度下降法或其他优化算法最小化目标函数,更新词向量和偏置项。
使用预训练的GloVe词向量
from gensim.test.utils import datapath, get_tmpfile
from gensim.models import KeyedVectors
from gensim.scripts.glove2word2vec import glove2word2vec# 构建glove预训练词向量文件
# 传绝对路径
glove_file = datapath(r'D:\Projects\课程资料\自然语言处理(NLP)\学习\data\glove.6B.100d.txt')
worde2vec_glove_file = get_tmpfile('glove.6B.100d.word2vec.txt')
# 转化 (400000, 100)
glove2word2vec(glove_file, worde2vec_glove_file)model = KeyedVectors.load_word2vec_format(worde2vec_glove_file)
model.most_similar('banana')

model.most_similar(positive=['woman', 'king'], negative=['man'])

优点
- 全局信息:GloVe利用了全局的共现统计信息,能够捕捉到词语之间的全局关系。
- 高效性:相比于传统的词向量模型(如Word2Vec),GloVe在训练过程中更加高效。
- 可解释性:GloVe生成的词向量具有较好的可解释性,能够反映词语之间的语义关系。
应用
GloVe生成的词向量可以广泛应用于各种自然语言处理任务,如文本分类、情感分析、机器翻译、问答系统等。
总结
GloVe是一种强大的词向量表示方法,通过结合全局统计信息和局部上下文信息,能够生成高质量的词向量。它在自然语言处理领域有着广泛的应用,并且由于其高效性和可解释性,受到了学术界和工业界的广泛关注。
相关文章:
【自然语言处理(NLP)】生成词向量:GloVe(Global Vectors for Word Representation)原理及应用
文章目录 介绍GloVe 介绍核心思想共现矩阵1. 共现矩阵的定义2. 共现概率矩阵的定义3. 共现概率矩阵的意义4. 共现概率矩阵的构建步骤5. 共现概率矩阵的应用6. 示例7. 优缺点优点缺点 **总结** 目标函数训练过程使用预训练的GloVe词向量 优点应用总结 个人主页:道友老…...
红黑树的封装
一、封装思路 在 STL 中 map set 的底层就是封装了一棵红黑树。 其中连接红黑树和容器的是迭代器,map set 暴露出的接口都不是自己写的,而是红黑树写的,外部接口封装红黑树接口。 所以写出红黑树为 map set 写的接口,再在上层的…...
巧用 Cursor+Coze,轻松简化小程序开发
一、为啥要用 Cursor+Coze 简化小程序开发 家人们,如今小程序简直火出圈啦!不管你是电商从业者,还是服务行业的工作者,又或是自媒体运营者,拥有一个小程序,就相当于给业务插上了腾飞的翅膀,能带来更多的流量和机会。但是,小程序开发的过程,那可真是充满了挑战。从最开…...
如何获取sql数据中时间的月份、年份(类型为date)
可用自带的函数month来实现 如: 创建表及插入数据: create table test (id int,begindate datetime) insert into test values (1,2015-01-01) insert into test values (2,2015-02-01) 执行sql语句,获取月份: select MONTH(begindate)…...
NSSCTF Pwn [NISACTF 2022]ezpie 题解
下载 exeinfo checksec 32位 NX PIE开启 查看main函数: 后门函数: 发现已经给出了main函数地址 因为开启了PIE 所以IDA中 后门函数减去main函数的后三位就是偏移 给出的函数加上这个数就是后门函数地址 exp: from pwn import *p remote(…...
数据结构与算法——二分查找
二分查找算法常用于在具有单调性的数组中,以logn的时间复杂度快速查找某个目标值是否存在于该数组中,如果存在还能够返回目标值在数组中的索引下标,常见的二分查找算法有开区间写法、半开区间写法以及闭区间写法,这三种写法的区别…...
【01】共识机制
BTF共识 拜占庭将军问题 拜占庭将军问题是一个共识问题 起源 Leslie Lamport在论文《The Byzantine Generals Problem》提出拜占庭将军问题。 核心描述 军中可能有叛徒,却要保证进攻一致,由此引申到计算领域,发展成了一种容错理论。随着…...
文字加持:让 OpenCV 轻松在图像中插上文字
前言 在很多图像处理任务中,我们不仅需要提取图像信息,还希望在图像上加上一些文字,或是标注,或是动态展示。正如在一幅画上添加一个标语,或者在一个视频上加上动态字幕,cv2.putText 就是这个“文字魔术师”,它能让我们的图像从“沉默寡言”变得生动有趣。 今天,我们…...
【R语言】环境空间
一、环境空间的特点 环境空间是一种特殊类型的变量,它可以像其它变量一样被分配和操作,还可以以参数的形式传递给函数。 R语言中环境空间具有如下3个特点: 1、对象名称唯一性 此特点指的是在不同的环境空间中可以有同名的变量出现&#x…...
惰性函数【Ⅱ】《事件绑定的自我修养:从青铜到王者的进化之路》
【Ⅱ】《事件绑定的自我修养:从青铜到王者的进化之路》 1. 代码功能大白话(给室友讲明白版) // 青铜写法:每次都要问浏览器"你行不行?" function addEvent青铜版(element, type, handler) {if (window.add…...
Vue3的el-table-column下拉输入实时查询API数据选择的实现方法
由于本人对el-table-column有下拉输入选择的要求,根据网上搜索的资料及本人优化,推出我比较满意的方法,供各位读者参考使用。 效果图 el-table-column写法 <el-table-columnlabel"货品编号"align"center"prop"…...
[mmdetection]fast-rcnn模型训练自己的数据集的详细教程
本篇博客是由本人亲自调试成功后的学习笔记。使用了mmdetection项目包进行fast-rcnn模型的训练,数据集是自制图像数据。废话不多说,下面进入训练步骤教程。 注:本人使用linux服务器进行展示,Windows环境大差不差。另外࿰…...
#systemverilog# Verilog与SystemVerilog发展历程及关系
1. Verilog的发展历史 1984年:Gateway Design Automation公司开发了Verilog,最初作为专有语言,用于逻辑仿真和数字电路设计。 1990年:Cadence收购Gateway,Verilog逐步开放,成为行业标准。 1995年(IEEE 1364-1995):首个IEEE标准,即Verilog-1995,定义基础语法和仿真语…...
RFID涉密载体管控系统|支持国产化、自主研发
涉密载体管理系统DW-S402是一套成熟系统,是用于对各种涉密载体进行有效管理,实现对载体的智能化、规范化、标准化管理,广泛应用于保密、机要单位以及企事业单位等有载体保管需求的行业。 用户为对文件资料、存储介质等管理严格的单位&#x…...
BUU14 [极客大挑战 2019]PHP1
用dirsearch扫描文件,扫了一万年什么也没扫出来 从网上看的wp,他们扫出来www.zip 这里直接用上了,以后有空再扫一遍 下载www.zip 在index.php中 说明要输入select 打开class.php <?php include flag.php;error_reporting(0);class…...
数据分析师使用Kutools for Excel 插件
数据分析师使用Kutools for Excel 插件 Kutools for Excel 是一款功能强大的 Excel 插件,旨在提高 Excel 用户的工作效率,简化复杂的操作。它提供了超过 300 个增强功能,帮助用户快速完成数据管理、格式化、排序、分析等任务,特别…...
【高级篇 / IPv6】(7.2) ❀ 04. 在60E上配置ADSL拨号宽带上网(IPv4) ❀ FortiGate 防火墙
【简介】除了单位用户以外,大部分个人用户目前使用的仍然是30E、50E、60E系列防火墙,固件无法达到目前最高版本7.6,这里以最常用的60E为例,演示固件版本7.2下实现ADSL拨号宽带的IPv6上网。由于内容比较多,文章分上、下…...
基于LMS算法的自适应滤波器设计与MATLAB实现
1. 引言 自适应滤波器是信号处理领域的重要工具,能够根据输入信号的统计特性自动调整滤波器参数。其中,最小均方(LMS)算法因其计算简单、易于实现的特点,成为最常用的自适应滤波算法之一,广泛应用于噪声消…...
【现代深度学习技术】深度学习计算 | 延后初始化自定义层
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…...
LeetCode 3105. Longest Strictly Increasing or Strictly Decreasing Subarray
🔗 https://leetcode.com/problems/longest-strictly-increasing-or-strictly-decreasing-subarray 题目 给一个数组,返回其最长严格升序或者降序的子数组长度 思路 模拟 代码 class Solution { public:int longestMonotonicSubarray(vector<in…...
Java导出Excel简单工具类
一、maven配置 <!--jxl--><dependency><groupId>net.sourceforge.jexcelapi</groupId><artifactId>jxl</artifactId><version>2.6.12</version></dependency>二、工具类方法 package util2;import jxl.Workbook; impor…...
蓝桥与力扣刷题(141 环形链表)
题目:给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的…...
【小鱼闪闪】做一个物联网控制小灯的制作流程简要介绍(图文)
1、注册物联网云平台,这里选用巴法云 2.、新建主题 “ledtest” 3、 使用Arduino或Mixly软件编写单片机程序(需要引用巴法云库文件),程序中订阅“ledtest”主题,用于接收单片机发送来的数据。此处会将连接的温度传感器…...
图论常见算法
图论常见算法 算法prim算法Dijkstra算法 用途最小生成树(MST):最短路径:拓扑排序:关键路径: 算法用途适用条件时间复杂度Kruskal最小生成树无向图(稀疏图)O(E log E)Prim最小生成树无…...
实战技巧:如何快速提高网站收录的权威性?
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/68.html 快速提高网站收录的权威性是一个系统性的工作,涉及内容质量、网站结构、外部链接、用户体验等多个方面。以下是一些实战技巧,可以帮助你快速提升网站收录的权…...
BUU16 [ACTF2020 新生赛]BackupFile1
扫到index.php.bak 实在扫不出来可以试试一些常有的文件,比如flag.php(flag.php.bak),index.php(index.php.bak) <?php include_once "flag.php";if(isset($_GET[key])) {$key $_GET[key…...
js --- 获取随机数
介绍 使用js获取随机数 代码 Math.random()...
运维之MySQL锁机制(MySQL Lock Mechanism for Operation and Maintenance)
运维之MySQL锁机制 锁是一种常见的并发事务的控制方式。MySQL数据库中的锁机制主要用于控制对数据的并发访问,防止多个用户或进程同时对同一数据进行读写操作,从而避免数据不一致和丢失更新等问题。锁机制确保数据的一致性,保证在多个事务操作…...
用Python实现SVM分类器:从数据到决策边界可视化,以鸢尾花数据集为例
前言 在机器学习的世界里,支持向量机(Support Vector Machine,简称SVM)是一种非常强大的分类算法。它通过寻找最优的决策边界,将不同类别的数据分开。本文将通过一个简单的Python代码示例,展示如何使用SVM…...
pytorch使用SVM实现文本分类
人工智能例子汇总:AI常见的算法和例子-CSDN博客 完整代码: import torch import torch.nn as nn import torch.optim as optim import jieba import numpy as np from sklearn.model_selection import train_test_split from sklearn.feature_extract…...
