word2vec总结

来源:互联网 发布:淘宝外围会场有流量吗 编辑:程序博客网 时间:2024/06/07 00:04

简单的总结一下最近学的word2vec

不知道自然语言处理有没有发展前景,先学了再说,只有好处没有坏处。

word2vec将词转化为向量,可以为后续的处理,比如说生成歌词,生成唐诗之类的应用做铺垫。

生成一个word2vec模型可以分成2个大步骤,1,数据预处理,2,生成模型

其中数据预处理是比较重要的一个环节,包括,分词,去掉符号等等,而生成模型相对比较简单,用gensim导出word2vec库即可。

下面具体的说明一下:

1,数据预处理

wiki百科获得的数据都是繁体的,需要用opencc这个工具将繁体转为简体中文。

word2vec导入的数据是一个句子一个句子的,句子里面需要是一个一个的单词,所以需要进行分词,这里用jieba分词器进行分词。

数据中有很多标点符号是不需要的,所以要进行去标点处理。

2,生成模型

用gensim库导出word2vec,设置窗口大小,文件等等。

保存模型


下面介绍一下word2vec的原理:

所谓的word2vec,就是指将单词向量化,将某个单词用特定的向量来表示。然后将其应用于各种机器学习的算法中去。

其实word2vec做的事情很简单,大致来说,就是构建了一个多层神经网络,然后在给定文本中获取对应的输入和输出,在训练过程中不断修正神经网络的参数,最后得到

词向量。

word2vec的语言模型

所谓的语言模型,就是指对自然语言进行假设和建模,使得能够用计算机能够理解的方式来表达自然语言。其用的是n-gram model,即假设一个词只与周围n个词有关系,

与文本中的其他词无关。

CBOW(continuous bag-of-word model)模型和skip-gram模型。前者根据输入周围的n-1个词来预测出这个词本身,后者根据词本身预测周围有哪些词。意思就是前者的输入是某个词周围的n个单词的词向量之和,输出是词本身的词向量。后者的输入是词本身,输出是词周围的n个单词的词向量(循环n遍)。

基于hierarchical softmax(分层softmax)的模型:

理论上说,无论CBOW模型还是skip_gram模型,具体的实现都可以用神经网络来完成,但是计算量太大了。

解决的办法就是采用hierarchical softmax的思想,将一次分类分解为多次分类,

从输入到输出,中间是一个树形结构,其中每一个节点都完成一个二分类,那么就存在一个如何建树的问题。

这里采用huffman树,这样构建的话,出现频率越高的词所经过的路径越短,使得所有单词的平均路径长度达到最短。



word2vec大概流程

分词、词干提取和词形还原。难点在于将一个个句子分解成一个单词数组。

构造词典,统计词频。遍历所有文本,找出所有出现过的词,并统计各词的出现频率。

构造树形结构。依照出现概率构造huffman树。所有分类都应该处于叶节点。

生成节点所在的二进制码。反映节点在树中的位置。

初始化各非叶节点的中间向量和叶节点中的词向量。叶节点中存储的是各词的词向量,作为神经网络的输入。非叶节点存储的是中间向量,对用于神经网络中隐含层的参数,与输入一起决定分类结果。

训练中间向量和词向量。对于单个单词,最多只改变其路径上的节点的中间向量,而不会改动其他节点。


具体实现:

分词。直接用jieba分词

统计词频。统计加过滤工作,过滤掉频率太低和太高的,比如说停用词(网上一大把)(逗号,句号等等)。

huffman树的构造。首先是树的构造,具体的做法可以用下列伪码描述:

while(单词列表长度>1)

从单词列表中挑选出出现频率最小的两个单词;

创建一个新的中间节点,其左右节点分别是之前的两个单词节点;

从单词列表中删除那两个单词节点并插入新的中间节点;

huffman码的生成。假设一个节点的huffman码为“xx”,那么其左节点的码为“xx1”,右节点的码为“xx0”,从上到下知道叶节点,由此生成所有huffman码。

这一过程需要遍历所有节点。

CBOW模型。

huffman树中非叶子节点存储的中间向量的初始化值是零向量,叶子节点对应的单词的词向量是随机初始化的。

训练流程:

构建好huffman树和向量初始化之后,进行训练,输入层,映射层,输出层

输入层就是词周围的几个单词的词向量,映射层就是几个单词词向量相加。

映射层到输出层:

根据已知路径(huffman码),按照路径从上往下依次修正路径上各节点的中间向量,根据中间向量进行2分类,如果错误,则修正中间向量,并记录误差量

处理完所有节点,达到叶节点后,根据之前累计的误差来修正词向量。这样一个词的处理流程就结束了。

skip_gram 模型同理就行。


word2vec中的数学:



总结:word2vec总的来说不是很难,主要是理解什么是hierarchical softmax(分层softmax),还有huffman树,huffman码,以上都是为了减少计算量

减少内存开销而设计的,在理解word2vec原理的基础上,怎么使用word2vec也是很重要的,下一篇,我将在windows下,用eclispe编译器详细的介绍怎么用python

对中文数据进行word2vec。




原创粉丝点击