word2vec词向量模型介绍

word2vec是一种考虑词与词之间相关性的词向量模型,它可以将意思相近的词投影到一个高维空间,生成一个距离相近高维的向量(通常是50-300维),如下图所示(图片来自于)。

从图中可以看出King与Man的余弦距离较为相近,而King与Woman之间的距离较远。word2vec的最大优势就是将意思相近的词编码成距离相近的高维向量,使编码具有语义特征。

word2vec的实现

word2vec有三种模型:

  1. N-gram模型
  2. CBOW(continue bag of word)
  3. Skip—Gram

这里主要讲解的是CBOW模型,CBOW模型是由中心词的上下文(context(w))来得到中心词(w)并训练词向量。总体框架可以由下图展示

这里需要注意的是,输入的词需要在语料库中先找出其索引,然后根据索引生成一个随机高维向量,然后对这些输入向量求其平均进行特征融合,接着通过一个Hierarchical Softmax分类器,最后计算预测结果与真实的结果之间的交叉熵损失进行模型训练。这里Hierarchical Softmax实际上是多层Logistic回归,并且引入了霍夫曼树模型,从而减小了相比于softmax的参数量。详细请移步Hierarchical Softmax

Negative Sampling

Negative Sampling 下采样是一种采样方式,为了追求更加快速的分类结果和更小的参数量,它摒弃了Hierarchical Softmax分类器。通俗来解释一下:

word2vec将一个句子的中心词和他的上下文视为一个正例(positive),对于不采用Negative Sampling的word2vec来说,它将会有数以千计的分类结果(比如1000分类),这不仅增加了庞大的参数量,也增加了计算的复杂度。因此,基于Negative Sampling的word2vec诞生了。

基于Negative Sampling的word2vec会为一个正例生成一些负样本,然后将正例(正例中心词+上下文)或负样本(负例中心词+上下文)输入到模型中,最终只需通过一个Logistic回归做一个二分类判断其是不是中心词与上下文匹配即可。这样就可以将一个1000分类的问题转化为一个2分类问题,大大的节约了参数量和计算开销。由于我也是一个新手小白,这是我的通俗解释,如有错误,请多多指教。详细请移步Negative Sampling

基于Gensim工具包生成word2vec模型

这里需要安装两个工具包:

  1. Gensim: pip install gensim
  2. jieba: pip install jieba

你的语料库数据集可以通过维基百科下载(维基百科)也可以使用一些小说等。在使用Gensim工具包中的word2vec之前,需要将我们准备好的.txt文件中的内容进行分词操作,就是第2个工具包的jieba分词器。我下面贴出分词和训练word2vec模型所需代码:

import jieba
import jieba.analyse
import jieba.posseg as pseg
import codecs,systext = open('大主宰.txt','r',encoding="utf8")
target = open('xiaoshuo2.txt','w',encoding="utf8")
line = text.readline()
while line:line_seg = " ".join(jieba.cut(line))target.writelines(line_seg)print(line_seg)line = text.readline()
text.close()
target.close()
exit()

这个是分词用的代码,接下来还需要一个word2vec生成模型的code:

import logging
import os.path
import sys
import multiprocessing
from gensim.corpora import WikiCorpus
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
if __name__ == '__main__':program = os.path.basename(sys.argv[0])logger = logging.getLogger(program)logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')logging.root.setLevel(level=logging.INFO)logger.info("running %s" % ' '.join(sys.argv))# check and process input argumentsif len(sys.argv) < 4:print (globals()['__doc__'] % locals())sys.exit(1)inp, outp1, outp2 = sys.argv[1:4]model = Word2Vec(LineSentence(inp), size=400, window=5, min_count=5, workers=multiprocessing.cpu_count())model.save(outp1)model.model.wv.save_word2vec_format(outp2, binary=False)
#python word2vec_model.py zh.jian.wiki.seg.txt wiki.zh.text.model wiki.zh.text.vector
#opencc -i wiki_texts.txt -o test.txt -c t2s.json
#python word2vec_model.py xiaoshuo.txt xiaoshuo.text.model xiaoshuo.text.vector

