NLP TASK4 文本表示:从one-hot到word2vec

任务描述

词袋模型:离散、高维、稀疏。
分布式表示:连续、低维、稠密
word2vec词向量原理并实践,用来表示文本。

word2vec原理

词向量

向量空间模型(VSM)是一类被提出表示文本信息的方法,该模型的思想是通过一种向量化的方式对文本数据进行表示,根据该向量空间模型的思想,词向量的概念开始引入。第一种使用词向量对文本数据进行表示的方法被称为独热编码(One-hot)表示方法,该方法对文本单词进行独热编码,单词使用One-hot表示。该词向量是这样一种形式,向量中每一维都代表了一个词语,如果目标词语和某一维代表的词语相等,则该维度的数值为1,其他维度都为0。该方法虽然理解和表示简单,但也存在几个明显的缺点,其一在于该向量的长度和语料中词语的数量有关,且只有当目标单词和向量元素一致时该元素才为1,其他元素都为0,是一个非常稀疏的向量,这会带来沉重的存储和计算方面的问题。其二在于使用One-hot形式对词语进行表征,该方法忽视了文本数据中上下文之间的联系,使得每个单词被当成独立的元素,并且不同词语之间的距离变得难以度量,因为不同单词之间的距离都是1,这样就很难通过距离来定义相似或完全相反的词语。第二种词向量的表达方式是Hinton提出的,是一种词语的分布式表征,主要思想是通过词语的上下文单词对目标词汇进行训练刻画的,它能将每个单词刻画成一个等长的向量,使用这种方法训练的词向量,还有一个特点就是,相似的词语在空间中位置接近,这样就将每个单词的表示和该词的上下文建立了联系,通过词向量在空间中距离的度量,就能得到不同单词的近似词。

word2vec

Word2vec算法的提出是改进Bengio提出的神经网络语言模型,经过中间层和输出层的优化,Word2vec方法极大节约了训练时间,也有着极高的准确率。该词向量方法主要有两种语言模型,CBOW(Continuous Bag-of-Words Model)模型和Skip-gram(Continuous Skip-gram Model)模型。CBOW模型的原理图为
NLP TASK4 文本表示:从one-hot到word2vec_第1张图片
Skip-gram模型的原理图为
NLP TASK4 文本表示:从one-hot到word2vec_第2张图片

使用范例

下面使用gensim词向量训练

from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
import pickle 
import os
import pandas as pd
import numpy as np
# sg ({0, 1}, optional) – Training algorithm: 1 for skip-gram; otherwise CBOW.
# hs ({0, 1}, optional) – If 1, hierarchical softmax will be used for model training. If 0, and negative is non-zero, negative sampling will be used.
# 将语料导入进入训练
model_cb_neg = Word2Vec(LineSentence('./word2vec.txt'),min_count=1,size=200,iter=20,seed=666,sg=0,hs=0)
model_cb_hier = Word2Vec(LineSentence('./word2vec.txt'),min_count=1,size=200,iter=20,seed=666,sg=0,hs=1)
model_sp_neg = Word2Vec(LineSentence('./word2vec.txt'),min_count=1,size=200,iter=20,seed=666,sg=1,hs=0)
model_sp_hier = Word2Vec(LineSentence('./word2vec.txt'),min_count=1,size=200,iter=20,seed=666,sg=1,hs=1)

#将单词和对应词向量构建向量字典
# model = Word2Vec.load('word2vec')
w2v_cb_neg = dict(zip(model_cb_neg.wv.vocab.keys(), [model_cb_neg[each] for each in model_cb_neg.wv.vocab.keys()]))
w2v_cb_hier = dict(zip(model_cb_hier.wv.vocab.keys(), [model_cb_hier[each] for each in model_cb_hier.wv.vocab.keys()]))
w2v_sp_neg = dict(zip(model_sp_neg.wv.vocab, [model_sp_neg[each] for each in model_sp_neg.wv.vocab.keys()]))
w2v_sp_hier = dict(zip(model_sp_hier.wv.vocab, [model_sp_hier[each] for each in model_sp_hier.wv.vocab.keys()]))

#后续可根据训练的词向量进行文本分类,情感分类等任务。

小结

word2vec算法的使用不难,但是里面训练的细节和两种优化的训练方法的细节,理解起来需要一定时间。

参考资料

https://blog.csdn.net/itplus/article/details/37969519
http://www.hankcs.com/nlp/word2vec.html

你可能感兴趣的:(python,机器学习)