一、GloVe词向量简介

GloVe:全称Global Vectors for Word Representations。其文献[2]是2014年在EMNLP会议上提出来的。其结合了词向量矩阵分解的思想对原始语料进行预训练,得到了低维、连续、稀疏的表示形式。对预训练后的词向量进行可视化可以发现发现某些词与词之间的联系。
(附:2种常用于估计词向量的方法,
1是基于神经网络的语言模型和word2vec的词向量预训练方法,其本质都是利用文本中词与词在局部上下文中的共现信息作为自监督学习信号。
2.基于矩阵分解的方法,如LSA(Latent Semantic Analysis潜在语义分析)等。其首先对语料进行统计分析,并获得含有全局统计信息的“词-上下文”共现矩阵,然后利用奇异值分解(Singular Value Decomposition,SVD)对该矩阵进行降维,进而得到词的低维表示。然而, 传统的矩阵分解方法得到的词向量不具备良好的几何性质,因此,GloVe词向量就提出来了,其结合了词向量以及矩阵分解的思想,结果较为好)[1]

二、t-SNE简介

t-SNE,全称t-distributed stochastic neighbor embedding。具体过程我不太了解, 但是其可以将高维数据压缩成低维输出。
如输入是(n_sample, n_dimension),输出是(n_sample, 2)。该过程将n_sample个维度为n_dimension的样本压缩成2维。

三、预训练的GloVe词向量