这样我们的word2vec的词向量模型就被保存在outp1和outp2中了,我们可以做一下小测试~

from gensim.models import Word2Vecen_wiki_word2vec_model = Word2Vec.load('xiaoshuo.text.model')testwords = ['恶心','傻子','厉害','光芒','恐怖']
for i in range(5):res = en_wiki_word2vec_model.most_similar(testwords[i])print (testwords[i])print (res)
恶心
[('光明正大', 0.8532341122627258), ('剁', 0.7731980085372925), ('说服', 0.7661505937576294), ('慷慨', 0.7626612186431885), ('问问', 0.7621469497680664), ('拖泥带水', 0.7603974342346191), ('细说', 0.7572978734970093), ('记着', 0.7553634643554688), ('骗', 0.753753662109375), ('筹划', 0.7510721683502197)]
傻子
[('无关紧要', 0.6628221869468689), ('单打独斗', 0.655975341796875), ('他牧尘', 0.6399290561676025), ('人家', 0.6381828784942627), ('蠢货', 0.6338304281234741), ('失手', 0.6220790147781372), ('多半', 0.6178364753723145), ('换', 0.6163299679756165), ('满载而归', 0.6011545658111572), ('基本上', 0.5946712493896484)]
厉害
[('难缠', 0.7568021416664124), ('变态', 0.7241744995117188), ('棘手', 0.7141222953796387), ('优秀', 0.6876083016395569), ('强', 0.6873076558113098), ('出色', 0.6843757033348083), ('看重', 0.6825308799743652), ('能耐', 0.6758701801300049), ('啊', 0.6750842332839966), ('不错', 0.6658269166946411)]
光芒
[('金光', 0.886652410030365), ('光华', 0.8273990154266357), ('雷光', 0.8178660869598389), ('幽光', 0.7995476722717285), ('黑芒', 0.7966512441635132), ('之光', 0.782035768032074), ('灵光', 0.7716976404190063), ('黑光', 0.7608082294464111), ('青光', 0.7554724812507629), ('白光', 0.7331587672233582)]
恐怖
[('可怕', 0.9216969013214111), ('惊人', 0.7986444234848022), ('霸道', 0.7700717449188232), ('强悍', 0.752230167388916), ('强大', 0.7479638457298279), ('狂暴', 0.7225570678710938), ('精纯', 0.6795037984848022), ('凶猛', 0.6739758253097534), ('凶悍', 0.6677579879760742), ('威压', 0.6544308662414551)]

我用的是一篇武侠小说的语料库,因此数据集非常小,这里测试了几个词语,下面展示出了与它相关性较强的词,并给出了它们之间的相似度。

word2vec的简单介绍到此为止!感谢浏览过此页面的每一位观众。第一次发博客,经验不足,希望大家多多指教,谢谢~

