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

简单地说一下原理

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

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

共现关系

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

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

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

i love you but you love him i am sad

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

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

词向量的产生

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

3487500

image

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终于写完了,不知道大家觉得怎么样,关于原理写的人相对比较多,也理解的比我好我就不再解释了,而代码这块,网上写的不多,所以我写得详细一些,这也是我把结果写出来的核心代码,有什么问题我来回答,欢迎通过下面的联系方式联系我。

python glove训练模型_NLP.TM | GloVe模型及其Python实现相关推荐

  1. python ui bs_期权及 Black-Scholes模型的python实现

    Black-Scholes模型最早是由Fischer Black和Myron Scholes在1973提出,发表在论文The Pricing of Options and Corporate Liab ...

  2. 朴素贝叶斯python代码_朴素贝叶斯模型及python实现

    1 朴素贝叶斯模型 朴素贝叶斯法是基于贝叶斯定理.特征条件独立假设的分类方法.在预测时,对输入x,找出对应后验概率最大的 y 作为预测. NB模型: 输入: 先验概率分布:P(Y=ck),k=1,2, ...

  3. python基于tpot训练模型在获得最佳模型之后对模型进行交叉验证分析并可视化实战

    python基于tpot训练模型在获得最佳模型之后对模型进行交叉验证分析并可视化实战 目录

  4. 基于cnn的短文本分类_NLP.TM[15] | 短文本相似度CNN_SIM

    [NLP.TM] 本人有关自然语言处理和文本挖掘方面的学习和笔记,欢迎大家关注. 往期回顾: NLP.TM | 命名实体识别基线 BiLSTM+CRF(上) NLP.TM | tensorflow做基 ...

  5. 利用Caffe训练模型(solver、deploy、train_val) + python如何使用已训练模型

    版权声明:博主原创文章,微信公众号:素质云笔记,转载请注明来源"素质云博客",谢谢合作!! https://blog.csdn.net/sinat_26917383/article ...

  6. DL框架之Keras:深度学习框架Keras框架的简介、安装(Python库)、相关概念、Keras模型使用、使用方法之详细攻略

    DL框架之Keras:深度学习框架Keras框架的简介.安装(Python库).相关概念.Keras模型使用.使用方法之详细攻略 目录 Keras的简介 1.Keras的特点 2.Keras四大特性 ...

  7. [Python人工智能] 三十四.Bert模型 (3)keras-bert库构建Bert模型实现微博情感分析

    从本专栏开始,作者正式研究Python深度学习.神经网络及人工智能相关知识.前一篇文章开启了新的内容--Bert,首先介绍Keras-bert库安装及基础用法及文本分类工作.这篇文章将通过keras- ...

  8. python数据分析天气预报论文_用python+sklearn(机器学习)实现天气预报数据 模型和使用...

    项目地址 系列教程 0.前言 在上一篇教程里我们已经获取了所需要的全部数据,包括训练数据集和测试数据集,使用ProcessData()调用,所以接下来写模型的建立和预测 1.建立模型 没段代码在文章后 ...

  9. 利用Caffe训练模型(solver、deploy、train_val)+python使用已训练模型

    本文部分内容来源于CDA深度学习实战课堂,由唐宇迪老师授课 如果你企图用CPU来训练模型,那么你就疯了- 训练模型中,最耗时的因素是图像大小size,一般227*227用CPU来训练的话,训练1万次可 ...

最新文章

  1. 关系数据库的范式和反范式
  2. SQL Try Catch
  3. 安卓mysql导出excel_Android开发实现的导出数据库到Excel表格功能【附源码下载】...
  4. 查询显示注释_SQL汇总--简单查询
  5. L2-4 哲哲打游戏 (25 分)
  6. 无心剑中译柒歌《爱的回音》
  7. 威纶触摸屏使用说明书_「西门子1200PLC教程」20.PLC变量表的使用
  8. UTF8,Unicode 的区别(zt)
  9. [CERC2017]Intrinsic Interval(神仙+线段树)
  10. CSU Scientific Conference
  11. strpos、 strstr、 substr三个函数的对比讲解
  12. Java和C++的对照
  13. Java之T分布计算数据的双侧置信区间
  14. Tex document以及beamer模式插入参考文献,插入超链接
  15. k-9 邮箱添加 qq、163、gmail 帐号
  16. excel给定一个日期,确定是本月的第几周
  17. Leetcode 1190. Reverse Substrings Between Each Pair of Parentheses解题报告(python)
  18. 写给充满浮躁与抱怨的程序员
  19. https生成证书——keytool 用法总结
  20. 无穷小微积分教材历经50年之久的读者使用鉴定书

热门文章

  1. 华为FusionSphere云计算解决方案资料集
  2. 正交变换不改变矩阵F-范数、2-范数的证明
  3. 让VMware Workstation(虚拟主机)可以游戏
  4. 跟谁学计算机老师,跟谁学
  5. java繁体api_Java 之常用API(一)
  6. unity Quad剔除背面并剔除透明部分的shader
  7. 关于dlna开发使用的若干故障排除
  8. paragon ntfs for Mac(mac读写NTFS磁盘工具) 安装下载激活教程及怎么格式化U盘?
  9. MyEclipse has detected that less than 5% of the 31MB of Eden Space (Heap memory)
  10. JVM内存区域详解(Eden Space、Survivor Space、Old Gen、Code Cache和Perm Gen)