简单神经网络

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

文本表示:从one-hot到word2vec

文本表示的意思是把字词处理成向量或矩阵,以便计算机能进行处理。文本表示是自然语言处理的开始环节。
文本表示分为离散表示和分布式表示
离散表示的代表就是词袋模型,one-hot(也叫独热编码)、TF-IDF、n-gram都可以看作是词袋模型。
分布式表示也叫做词嵌入(word embedding),经典模型是word2vec,还包括后来的Glove、ELMO、GPT和BERT。

  1. 词袋模型:离散、高维、稀疏
    1)One-Hot Encoding:
    独热编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。
    本质上是用一个只含一个 1、其他都是 0 的向量来唯一表示词语。
    2)TF-IDF:https://blog.csdn.net/xh999bai/article/details/89287016
    3)n-gram:n-gram是从一个句子中提取n个连续的字的集合,可以获取到字的前后信息。一般2-gram或者3-gram比较常见。

    文本的离散表示存在着数据稀疏、向量维度过高、字词之间的关系无法度量的问题,适用于浅层的机器学习模型,不适用于深度学习模型。

后续我会再写两篇文章,分析如何用代码实现文本的one-hot编码和TF-IDF编码。

  1. 分布式表示:连续、低维、稠密。
    word2vec是Google于2013年开源推出的一个用于获取词向量的工具包。
    word2vec是一个将词表示为一个向量的工具,通过该向量表示,可以用来进行更深入的自然语言处理,比如机器翻译等。

    word2vec作为神经概率语言模型的输入,其本身其实是神经概率模型的副产品,是为了通过神经网络学习某个语言模型而产生的中间结果。具体来说,“某个语言模型”指的是“CBOW”和“Skip-gram”。具体学习过程会用到两个降低复杂度的近似方法——Hierarchical SoftmaxNegative Sampling。两个模型乘以两种方法,一共有四种实现。

    1)CBOW:CBOW 是 Continuous Bag-of-Words Model 的缩写,是一种根据上下文的词语预测当前词语的出现概率的模型。
    2)Skip-gram:Skip-gram只是逆转了CBOW的因果关系而已,即已知当前词语,预测上下文。

  2. word2vec词向量原理并实践,用来表示文本。

    官方API介绍如下:

class gensim.models.word2vec.Word2Vec(sentences=None, corpus_file=None, size=100, alpha=0.025, window=5, min_count=5, max_vocab_size=None, sample=0.001, seed=1, workers=3, min_alpha=0.0001, sg=0, hs=0, negative=5, ns_exponent=0.75, cbow_mean=1, hashfxn=<built-in function hash>, iter=5, null_word=0, trim_rule=None, sorted_vocab=1, batch_words=10000, compute_loss=False, callbacks=(), max_final_vocab=None)

主要参数介绍如下:
1)sentences:我们要分析的语料,可以是一个列表,或者从文件中遍历读出(word2vec.LineSentence(filename) )。

2) size:词向量的维度,默认值是100。这个维度的取值一般与我们的语料的大小相关,如果是不大的语料,比如小于100M的文本语料,则使用默认值一般就可以了。如果是超大的语料,建议增大维度。

3) window:即词向量上下文最大距离,window越大,则和某一词较远的词也会产生上下文关系。默认值为5,在实际使用中,可以根据实际的需求来动态调整这个window的大小。

如果是小语料则这个值可以设的更小。对于一般的语料这个值推荐在[5;10]之间。

4) sg:即我们的word2vec两个模型的选择了。如果是0, 则是CBOW模型;是1则是Skip-Gram模型;默认是0即CBOW模型。

5) hs:即我们的word2vec两个解法的选择了。如果是0, 则是Negative Sampling;是1的话并且负采样个数negative大于0, 则是Hierarchical Softmax。默认是0即Negative Sampling。

6) negative:即使用Negative Sampling时负采样的个数,默认是5。推荐在[3,10]之间。这个参数在我们的算法原理篇中标记为neg。

7) cbow_mean:仅用于CBOW在做投影的时候,为0,则算法中的xw为上下文的词向量之和,为1则为上下文的词向量的平均值。在我们的原理篇中,是按照词向量的平均值来描述的。个人比较喜欢用平均值来表示xw,默认值也是1,不推荐修改默认值。

8) min_count:需要计算词向量的最小词频。这个值可以去掉一些很生僻的低频词,默认是5。如果是小语料,可以调低这个值。

9) iter:随机梯度下降法中迭代的最大次数,默认是5。对于大语料,可以增大这个值。

10) alpha:在随机梯度下降法中迭代的初始步长。算法原理篇中标记为η,默认是0.025。

11) min_alpha: 由于算法支持在迭代的过程中逐渐减小步长,min_alpha给出了最小的迭代步。
    
训练模型的代码如下:

import logging
import gensim
from gensim.models import word2vec

# 设置输出日志
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

# 直接用gemsim提供的API去读取txt文件,读取文件的API有LineSentence 和 Text8Corpus, PathLineSentences等。
sentences = word2vec.LineSentence("/data4T/share/jiangxinyang848/textClassifier/data/preProcess/wordEmbdiing.txt")

# 训练模型,词向量的长度设置为200, 迭代次数为8,采用skip-gram模型,模型保存为bin格式
model = gensim.models.Word2Vec(sentences, size=200, sg=1, iter=8)  
model.wv.save_word2vec_format("./word2Vec" + ".bin", binary=True) 

# 加载bin格式的模型
wordVec = gensim.models.KeyedVectors.load_word2vec_format("word2Vec.bin", binary=True)

参考资料

  1. 机器学习之One-Hot Encoding详解 https://www.jianshu.com/p/cb344e1c860a
  2. word2vec学习小记 https://www.jianshu.com/p/418f27df3968
  3. 文本离散表示(一):词袋模型(bag of words) https://www.cnblogs.com/Luv-GEM/p/10543612.html
  4. word2vec2:word2vec原理推导与代码分析-码农场 http://www.hankcs.com/nlp/word2vec.html
  5. 文本分类实战(一)—— word2vec预训练词向量 https://www.cnblogs.com/jiangxinyang/p/10207273.html