转自https://blog.csdn.net/luoxinyurose/article/details/77648347?locationNum=11&fps=1
简单的总结一下最近学的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。
---------------------
作者:萝卜头辛巴
来源:CSDN
原文:https://blog.csdn.net/luoxinyurose/article/details/77648347
版权声明:本文为博主原创文章,转载请附上博文链接!