NLP.TM | GloVe模型及其Python实现
在进行自然语言处理中,需要对文章的中的语义进行分析,于是迫切需要一些模型去描述词汇的含义,很多人可能都知道word2vector算法,诚然,word2vector是一个非常优秀的算法,并且被广泛运用,为人们熟知,然而,从结果的优劣性来看,其实word2vector并非唯一的优秀方案,斯坦福大学提出的GloVe就是其中之一。今天我来为大家介绍一下GloVe模型,但是重点,还是放在实现上。
原论文:http://www.eecs.wsu.edu/~sji/classes/DL16/CNN-text/glove.pdf
简单地说一下原理
这里的原理我主要参考了两篇博客,感谢两位优秀的博主。
前者会比较通俗,后者则比较深刻。
共现关系
和word2vector不同,GloVe更倾向于进行分析前后语境之间的共现关系,通过共现关系抽象出词向量。
所谓的共现,共同出现,其实就是看一个词有没有在另一个词的附近出现,所谓的附近,其实就是一个移动窗口的概念,定义窗口的半径(从中心词到边缘的距离)后,看看方圆多少范围内出现词的个数,就是共现,现在看看例子。
假设语料库就只有下面一行:
i love you but you love him i am sad
设半径为2,于是移动窗口的滑动就有下面的形式:
以窗口5为例,此处就可以认为,love分别和but, you, him, i共同出现了一次,通过这种方式去计数,就能知道任意两个词之间的共现关系(一般是可逆的),构成共现矩阵X,一般地,X是一个对称矩阵。
词向量的产生
首先,模型的损失函数长这样的:
vi和vj是词汇i和j的词向量,bi和bj是常数项,f是特定的权重函数,N是词汇表大小。
这个损失函数怎么来的,我觉得上面的第一个链接讲的非常清楚,看的时候注意一个核心,就是考虑两个词汇的共现关系与词向量之间的关系(映射)尽可能接近,于是就构造了上面的损失函数。
GloVe的Python实现
在pypi里面看到了很多GloVe的包,但是很多都有坑,我直接说一个我自己已经走通的包mittens。
下载方式还是比较简单的, pip install mittens
基本没什么问题,想要去看看源码的话,在这里:
一般而言GloVe按照计算共现矩阵和GloVe训练两大模块,而mittens里面其实只提供了后者,前者还是需要自己写,这是我写的部分内容,给大家详细讲讲(复杂度啥的基本没做什么优化,欢迎提出一些意见)。
共现矩阵的计算
将之前事先说明一下,现在读进来的数据,即代码中的“data”变量,每行不是对应的单词或者短语,而是已经对应在词典中的该短语的index(自己构建词典,一般设置为0-(N-1),N为词典中词语的个数),尤其在后面的cooccurrence的统计,即如果句子数组中的第i个词语是词典中的第j个词,则句子向量中第i个位置就是数字j,这种方式对cooccurrence的统计非常方便。
# 构建空的词表
coWindow = 3 # 共现窗口大小(半径)
tableSize = 1000 # 共现矩阵维度
cooccurrence = np.zeros((tableSize, tableSize), "int64" )
首先是数据初始化,这里不详细说数据载入了,但是共现矩阵当然是需要初始化的(np是numpy别忘了)。
# 开始统计
flag = 0
for item in data:
itemInt = [int(x) for x in item]
for core in range(1, len(item)):
if core <= coWindow + 1:
# 左窗口不足
window = itemInt[1:core + coWindow + 1]
coreIndex = core - 1
cooccurrence = countCOOC(cooccurrence, window, coreIndex)
elif core >= len(item) - 1 - coWindow:
# 右窗口不足
window = itemInt[core - coWindow:(len(item))]
coreIndex = coWindow
cooccurrence = countCOOC(cooccurrence, window, coreIndex)
else:
# 左右均没有问题
window = itemInt[core - coWindow:core + coWindow + 1]
coreIndex = coWindow
cooccurrence = countCOOC(cooccurrence, window, coreIndex)
flag = flag + 1
if flag % 1000 == 0:
endTime = datetime.datetime.now()
print("已经计算了%s条数据,用时%s" % (flag, endTime - startTime))
这一块里面主要是为了设置移动窗口来进行挪动识别,具体统计移动窗口内部的共现,是在countCOOC函数里面做的。
def countCOOC(cooccurrence, window, coreIndex):
# cooccurrence:当前共现矩阵
# window:当前移动窗口数组
# coreIndex:当前移动窗口数组中的窗口中心位置
for index in range(len(window)):
if index == coreIndex:
continue
else:
cooccurrence[window[coreIndex]][window[index]] = cooccurrence[window[coreIndex]][window[index]] + 1
return cooccurrence
countCOOC用来当前移动窗口的共现,一个一个计数即可。
GloVe的训练
# 包的引入
from mittens import GloVe
# 初始化模型
vecLength=100 # 矩阵长度
max_iter=100000 # 最大迭代次数
display_progress=1000 # 每次展示
glove_model = GloVe(n=vecLength, max_iter=max_iter, display_progress=display_progress)
# 模型训练与结果输出
embeddings = glove_model.fit(coocMatric)
引入包之后,配置相应的参数,然后可以开始训练,训练完的返回值embeddings就是得到的词向量词典,通过词向量词典,就能够将每篇文本的每一个单词转化为词向量,从而进行进一步分析。
小结
GloVe终于写完了,不知道大家觉得怎么样,关于原理写的人相对比较多,也理解的比我好我就不再解释了,而代码这块,网上写的不多,所以我写得详细一些,这也是我把结果写出来的核心代码,有什么问题我来回答,欢迎通过下面的联系方式联系我。
作者:机智的叉烧
链接:https://www.jianshu.com/p/d0cb367752e8
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
NLP.TM | GloVe模型及其Python实现的更多相关文章
- 理解GloVe模型(Global vectors for word representation)
理解GloVe模型 概述 模型目标:进行词的向量化表示,使得向量之间尽可能多地蕴含语义和语法的信息.输入:语料库输出:词向量方法概述:首先基于语料库构建词的共现矩阵,然后基于共现矩阵和GloVe模型学 ...
- L25词嵌入进阶GloVe模型
词嵌入进阶 在"Word2Vec的实现"一节中,我们在小规模数据集上训练了一个 Word2Vec 词嵌入模型,并通过词向量的余弦相似度搜索近义词.虽然 Word2Vec 已经能够成 ...
- NLP学习(1)---Glove模型---词向量模型
一.简介: 1.概念:glove是一种无监督的Word representation方法. Count-based模型,如GloVe,本质上是对共现矩阵进行降维.首先,构建一个词汇的共现矩阵,每一行是 ...
- 斯坦福NLP课程 | 第12讲 - NLP子词模型
作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www. ...
- lda模型的python实现
LDA(Latent Dirichlet Allocation)是一种文档主题生成模型,最近看了点资料,准备使用python实现一下.至于数学模型相关知识,某度一大堆,这里也给出之前参考过的一个挺详细 ...
- NLP︱LDA主题模型的应用难题、使用心得及从多元统计角度剖析
将LDA跟多元统计分析结合起来看,那么LDA中的主题就像词主成分,其把主成分-样本之间的关系说清楚了.多元学的时候聚类分为Q型聚类.R型聚类以及主成分分析.R型聚类.主成分分析针对变量,Q型聚类针对样 ...
- NLP一些工程应用模型
发现一个DL的博客,对文章分类归纳做的比较好:第三篇文章中的模型可以重点参考 “自然语言学习资料的汇总” 综述 | 一文读懂自然语言处理NLP(附学习资料) 用深度学习(CNN RNN Attenti ...
- 通过ORM模型看python对象创建过程
简易django ORM模型如下所示: #!/usr/bin/env python # encoding: utf-8 """ @version: 1.0 @author ...
- 算法工程师进化-NLP之主题模型
1 引言 主题模型是文本挖掘的重要工具,近年来在学术界和工业届都获得了非常多的关注.学术界的工作主要集中在建模层面,即提出各种各样的主题模型来适应不同的场景,因此缺乏指导主题模型在工业场景落地的资源和 ...
随机推荐
- 336. Palindrome Pairs(can't understand)
Given a list of unique words, find all pairs of distinct indices (i, j) in the given list, so that t ...
- 51nod 1456【强连通,缩点,并查集】
话说这道题的机遇是看到了http://blog.csdn.net/u010885899/article/details/50611895很有意思:然后就去补了这题 题意: 建最少的边使得给出的点相连. ...
- stringstream转换
在这之前,在杭电刷题的时候,并没有注意到这个好东西. 使用stringstream对象简化类型转换C++标准库中的<sstream>提供了比ANSI C的<stdio.h>更高 ...
- jmeter beanshell处理请求响应结果时Unicode编码转为中文
在Test Plan下创建一个后置BeanShell PostProcessor,粘贴如下代码即可: String s=new String(prev.getResponseData()," ...
- python 基础(十三) time模块
日期和时间 一.time模块 import time 时间戳: 时间戳是指格林威治时间1970年1月1日0时0分0秒至现在的秒数 s(秒).ms(毫秒).μs(微秒).ns(纳秒), 其中:1 ...
- [JSOI2015]染色游戏
Description 棋盘是一个n×m的矩形,分成n行m列共n*m个小方格. 现在萌萌和南南有C种不同颜色的颜料,他们希望把棋盘用这些颜料染色,并满足以下规定: 1.棋盘的每一个小方格既可以染色(染 ...
- [POJ1463] Strategic game
题目链接: 传送门 题目大意: Bob非常享受玩电脑游戏的过程,尤其是策略游戏,但是在有些时候,他因为不能在第一时间找到最佳的策略而十分伤心. 现在,他遇到了一个问题.他必须保卫一个中世纪的城市,有很 ...
- 转 sqlplus 设置回闪 sqlplus下使用退格backspace回删出现^H的解决办法
转自 http://blog.csdn.net/chinadm123/article/details/44099351 1.进入sqlplus前设置回删 在进入sqlplus之前,在当前termina ...
- 自己开发shell脚本实现一键化安装。
一.说明在现实环境中可能需要批量部署服务器,那么在我们已经部署好一台服务以后如果实现剩下的服务批量安装呢: 使用shell能否实现功能: 假设我们要部署lamp或者是lnmp如何实现脚本部署? 使用以 ...
- 百度Ueditor多图片上传控件
发现百度的Ueditor富文本编辑器中的多图片上传控件很不错,于是便想着分享出来使用,费了老劲,少不了无名朋友的帮助,也查了不少资料,终于搞定了 发代码给大家,请大家多多指正 1.首先要在html页面 ...