在进行自然语言处理中,需要对文章的中的语义进行分析,于是迫切需要一些模型去描述词汇的含义,很多人可能都知道word2vector算法,诚然,word2vector是一个非常优秀的算法,并且被广泛运用,为人们熟知,然而,从结果的优劣性来看,其实word2vector并非唯一的优秀方案,斯坦福大学提出的GloVe就是其中之一。今天我来为大家介绍一下GloVe模型,但是重点,还是放在实现上。

原论文:http://www.eecs.wsu.edu/~sji/classes/DL16/CNN-text/glove.pdf

简单地说一下原理

这里的原理我主要参考了两篇博客,感谢两位优秀的博主。

  • 理解GloVe模型(+总结):https://blog.csdn.net/u014665013/article/details/79642083
  • GloVe模型:https://www.cnblogs.com/Weirping/p/7999979.html

前者会比较通俗,后者则比较深刻。

共现关系

和word2vector不同,GloVe更倾向于进行分析前后语境之间的共现关系,通过共现关系抽象出词向量。

所谓的共现,共同出现,其实就是看一个词有没有在另一个词的附近出现,所谓的附近,其实就是一个移动窗口的概念,定义窗口的半径(从中心词到边缘的距离)后,看看方圆多少范围内出现词的个数,就是共现,现在看看例子。

假设语料库就只有下面一行:

i love you but you love him i am sad

设半径为2,于是移动窗口的滑动就有下面的形式:

以窗口5为例,此处就可以认为,love分别和but, you, him, i共同出现了一次,通过这种方式去计数,就能知道任意两个词之间的共现关系(一般是可逆的),构成共现矩阵X,一般地,X是一个对称矩阵。

词向量的产生

首先,模型的损失函数长这样的:

image

vi和vj是词汇i和j的词向量,bi和bj是常数项,f是特定的权重函数,N是词汇表大小。

这个损失函数怎么来的,我觉得上面的第一个链接讲的非常清楚,看的时候注意一个核心,就是考虑两个词汇的共现关系与词向量之间的关系(映射)尽可能接近,于是就构造了上面的损失函数。

GloVe的Python实现

在pypi里面看到了很多GloVe的包,但是很多都有坑,我直接说一个我自己已经走通的包mittens。

下载方式还是比较简单的, pip install mittens基本没什么问题,想要去看看源码的话,在这里:

https://github.com/roamanalytics/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实现相关推荐

  1. python glove训练模型_NLP.TM | GloVe模型及其Python实现

    在进行自然语言处理中,需要对文章的中的语义进行分析,于是迫切需要一些模型去描述词汇的含义,很多人可能都知道word2vector算法,诚然,word2vector是一个非常优秀的算法,并且被广泛运用, ...

  2. 【NLP】GloVe的Python实现

    作者 | Peng Yan 编译 | VK 来源 | Towards Data Science 作为NLP数据科学家,我经常阅读词向量.RNN和Transformer的论文. 阅读论文很有趣,给我一种 ...

  3. 【NLP模型笔记】GloVe模型简介

    GloVe模型 glove模型的参考资料链接如下: https://nlp.stanford.edu/projects/glove/ 论文链接(pdf)如下: https://nlp.stanford ...

  4. glove中文词向量_Summary系列glove模型解读

    一.Glove模型简介 语义文本向量表示可以应用在信息抽取,文档分类,问答系统,NER(Named Entity Recognition)和语义解析等领域中,大都需要计算单词或者文本之间的距离或者相似 ...

  5. 理解GloVe模型(+总结)

    文章目录 系列目录(系列更新中) 1.概述 2.统计共现矩阵 3.使用GloVe模型训练词向量 3.1.模型公式 3.2.模型怎么来的 3.3.Glove和skip-gram.CBOW模型对比 4.实 ...

  6. Glove模型的原理与代码

    文章目录 一.背景 二.原理部分 1.共现矩阵 2. F值的获取 3. Glove公式的获取 4. 损失函数的获取 三.代码部分 1.词表映射 2. 词嵌入 3. 训练函数 4. 输出结果 总结 一. ...

  7. NLP.TM[36] | NLP之源:n-gram语言模型

    [NLP.TM] 本人有关自然语言处理和文本挖掘方面的学习和笔记,欢迎大家关注. 往期回顾 NLP.TM[32] | 浅谈文本增强技术 NLP.TM[33] | 纠错:pycorrector的错误检测 ...

  8. NLP.TM[38] | 对话系统经典:检索式对话

    [NLP.TM] 本人有关自然语言处理和文本挖掘方面的学习和笔记,欢迎大家关注. 往期回顾 NLP.TM[32] | 浅谈文本增强技术 NLP.TM[33] | 纠错:pycorrector的错误检测 ...

  9. 词向量:GloVe 模型详解

      本内容主要介绍构建词向量的 GloVe 模型. 1 前言   在 GloVe 模型被提出之前,学习词向量的模型主要有两大类: 全局矩阵分解方法,例如潜在语义分析(Latent semantic a ...

最新文章

  1. Netbackup 添加策略_报NFS.Skipping
  2. 我开发中总结的小技巧
  3. C 图像处理 颜色相关宏定义
  4. 鲁迅散文——随感录四十九
  5. eltree ref什么时候有_DBA:为什么你老写慢SQL
  6. 玩转oracle 11g(44):数据库发展历史
  7. Java讲课笔记05:运算符与表达式
  8. 12.12 带触发器按钮的输入框
  9. 受检异常 非受检异常_C++异常实战之十一 使用scope_fail处理复杂场景(非fail-fast)下的异常...
  10. web环境下的图像打印组件
  11. 2021深育杯-网络安全大赛专业竞赛部分wp
  12. Python(pybrain模块)搭建神经网络BPNN
  13. 鸿蒙818与A73,荣耀智慧屏正式发布:鸿鹄818智慧芯片+鸿蒙OS,开启未来新视觉
  14. 最权威的成都Java培训机构排名榜单公布啦,学Java必看
  15. 【易语言】微信跳一跳教程详细版,分分钟让新手学会的教程(附源码)
  16. 刘元普双生贵子(但行好事,莫问前程)
  17. 编译go文件时内部包引用受限的问题(use of internal package /PATH/ not allowed)
  18. Mac使用XQuartz调图形化总结
  19. 基于Linux系统mjpg_streamer流媒体移植(摄像头驱动移植)
  20. WIN10打开IE浏览器访问只兼容IE的网站被EDGE浏览器强制关IE的解决方法

热门文章

  1. 是否存在分布式的【大泥球】?
  2. 【Spring】spring基于注解的声明式事务控制
  3. 数据算法算力知识反绎学习
  4. CVD和ALD薄膜沉积技术应用领域
  5. Halide应用开发
  6. 自定义算子高性能开发
  7. 部署可扩展的目标检测管道:推理过程(上)
  8. 视觉导航的神经拓扑SLAM
  9. 【CV】Anaconda 安装教程|CSDN创作打卡
  10. TypeError: ord() expected string of length 1, but int found