word2vec词向量原理

  • 一、词的表示
  • 1.1离散表示(one-hot representation)
  • 1.2分布式表示(distribution representation)

一、词的表示

word2vec也叫word embeddings,中文名“词向量”,作用就是将自然语言中的字词转为计算机可以理解的稠密向量(Dense
Vector)。在word2vec出现之前,自然语言处理经常把字词转为离散的单独的符号,也就是One-Hot Encoder。

在自然语言处理任务中,首先需要考虑词如何在计算机中表示。通常,有两种表示方式:one-hot representation和distribution representation。

1.1离散表示(one-hot representation)

传统的基于规则或基于统计的自然语义处理方法将单词看作一个原子符号 被称作one-hot representation。
one-hot representation把每个词表示为一个长向量。这个向量的维度是词表大小,向量中只有一个维度的值为1,其余维度为0,这个维度就代表了当前的词。

例如: 苹果 [0,0,0,1,0,0,0,0,0,……]

one-hot representation相当于给每个词分配一个id,这就导致这种表示方式不能展示词与词之间的关系。另外,one-hot representation将会导致特征空间非常大,但也带来一个好处,就是在高维空间中,很多应用任务线性可分。

1.2分布式表示(distribution representation)

word embedding指的是将词转化成一种分布式表示,又称词向量。分布
式表示将词表示成一个定长的连续的稠密向量。

分布式表示优点:
(1)词之间存在相似关系:
是词之间存在“距离”概念,这对很多自然语言处理的任务非常有帮助。
(2)包含更多信息:
词向量能够包含更多信息,并且每一维都有特定的含义。在采用one-hot特征时,可以对特征向量进行删减,词向量则不能。

模型拆解
word2vec模型其实就是简单化的神经网络。


输入是One-Hot Vector,Hidden Layer没有激活函数,也就是线性的单元。Output Layer维度跟Input Layer的维度一样,用的是Softmax回归。我们要获取的dense vector其实就是Hidden Layer的输出单元。有的地方定为Input Layer和Hidden Layer之间的权重,其实说的是一回事。

CBOW与Skip-Gram模式
word2vec主要分为CBOW(Continuous Bag of Words)和Skip-Gram两种模式。CBOW是从原始语句推测目标字词;而Skip-Gram正好相反,是从目标字词推测出原始语句。CBOW对小型数据库比较合适,而Skip-Gram在大型语料中表现更好。
对同样一个句子:Hangzhou is a nice city。我们要构造一个语境与目标词汇的映射关系,其实就是input与label的关系。
这里假设滑窗尺寸为1(滑窗尺寸……这个……不懂自己google吧-_-|||)
CBOW可以制造的映射关系为:[Hangzhou,a]—>is,[is,nice]—>a,[a,city]—>nice
Skip-Gram可以制造的映射关系为(is,Hangzhou),(is,a),(a,is), (a,nice),(nice,a),(nice,city)

训练优化
额,到这里,你可能会注意到,这个训练过程的参数规模非常巨大。假设语料库中有30000个不同的单词,hidden
layer取128,word2vec两个权值矩阵维度都是[30000,128],在使用SGD对庞大的神经网络进行学习时,将是十分缓慢的。而且,你需要大量的训练数据来调整许多权重,避免过度拟合。数以百万计的重量数十亿倍的训练样本意味着训练这个模型将是一个野兽。
一般来说,有Hierarchical Softmax、Negative Sampling等方式来解决。

三、实战

"""
Created on 2019/4/10
@author: Michael
""""""
1 简介  :根据官方给的数据集中'的word_seg'内容,训练词向量,生成word_idx_dict和vectors_arr两个结果,并保存
2 注意  :1)需要16g内存的电脑,否则由于数据量大,会导致内存溢出。(解决方案:可通过迭代器的格式读入数据。见https://rare-technologies.com/word2vec-tutorial/#online_training__resuming)
"""import pandas as pd
import gensim
import time
import pickle
import numpy as np
import csv, sysvector_size = 100maxInt = sys.maxsize
decrement = True
while decrement:# decrease the maxInt value by factor 10# as long as the OverflowError occurs.decrement = Falsetry:csv.field_size_limit(maxInt)except OverflowError:maxInt = int(maxInt / 10)decrement = True# =======================================================================================================================
# 0 辅助函数
# =======================================================================================================================def sentence2list(sentence):return sentence.strip().split()start_time = time.time()data_path = 'D:/ML/competition/daguan/new_data/'
feature_path = 'D:/ML/competition/daguan/new_data/'
# =======================================================================================================================
# 1 准备训练数据
# =======================================================================================================================print("准备数据................ ")
df_train = pd.read_csv(data_path + 'train_set.csv', engine='python')
df_test = pd.read_csv(data_path + 'test_set.csv', engine='python')
sentences_train = list(df_train.loc[:, 'word_seg'].apply(sentence2list))
sentences_test = list(df_test.loc[:, 'word_seg'].apply(sentence2list))
sentences = sentences_train + sentences_test
print("准备数据完成! ")# =======================================================================================================================
# 2 训练
# =======================================================================================================================
print("开始训练................ ")
model = gensim.models.Word2Vec(sentences=sentences, size=vector_size, window=5, min_count=5, workers=8, sg=0, iter=5)
print("训练完成! ")# =======================================================================================================================
# 3 提取词汇表及vectors,并保存
# =======================================================================================================================
print(" 保存训练结果........... ")
wv = model.wv
vocab_list = wv.index2word
word_idx_dict = {}
for idx, word in enumerate(vocab_list):word_idx_dict[word] = idxvectors_arr = wv.vectors
vectors_arr = np.concatenate((np.zeros(vector_size)[np.newaxis, :], vectors_arr), axis=0)  # 第0位置的vector为'unk'的vectorf_wordidx = open(feature_path + 'word_seg_word_idx_dict.pkl', 'wb')
f_vectors = open(feature_path + 'word_seg_vectors_arr.pkl', 'wb')
pickle.dump(word_idx_dict, f_wordidx)
pickle.dump(vectors_arr, f_vectors)
f_wordidx.close()
f_vectors.close()
print("训练结果已保存到该目录下! ")end_time = time.time()
print("耗时:{}s ".format(end_time - start_time))