深度学习NLP之word2vec相关推荐

  1. 一文概述2017年深度学习NLP重大进展与趋势

    本文,我将概述 2017 年深度学习技术在 NLP 领域带来的进步.可能会有遗漏,毕竟涵盖所有论文.框架和工具难度太大.我想和大家分享这一年我最喜欢的一些研究.我认为 2017 年是 NLP 领域的重 ...

  2. 深度学习(1)---2017年深度学习NLP重大进展与趋势

    深度学习(DL)架构和算法在图像识别.语音处理等领域实现了很大的进展.而深度学习在自然语言处理方面的表现最初并没有那么起眼,不过现在我们可以看到深度学习对 NLP 的贡献,在很多常见的 NLP 任务中 ...

  3. 【自然语言处理】一文概述2017年深度学习NLP重大进展与趋势

    选自 tryolabs 机器之心编译 参与:路雪.黄小天.蒋思源 作者通过本文概述了 2017 年深度学习技术在 NLP 领域带来的进步,以及未来的发展趋势,并与大家分享了这一年中作者最喜欢的研究.2 ...

  4. Python深度学习-NLP实战:字向量的训练与生成

    系列文章目录 Python深度学习-NLP实战:深度学习系列培训教程 Linux服务器软件的简单使用 Linux命令的简单使用 训练集.测试集.验证集的介绍及制作 字向量的训练与生成 文本分类之SVM ...

  5. [深度学习-NLP]什么是Self-attention, Muti-attention和Transformer

    系列文章目录 深度学习NLP(一)之Attention Model; 深度学习NLP(二)之Self-attention, Muti-attention和Transformer 深度学习NLP(三)之 ...

  6. 今日头条李航:深度学习NLP的现有优势与未来挑战

    近日,AI 技术大牛李航博士(已加入今日头条)在<国家科学评论>(National Science Review,NSR)上发表了一篇题为<Deep Learning for Nat ...

  7. 保健中的深度学习nlp技术用于决策

    介绍 (Introduction) The ubiquitous adoption of electronic health records in hospitals and other health ...

  8. Python深度学习-NLP实战:命名实体识别(NER)之分词与序列标注、实体识别任务简介

    系列文章目录 Python深度学习-NLP实战:深度学习系列培训教程 Linux服务器软件的简单使用 Linux命令的简单使用 训练集.测试集.验证集的介绍及制作 字向量的训练与生成 文本分类之SVM ...

  9. 从语言学到深度学习NLP,一文概述自然语言处理

    来源:萤火虫沙龙2 概要:自然语言处理(NLP)近来因为人类语言的计算表征和分析而获得越来越多的关注. 自然语言处理(NLP)近来因为人类语言的计算表征和分析而获得越来越多的关注.它已经应用于许多如机 ...

最新文章

  1. 12×××求职经过-之求职信
  2. 组态王浏览器java_1工程浏览器是组态王的集成开发环境在这里可以
  3. 公司网络推广为你解答蜘蛛为什么有抓取网页却没收录?
  4. Mybatis if test 中int integer判断非空的坑
  5. url与uri的区别
  6. Qt---打印系统时间,毫秒级
  7. 路由器重温——可靠性-接口备份和双机热备份配置管理
  8. linux tab键失灵了,Linux grep \t Tab 键失效
  9. 51nod 牛奶 bfs深度优先搜索
  10. 服务器系统怎么打驱动精灵,win7系统如何使用驱动精灵?教你在win7系统使用驱动精灵的方法...
  11. win7无法打开计算机共享文件夹,Win7共享文件夹无法访问怎么办
  12. IPv6知识概述 - IPv6地址
  13. 快手火山抖音视频(包含其他视频)跨平台操作搬运,下载,消重,全自动操作解放双手...
  14. 【node.js】nvm安装最新教程
  15. 长短期记忆(LSTM)
  16. TensorFlow入门之二:tensorflow手写数字识别
  17. 【CAN总线在汽车行业中的基础应用】
  18. 浅谈煤矿智能化解决方案
  19. VR行业发展的前景和现状?
  20. 不高兴的津津【NOIP2004普及组第1题】

热门文章

  1. Micro Service Architecture
  2. mongodb 百万_1亿条记录的MongoDB数据库随机查询性能测试
  3. python怎样开始做项目_观点|如何开始参与开源项目?
  4. 用python实现简单的队列
  5. Win10 PE出现无法创建新的分区也找不到现有的分区解决方案
  6. win7旗舰版适用的Turbo C
  7. 炫龙笔记本怎么用U盘重装Win10系统?
  8. 【时序】WaveNet 音频生成模型论文笔记
  9. 【项目实战】WaveNet 代码解析 —— train.py 【更新中】
  10. Mockito 教程