word2vec

词的表示方法类型

定义:将文字通过一串数字向量表示

  • 词的独热表示:One-hot Representation

NLP 中最直观,也是到目前为止最常用的词表示方法是 One-hot Representation,这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词。比如:

每个词都是茫茫 0 海中的一个 1。这种 One-hot Representation 如果采用稀疏方式存储,会是非常的简洁:也就是给每个词分配一个数字 ID。

  • 特点:
    • 采用稀疏方式 存储,简单易实现
    • 1、向量的维度会随着句子的词的数量类型增大而增大;
    • 2、任意两个词之间都是孤立的,根本无法表示出在语义层面上词语词之间的相关信息,而这一点是致命的。
  • 词的分布式表示:Distributed representation

传统的独热表示( one-hot representation)仅仅将词符号化,不包含任何语义信息。如何将语义融入到词表示中?Harris 在 1954 年提出的分布假说( distributional hypothesis)为这一设想提供了理论基础:上下文相似的词,其语义也相似。

  • Distributed representation 最早由 Hinton在 1986 年提出。它是一种低维实数向量,这种向量一般长成这个样子: [0.792, −0.177, −0.107, 0.109, −0.542, …]
  • 最大的贡献就是让相关或者相似的词,在距离上更接近了

词的分布式方式( distributed representation)

  • 基于矩阵的分布表示
  • 基于聚类的分布表示
  • 基于神经网络的分布表示,名称可以叫做词向量词嵌入( word embedding)分布式表示( distributed representation)
    • 实现方式:神经网络模型,如CBOW、Skip-gram
    • 实现工具:word2vec
    • 那么word2vec就是一种实现词向量的一个工具/方式,分布式词向量并不是word2vec的作者发明的,只是提出了一种更快更好的方式来训练语言模型。连续词袋模型Continous Bag of Words Model(CBOW)和Skip-Gram Model,这两种都是可以训练出词向量的方法,再具体代码操作中可以只选择其一,不过据论文说CBOW要更快一些。
    • 一般说的word2vec词向量,指的是用word2vec训练出来的词向量

word2Vec

word2Vec 本质上也是一个神经语言模型,但是它的目标并构建语言模型本身,而是词向量;因此,其所作的一系列优化,都是为了更快更好的得到词向量

  • word2vec

    提供了两套模型:CBOW和Skip-Gram,其基本思想如下:

    • CBOW在已知context(w)的情况下,预测w
  • Skip-Gram在已知 w的情况下预测context(w)

CBOW

CBOW与2003年Bengio的NNLM结构\不同点在于CBOW去掉了最耗时的投影层,并且所有词共享隐层。

输入层和隐藏层:输入上下文词的平均值与W权重计算,[1,V]x[V, N] = [1, N]得到中间向量h,

公式:
\mathbf{h}=\frac{1}{C} \mathbf{W}^{T}(\mathbf{x} 1+\mathbf{x} 2+\ldots+\mathbf{x} C)=\frac{1}{C}(\mathbf{v} w 1+\mathbf{v} w 2+\ldots+\mathbf{v} w C)^{T}
注:C是输入上下文单词的总数,w1,w2,…,wC是上下文单词,v是单词w的输入向量

隐藏层和输出层:有一个不同的权重矩阵v′=v_ij,这是一个N×V矩阵

公式:
u j=\mathbf{v}_{j j}^{T} \mathbf{h}
输出层接softmax:以得到每个单词的后验概率 公式:
p\left(w_{j} | w_{I}\right)=y_{j}=\frac{\exp \left(u_{j}\right)}{\sum_{j^{\prime}=1}^{\exp \left(u_{j}\right)}}

  • 训练的目标是为了概率最大化:

\max y j_{*}=\max \log y_{j *}=E=-\log p\left(w O | w_{I}, 1, \ldots, w_{I}, C\right)

使得 exp(目标位置的输出)/exp(所有的位置的输出和)的概率最大,目标简写为E,最大化问题会取-号变成最小化问题(常见损失优化都是最小)

API

  • 可以使用python 的gensim库进行词向量训练
  • 使用google word2vec工具。地址: models/tutorials/embedding/word2vec.py
  • Pyspark ml中的Word2Vec训练词向量
    • 模块:from pyspark.ml.feature import Word2Vec
    • API:class pyspark.ml.feature.Word2Vec(vectorSize=100, minCount=5, numPartitions=1, stepSize=0.025, maxIter=1, seed=None, inputCol=None, outputCol=None, windowSize=5, maxSentenceLength=1000)
    • vectorSize=100: 词向量长度 实际应用 100 200 300左右
    • minCount:过滤次数小于默认5次的词
    • windowSize=5:训练时候的窗口大小
    • inputCol=None:输入列名
    • outputCol=None:输出列名

发表评论

邮箱地址不会被公开。 必填项已用*标注