https://blog.csdn.net/class_brick/article/details/78908984
https://blog.csdn.net/mawenqi0729/article/details/80698350

word2vec词向量原理相关推荐

  1. 深度学习(四十二)word2vec词向量学习笔记

    word2vec词向量学习笔记 原文地址:http://blog.csdn.net/hjimce/article/details/51564783 个人微博:黄锦池-hjimce 一.使用原版word ...

  2. word2vec词向量训练及中文文本类似度计算

    本文是讲述怎样使用word2vec的基础教程.文章比較基础,希望对你有所帮助! 官网C语言下载地址:http://word2vec.googlecode.com/svn/trunk/ 官网Python ...

  3. word2vec实例详解python_在python下实现word2vec词向量训练与加载实例

    项目中要对短文本进行相似度估计,word2vec是一个很火的工具.本文就word2vec的训练以及加载进行了总结. word2vec的原理就不描述了,word2vec词向量工具是由google开发的, ...

  4. 乱炖“简书交友”数据之代码(2):关键词抽取、Word2Vec词向量

    继续更新出来本系列的代码:乱炖数据之2700余篇"简书交友"专题文章数据的花式玩法 在乱炖"简书交友"数据之代码(1)一文里,主要涉及结构化数据的分析,文本挖掘 ...

  5. 自然语言处理(NLP):23 Word2Vec词向量研究以及实践

    本文主要同大家分享word2vec原理以及应用,通过文本相似度和新闻文本分类为案例进行展开,最后对词向量技术发展进行简述. 作者:走在前方 博客:https://wenjie.blog.csdn.ne ...

  6. 【python gensim使用】word2vec词向量处理中文语料

    word2vec介绍 word2vec官网:https://code.google.com/p/word2vec/ word2vec是google的一个开源工具,能够根据输入的词的集合计算出词与词之间 ...

  7. NLP—word2vec词向量简介

    NLP处理的数据都是文字,而文字是无法直接被计算机计算的,于是人们想出了使用独热编码的方式来表示单词. <span style="font-size:16px;">浙江 ...

  8. word2vec词向量 文本分类实现(TensorFlow版,算法TextCNN)

    之前也写过word2vec词向量文本分类实现,不过那是基于Keras. 今天来写下tensoflow版的代码. 再来感受下它的魅力. tensorflow比Keras更接近底层,可以更方便让我们理解W ...

  9. python训练Word2Vec词向量

    一.模型训练 1.安装gensim pip install gensim gensim中封装了包括word2vec.doc2vec等模型,word2vec采用了CBOW(Continuous Bag- ...

最新文章

  1. linux c 报错 warning: large integer implicitly truncated to unsigned type[-Woverflow]
  2. WebService Software Factory 设计草图
  3. Spring mvc+ maven + MyBatis + Oracle + IDEA 项目搭建 - framework 进阶中(一)
  4. uniyu 雷达波束_Unity使用TUIO协议接入雷达
  5. Unity 旋转角度计算
  6. HNUCM 1366 绿地装饰解题报告 (模拟)
  7. 免费的移动硬盘数据恢复软件EasyRcovery15
  8. 计组复习-cache
  9. java 小球抛物线_vue 2.0 购物车小球抛物线
  10. XILINX FPGA+RK3399 PCIE X4
  11. 北朝皇帝简介-20170610
  12. 【Mysql】Mysql事务隔离界别及其实现原理
  13. ASEMI整流桥DB107有什么用
  14. 【blender】动画导出方法
  15. NABCD---生活日历
  16. 基于单片机的无线红外报警系统-单片机课设毕设资料
  17. 道路裂缝伸缩缝灌缝选用沥青灌封胶的另外一个原因
  18. 实验三:Java迷宫生成
  19. 计算机应用类专业综合模拟试卷一,计算机应用专业综合模拟试卷一.docx
  20. 【转】基于TMS320C6455的千兆以太网设计

热门文章

  1. 使用C#VB.NET将XPS转换为JPG或PNG图像
  2. CodeForces - 985E(Pencils and Boxes)
  3. 2017年6月大学英语六级真题(第一套)汉译英(每日一摸)
  4. 解决Win10中MSCOMM32.ocx没注册问题
  5. 江苏2021年计算机二级报名时间,江苏3月计算机二级考试报名时间安排
  6. 人生最难的事情是什么?
  7. SQL Server 2008+ 性能调优
  8. 滴水逆向 C语言基础学习
  9. 某行“软件最佳实践与沙盘演练”企业内训开始!
  10. oracle ocm认证概述