当前位置:   article > 正文

【深度学习】NLP自然语言处理_在进行词频统计时使用阈值方法

在进行词频统计时使用阈值方法

词向量与词嵌入

语言模型

语言模型通俗的将就是判断一句话是不是正常人说出来的。统计语言模型是所有 NLP的基础,被广泛应用与语音识别、机器翻译、分词、词性标注和信息检索等任务。传统的统计语言模型是表示语言基本单位(一般为句子)的概率分布函数,这个概率分布也是该语言的生成模型。通俗的讲,如果一句话没有在语料库中出现,可以模拟句子的生成的方式,生成句子在语料库中的概率。一般语言模型可以使用各个词语条件概率的形式表示:
在这里插入图片描述
其中,Context 为 w_i 的上下文表示。根据 Context 的表示差异,统计语言模型又可以分为不同的类别,其中最具代表性的有 n-gram 语言模型及 nn 语言模型:

N-gram

自然语言处理(NLP)中一个非常重要的概念,通常在 NLP 中,人们基于一定的语料库,可以利用 N-gram 来做以下几类事情:

  1. 预计或者评估一个句子是否合理
  2. 评估两个字符串之间的差异程度,这也是模糊匹配中常用的一种手段
  3. 语音识别
  4. 机器翻译
  5. 文本分类

概率模型

统计语言模型实际上是一个概率模型,所以常见的概率模型都可以用于求解这些参数。

常见的概率模型有:N-gram 模型、决策树、最大熵模型、隐马尔可夫模型、条件随机场、神经网络等。目前常用于语言模型的是 N-gram 模型和神经语言模型。

可靠性与可区别性

假设没有计算和存储限制,n 是不是越大越好?
早期因为计算性能的限制,一般最大取到 n=4;如今,即使 n>10 也没有问题,但是,随着 n 的增大,模型的性能增大却不显著,这里涉及了可靠性与可区别性的问题。
参数越多,模型的可区别性越好,但是可靠性却在下降——因为语料的规模是有限的,导致 count(W) 的实例数量不够,从而降低了可靠性

OOV 问题

OOV 即 Out Of Vocabulary,也就是序列中出现了词表外词,或称为未登录词,或者说在测试集和验证集上出现了训练集中没有过的词。
一般解决方案:

  1. 设置一个词频阈值,只有高于该阈值的词才会加入词表
  2. 所有低于阈值的词替换为 UNK(一个特殊符号)
    无论是统计语言模型还是神经语言模型都是类似的处理方式

平滑处理

count(W) = 0 是怎么办?

平滑方法:
Add-one Smoothing (Laplace)

神经网络语言模型(NPLM)

在这里插入图片描述

  1. 其中 g 表示神经网络,i_w 为 w 在词表中的序号,context(w) 为 w 的上下文,
    V_context 为上下文构成的特征向量。
  2. V_context 由上下文的词向量进一步组合而成

N-gram 神经语言模型

在这里插入图片描述这是一个经典的神经概率语言模型,它沿用了 N-gram 模型中的思路,将 w 的前 n-1 个词作为 w 的上下文 context(w),而 V_context 由这 n-1 个词的词向量拼接而成,即
在这里插入图片描述1. 其中 c(w) 表示 w 的词向量
2. 不同的神经语言模型中 context(w) 可能不同,比如 Word2Vec 中的 CBOW 模型
3. 每个训练样本是形如 (context(w), w) 的二元对,其中 context(w) 取 w 的前 n-1
个词;当不足 n-1,用特殊符号填充
4. 同一个网络只能训练特定的 n,不同的 n 需要训练不同的神经网络

N-gram 神经语言模型的网络结构

在这里插入图片描述【输入层】首先,将 context(w) 中的每个词映射为一个长为 m 的词向量,词向量在
训练开始时是随机的,并参与训练;
【投影层】将所有上下文词向量拼接为一个长向量,作为 w 的特征向量,该向量的维
度为 m(n-1)
【隐藏层】拼接后的向量会经过一个规模为 h 隐藏层,该隐层使用的激活函数为 tanh
【输出层】最后会经过一个规模为 N 的 Softmax 输出层,从而得到词表中每个词作为下一个词的概率分布

其中 m, n, h 为超参数,N 为词表大小,视训练集规模而定,也可以人为设置阈值
训练时,使用交叉熵作为损失函数。当训练完成时,就得到了 N-gram 神经语言模型,以及副产品词向量

整个模型可以概括为如下公式:
在这里插入图片描述

CBOW

在这里插入图片描述
需要注意的是:对于任意的单词,Input layer 和 Hidden Layer 之间的权重矩阵 W 是
参数共享的

  1. 输入层:上下文单词的 onehot. {假设单词向量空间 dim 为 V,上下文单词个数为 C}
  2. 所有 onehot 分别乘以共享的输入权重矩阵 W. {V*N 矩阵,N 为自己设定的数,初始
    化权重矩阵 W}
  3. 所得的向量 {因为是 onehot 所以为向量} 相加求平均作为隐层向量, size 为 1*N.
  4. 乘以输出权重矩阵 W’ {N*V}
  5. 得到向量 {1*V} 激活函数处理得到 V-dim 概率分布 {PS: 因为是 onehot 嘛,其中的
    每一维斗代表着一个单词},概率最大的 index 所指示的单词为预测出的中间词(target
    word)
  6. 与 true label 的 onehot 做比较,误差越小越好

所以,需要定义 loss function(一般为交叉熵代价函数),采用梯度下降算法更新 W和 W’。训练完毕后,输入层的每个单词与矩阵 W 相乘得到的向量的就是我们想要的词向量(word embedding),这个矩阵(所有单词的 word embedding)也叫做 look up table(其实这个 look up table 就是矩阵 W 自身),也就是说,任何一个单词的 onehot 乘以这个矩阵都将得到自己的词向量。有了 look up table 就可以免去训练过程直接查表得到单词的词向量了。

假设我们现在的 Corpus 是这一个简单的只有四个单词的 document:

{I drink coffee everyday}
  • 1

我们选 coffee 作为中心词,window size 设为 2。
也就是说,我们要根据单词"I","drink"和"everyday"来预测一个单词,并且我们希望这个单词是 coffee。
在这里插入图片描述假设我们此时得到的概率分布已经达到了设定的迭代次数,那么现在我们训练出来的look up table 应该为矩阵 W。即,任何一个单词的 one-hot 表示乘以这个矩阵都将得到自己的 word embedding。

Continuous Bag-of-Word Mode(l 连续词袋模型)和 skip-gram mode(l 跳字模型),分别对应了词向量的两种训练方法:利用 context 预测中心词以及利用中心词去预测context。

对于连续词袋模型(CBOW)来说,一般的做法是先对每个单词进行 one-of-N编码(one-hot encoded),作为训练网络的输入,接着构建一层 hidden layer,最后构建输出层,这一层是一个 softmax 层,每个 context 单词到中心单词的事件都被认为是独立的,所以将这些事件发生的概率相乘,最后构建损失函数,即:将输出概率分布和实际选中的词概率分布进行 Corss Entropy 计算,接下来使用 SGD 对参数进行更新。这里,hidden layer 的训练结果就是最终的 word vector 了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/348035?site
推荐阅读
相关标签
  

闽ICP备14008679号