预训练好的词向量放在了官网上,请自行下载:
(网址:https://nlp.stanford.edu/projects/glove/)

如上图所示,根据不同的语料有不同的预训练模型,如有从Wikipedia、Twitter、以及普通爬取的语料信息。我选择了第一个,即从Wikipedia爬取的数据。
解压改文件后,选择了glove.6B.50d.txt(即从6B个token中提取,有400k的vocab,每个vocab是50维的)。
任意提取该txt文档的5行看一看,发现每行第1个数是token,剩下的50个float类型的数字是该token的50维表示。

were 0.73363 -0.74815 0.45913 -0.56041 0.091855 0.33015 -1.2034 -0.15565 -1.1205 -0.5938 0.23299 -0.46278 -0.34786 -0.47901 0.57621 -0.16053 -0.26457 -0.13732 -0.91878 -0.65339 0.05884 0.61553 1.2607 -0.39821 -0.26056 -1.0127 -0.38517 -0.096929 -0.11701 -0.48536 3.6902 0.30744 0.50713 -0.6537 0.80491 0.23672 0.61769 0.030195 -0.57645 0.60467 -0.63949 -0.11373 0.84984 0.41409 0.083774 -0.28737 -1.4735 -0.20095 -0.17246 -1.0984
not 0.55025 -0.24942 -0.0009386 -0.264 0.5932 0.2795 -0.25666 0.093076 -0.36288 0.090776 0.28409 0.71337 -0.4751 -0.24413 0.88424 0.89109 0.43009 -0.2733 0.11276 -0.81665 -0.41272 0.17754 0.61942 0.10466 0.33327 -2.3125 -0.52371 -0.021898 0.53801 -0.50615 3.8683 0.16642 -0.71981 -0.74728 0.11631 -0.37585 0.5552 0.12675 -0.22642 -0.10175 -0.35455 0.12348 0.16532 0.7042 -0.080231 -0.068406 -0.67626 0.33763 0.050139 0.33465
this 0.53074 0.40117 -0.40785 0.15444 0.47782 0.20754 -0.26951 -0.34023 -0.10879 0.10563 -0.10289 0.10849 -0.49681 -0.25128 0.84025 0.38949 0.32284 -0.22797 -0.44342 -0.31649 -0.12406 -0.2817 0.19467 0.055513 0.56705 -1.7419 -0.91145 0.27036 0.41927 0.020279 4.0405 -0.24943 -0.20416 -0.62762 -0.054783 -0.26883 0.18444 0.18204 -0.23536 -0.16155 -0.27655 0.035506 -0.38211 -0.00075134 -0.24822 0.28164 0.12819 0.28762 0.1444 0.23611
who -0.19461 -0.051277 0.26445 -0.57399 1.0236 0.58923 -1.3399 0.31032 -0.89433 -0.13192 0.21305 0.29171 -0.66079 0.084125 0.76578 -0.42393 0.32445 0.13603 -0.29987 -0.046415 -0.74811 1.2134 0.24988 0.22846 0.23546 -2.6054 0.12491 -0.94028 -0.58308 -0.32325 2.8419 0.33474 -0.33902 -0.23434 0.37735 0.093804 -0.25969 0.68889 0.37689 -0.2186 -0.24244 1.0029 0.18607 0.27486 0.48089 -0.43533 -1.1012 -0.67103 -0.21652 -0.025891
they 0.70835 -0.57361 0.15375 -0.63335 0.46879 -0.066566 -0.86826 0.35967 -0.64786 -0.22525 0.09752 0.27732 -0.35176 -0.25955 0.62368 0.60824 0.34905 -0.27195 -0.27981 -1.0183 -0.1487 0.41932 1.0342 0.17783 0.13569 -1.9999 -0.56163 0.004018 0.60839 -1.0031 3.9546 0.68698 -0.53593 -0.7427 0.18078 0.034527 0.016026 0.12467 -0.084633 -0.10375 -0.47862 -0.22314 0.25487 0.69985 0.32714 -0.15726 -0.6202 -0.23113 -0.31217 -0.3049

4. 编程用t-SNE可视化Glove向量。

scikit-learn库中含有t-SNE的实现,结合官方给出的代码,这里实现了t-SNE可视化Glove词向量。另外由于token太多时图片显示杂乱和算力限制, 这里只显示前100个Glove向量。感兴趣的读者还可以在该代码基础上提取特定的token和不同的token数量进行可视化。

代码如下:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import offsetbox
from sklearn.preprocessing import MinMaxScaler
from sklearn.manifold import TSNE
from time import time
from sklearn.datasets import load_digitsdigits = load_digits(n_class=6)# 1.读取GloVe向量数据库,取6种类。共400,000个token,每个token是50维。
glove_txt = "/home/lwq/20210922/glove.6B.50d.txt"
with open(glove_txt) as f:lines = f.readlines()lines = lines[:100]X = []y = []for line in lines:now = line.split(' ')y.append(now[0])X.append(now[1:])X = np.array(X)y = np.array(y)n_samples, n_features = X.shape# 2.编写绘画函数,对输入的数据X进行画图。
def plot_embedding(X, title, ax):X = MinMaxScaler().fit_transform(X)shown_images = np.array([[1.0, 1.0]])  # just something bigfor i in range(X.shape[0]):# plot every digit on the embeddingax.text(X[i, 0],X[i, 1],str(y[i]),# color=plt.cm.Dark2(y[i]),fontdict={"weight": "bold", "size": 9},)'''# show an annotation box for a group of digitsdist = np.sum((X[i] - shown_images) ** 2, 1)if np.min(dist) < 4e-3:# don't show points that are too closecontinueshown_images = np.concatenate([shown_images, [X[i]]], axis=0)imagebox = offsetbox.AnnotationBbox(offsetbox.OffsetImage(digits.images[i], cmap=plt.cm.gray_r), X[i])ax.add_artist(imagebox)'''ax.set_title(title)ax.axis("off")# 3.选择要用那种方式对原始数据编码(Embedding),这里选择TSNE。
#  n_components = 2表示输出为2维,learning_rate默认是200.0,
embeddings = {"t-SNE embeedding": TSNE(n_components=2, init='pca', learning_rate=200.0, random_state=0),
}# 4.根据字典里(这里只有TSNE)的编码方式,生成压缩后的编码矩阵
# 即把每个样本生成了2维的表示。维度由原来的50位变成了2位。
# Input: (n_sample, n_dimension)
# Output: (n_sample, 2)projections, timing = {}, {}
for name, transformer in embeddings.items():# 原作者的dict里有多种比较方法,我只用了t-SNE,需要的可以查询原链接:https://scikit-learn.org/stable/auto_examples/manifold/plot_lle_digits.html#manifold-learning-on-handwritten-digits-locally-linear-embedding-isomapif name.startswith("Linear Discriminant Analysis"):data = X.copy()data.flat[:: X.shape[1] + 1] += 0.01  # Make X invertibleelse:data = Xprint(f"Computing{name}...")start_time = time()print(data.shape, type(data.shape))projections[name] = transformer.fit_transform(data, y)timing[name] = time() - start_time# 6.把编码矩阵输出到二维图像中来。
fig, ax = plt.subplots()
title = f"{name}(time{timing[name]:.3f}s)"
plot_embedding(projections[name], title, ax)
plt.show()

结果如下:

上图 :利用t-SNE对前100个GloVe词向量可视化结果

从图中我们可以发现,最上面的标点符号聚到了一起,表明他们是相似的。his、her、he、who分到了一起。year和years分到了一起,表现了一些语义的相似性。这在不同的corpus上、不同维度上可能显示的结果是不一样的。

根据结果这表明Glove词向量是具有一定的相关性的。但是GloVe词向量是静态词向量,不能解决NLP任务中的“一词多义”问题。因此,可以考虑一些动态的词向量表示,如Elmo模型、以及现在特别流行的GPT、BERT等预训练模型。


参考文献

1.《自然语言处理:基于预训练模型的方法》车万翔等著,2021年。
2.Jeffrey Pennington, Richard Socher, and Christopher D. Manning. 2014. GloVe: Global Vectors for Word Representation.
3.https://scikit-learn.org/stable/auto_examples/manifold/plot_lle_digits.html#manifold-learning-on-handwritten-digits-locally-linear-embedding-isomap

利用t-SNE可视化Glove向量相关推荐

  1. keras 生成句子向量 词向量_Keras中使用TensorBoard可视化词向量

    1. 前言 最近几天都耗在了词向量的训练以及可视化上,期间遇到了一些坑,也了解到一些容易忽略的知识点,在此一并记录下来,给自己也给大家一个警示. 2. keras中的TensorBoard Tenso ...

  2. TensorBoard可视化高维向量

    对图像进行卷积的过程可以看作是特征提取的过程.在图像迁移学习中可以将一组目标问题的图片通过训练好的卷积层得到瓶颈层,这些瓶颈层向量就是多个高维向量.如果在目标问题图像数据集上同一种类的图片在经过卷积层 ...

  3. 可视化词向量-TSNE

    可视化词向量的好处是可以验证训练的词向量的效果,常采用TSNE方法可视化. t-分布领域嵌入算法,它只用于已标注数据时才真正有意义,可以明确显示出输入的聚类状况. 主要想法是将高维分布点的距离用条件概 ...

  4. PNAS:人类首次利用新型脑磁图可视化快速大脑信号

    大脑内部信息的处理是人体最复杂的过程之一.这一过程的中断通常会导致严重的神经紊乱.因此,对大脑内部信号传输的研究是理解很多疾病的关键. 为了观察大脑的神经细胞以"思维的速度"运行, ...

  5. r读取shape文件可视化_【R】提取 PCA 结果并利用 ggplot2 进行可视化

    最近,师妹在利用 R 对 PCA 结果进行可视化时遇到了一些问题,她说不太明白 ggplot2 怎么用在 PCA 结果上,那就安排吧. PCA.PCoA.NMDS.RDA 等图形的本质是散点图,既然是 ...

  6. 利用gensim构建word2vec词向量模型并保存词向量

    利用gensim包的word2vec模块构建CBOW或Skip-Gram模型来进行词向量化比较方便. 具体gensim.models.Word2Vec模型的参数可以看官网介绍: https://rad ...

  7. python爬虫beautifulsoup爬当当网_利用python爬虫可视化分析当当网的图书数据!

    导语 这周末就分享个小爬虫吧.利用Python爬取并简单地可视化分析当当网的图书数据. 开发工具 Python版本:3.6.4 相关模块: requests模块: bs4模块: wordcloud模块 ...

  8. 利用python爬虫可视化分析当当网的图书数据

    导语 这周末就分享个小爬虫吧.利用Python爬取并简单地可视化分析当当网的图书数据. 开发工具 **Python版本:**3.6.4 相关模块: requests模块: bs4模块: wordclo ...

  9. 工作记录|在PyTorch下读取GloVe向量

    官网:http://nlp.stanford.edu/projects/glove/ 官方代码:https://github.com/stanfordnlp/GloVe 不过官方代码是C写的,跑在li ...

  10. 利用社区结构可视化复杂网络

    系列文章目录 文章目录 系列文章目录 参考 背景 实现与改进 传统实现方法 改进方法 代码实现 数据集格式 参考 论文: Visualizing complex networks by leverag ...

最新文章

  1. SQLServer 大小写敏感配置
  2. jzoj3348,bzoj3258-秘密任务【最短路,网络流最小割】
  3. anychart说明文档
  4. 2008秋-计算机软件基础-第三章- 二叉排序树
  5. 墙后的所有姿势,全被“瞎眼”AI透视
  6. JQuery模拟二------添加extend函数和简单选择器
  7. python随机读取字符_Python random模块(获取随机数)常用方法和使用例子
  8. 从网卡发送数据再谈TCP/IP协议—网络传输速度计算-网卡构造
  9. const 使用方法具体解释
  10. 一个基于protobuf的极简RPC
  11. uni-app 变量赋值后被实时同步
  12. 三菱运动控制电子凸轮应用 三菱Q173系列的电子凸轮使用,包括凸轮参数设置
  13. android音频系统(4):AudioService之音量管理
  14. 免费java视频教程大全在线观看
  15. DAO是什么?——为什么有人试图购买美国宪法?
  16. .NET高级工程师面试经历
  17. 2021威海高考成绩查询,2021年威海夏季高考时间公布
  18. 超小尺寸的导电滑环介绍
  19. 中国有多少java程序员_中国有多少个程序员?
  20. EAS 科目余额表、辅助账余额表(1F、1L、1R、5F、5L、5R)的含义

热门文章

  1. 网卡驱动程序igb和ixgbe
  2. oracle系统漏洞补丁包,跪求oracle漏洞补丁包
  3. Active Boot Disk(windows系统维护工具箱)官方光盘镜像版V19.0 | 电脑维修工具箱软件下载
  4. iPhone的AFC(Apple File Conduit)
  5. windows mobile/wince 大容量存储驱动实现介绍
  6. 安全管家安卓_网速管家安卓5.4版本全面上线,多场景网络体验全面升级
  7. 使用Apache FtpServer搭建FTP服务器 [FlashFXP]
  8. php敏感代码屏蔽,PHP敏感词汇屏蔽或替换
  9. DNS服务器设置正确,DNS服务器配置(DNS各属性详细介绍)
  10. python大漠游戏多开_python游戏脚本多开天才生成器