关于NLP

转自博主 http://licstar.net/archives/328

1.词向量

  • One-hot Representation:每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词。例如:
    “话筒”表示为 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 …]
    “麦克”表示为 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 …]
    每个词都是茫茫 0 海中的一个 1。

这种 One-hot Representation 如果采用稀疏方式存储,会是非常的简洁:也就是给每个词分配一个数字 ID。比如刚才的例子中,话筒记为 3,麦克记为 8(假设从 0 开始记)。如果要编程实现的话,用 Hash 表给每个词分配一个编号就可以了。这么简洁的表示方法配合上最大熵、SVM、CRF 等等算法已经很好地完成了 NLP 领域的各种主流任务。

然而这种表示方法也存在一个重要的问题就是“词汇鸿沟”现象:任意两个词之间都是孤立的。光从这两个向量中看不出两个词是否有关系,哪怕是话筒和麦克这样的同义词也不能幸免于难。

  • Distributed Representation:将庞大的词汇表,从一个高维空间映射到一个低维空间中,而又尽量保存不同词之间差异性

这种向量一般长成这个样子:[0.792, −0.177, −0.107, 0.109, −0.542, …]。

Distributed representation 最大的贡献就是让相关或者相似的词,在距离上更接近了。向量的距离可以用最传统的欧氏距离来衡量,也可以用 cos 夹角来衡量。用这种方式表示的向量,“麦克”和“话筒”的距离会远远小于“麦克”和“天气”。可能理想情况下“麦克”和“话筒”的表示应该是完全一样的,但是由于有些人会把英文名“迈克”也写成“麦克”,导致“麦克”一词带上了一些人名的语义,因此不会和“话筒”完全一致。

2. 词向量的训练

要介绍词向量是怎么训练得到的,就不得不提到语言模型。到目前为止所有训练方法都是在训练语言模型的同时,顺便得到词向量的。

2.0语言模型

语言模型形式化的描述就是给定一个字符串,看它是自然语言的概率
P ( w 1 , w 2 , , w t ) P(w_1, w_2, …, w_t) 。w1到 wt依次表示这句话中的各个词。
有个很简单的推论是:
P ( w 1 , w 2 , , w t ) = P ( w 1 ) × P ( w 2 w 1 ) × P ( w 3 w 1 , w 2 ) × × P ( w t w 1 , w 2 , , w t 1 ) P(w_1, w_2, …, w_t) = P(w_1) \times P(w_2 | w_1) \times P(w_3 | w_1, w_2) \times … \times P(w_t | w_1, w_2, …, w_{t-1}) 。常用的语言模型都是在近似地求 P ( w t w 1 , w 2 , , w t 1 ) P(w_t | w_1, w_2, …, w_{t-1}) 。如:n-gram模型是一种近似策略,作了一个马尔可夫假设:认为目标词wt的条件概率只与其之前的n−1个词有关。

猜你喜欢

转载自blog.csdn.net/FK103/article/details/83061479
NLP