自然语言处理

这里写自定义目录标题

  • 欢迎使用Markdown编辑器
    • 新的改变
    • 功能快捷键
    • 合理的创建标题,有助于目录的生成
    • 如何改变文本的样式
    • 插入链接与图片
    • 如何插入一段漂亮的代码片
    • 生成一个适合你的列表
    • 创建一个表格
      • 设定内容居中、居左、居右
      • SmartyPants
    • 创建一个自定义列表
    • 如何创建一个注脚
    • 注释也是必不可少的
    • KaTeX数学公式
    • 新的甘特图功能,丰富你的文章
    • UML 图表
    • FLowchart流程图
    • 导出与导入
      • 导出
      • 导入

词表示是自然语言处理的基础,一个好的词向量在很大程度上决定了后续任务的上限。本文是我最近学习该部分内容的笔记,主要参照的是基于神经网络的词和文档语义向量表示方法研究一文,穿插了一些个人理解。内容较多,错误难免,请拍砖~


分布表示(Distributional Representation)假说:上下文相似的词,其语义也相似。根据建模方式的不同,主要分为三类:基于矩阵的分布表示、基于聚类的分布表示和基于神经网络的分布表示。
尽管不同的分布表示方法使用了不同的技术手段获取词表示,但由于这些方法均基于分布假说,它们的核心思想也都由两部分组成:

  1. 选择一种方式描述上下文
  2. 选择一种模型刻画目标词与其上下文之间的关系。

基于矩阵的分布表示

基于矩阵的分布表示通常又称为分布语义模型(distributional semantic models)。这类方法需要构建一个“词-上下文”矩阵,从矩阵中获取词的表示。在“词-上下文”矩阵中,每行对应一个词,每列表示一种不同的上下文,矩阵中的每个元素对应相关词和上下文的共现次数。在这种表示下,矩阵中的一行,就成为了对应词的表示,这种表示描述了该词的上下文的分布。由于分布假说认为上下文相似的词,其语义也相似,因此在这种表示下,两个词的语义相似度可以直接转化为两个向量的空间距离。这类方法具体可以分为三个步骤:

  1. 选取上下文。最常见的有三种方法:第一种,将词所在的文档作为上下文,形成“词-文档”矩阵(term-document matrix);第二种,将词附近上下文中的各个词(如上下文窗口中的5个词)作为上下文,形成“词-词”矩阵;第三种,将词附近上下文各词组成的n-gram作为上下文 。在这三种方法中,“词-文档”矩阵非常稀疏,而“词-词”矩阵相对较为稠密,效果一般好于前者。“词-n-gram”相对“词-词”矩阵保留了词序信息,建模更精确,但由于比前者更稀疏,实际效果不一定能超越前者。
  2. 确定矩阵中各元素的值。“词-上下文”共现矩阵根据其定义,里面各元素的值应为词与对应的上下文的共现次数。然而直接使用原始共现次数作为矩阵的值在大多数情况下效果并不好,因此研究人员提出了多种加权和平滑方法,最常用的有tf-idf、PMI 和直接取log。
  3. 矩阵分解(可选)。在原始的“词-上下文”矩阵中,每个词表示为一个非常高维(维度是不同上下文的总个数)且非常稀疏的向量,使用降维技术可以将这一高维稀疏向量压缩成低维稠密向量。降维技术可以减少噪声带来的影响,但也可能损失一部分信息。最常用的分解技术包括奇异值分解(SVD)、非负矩阵分解(NMF)、典型关联分析(Canonical Correlation Analysis,CCA)、Hellinger PCA(HPCA)。

著名的 Global Vector模型(GloVe)就是基于矩阵的分布表示

基于聚类的分布表示(分布聚类)

基于聚类的分布表示又称作分布聚类(distributional clustering),这类方法通过聚类手段构建词与其上下文之间的关系。其中最经典的方法是布朗聚类(Brown clustering)。布朗聚类是一种层级聚类方法,聚类结果为每个词的多层类别体系。因此可以根据两个词的公共类别判断这两个词的语义相似度。

这个方法似乎没有太多主流的应用,所以我没有做深入研究

基于神经网络的分布表示(词向量)

基于神经网络的分布表示一般称为词向量、词嵌入(word embedding)或分布式表示(distributed representation)。神经网络词向量表示技术通过神经网络技术对上下文,以及上下文与目标词之间的关系进行建模。由于神经网络较为灵活,这类方法的最大优势在于可以表示复杂的上下文。在前面基于矩阵的分布表示方法中,最常用的上下文是词。如果使用包含词序信息的n-gram作为上下文,当n增加时,n-gram的总数会呈指数级增长,此时会遇到维数灾难问题。而神经网络在表示n-gram时,可以通过一些组合方式对n个词进行组合,参数个数仅以线性速度增长。有了这一优势,神经网络模型可以对更复杂的上下文进行建模,在词向量中包含更丰富的语义信息。
神经网络词向量模型与其它分布表示方法一样,均基于分布假说,核心依然是上下文的表示以及上下文与目标词之间的关系的建模。构建上下文与目标词之间的关系,最自然的一种思路就是使用语言模型。

语言模型

语言模型可以对一段文本的概率进行估计,对信息检索、机器翻译、语音识别等任务有着重要的作用。形式化讲,统计语言模型的作用是为一个长度为的字符串确定一个概率分布,表示其存在的可能性,其中到依次表示这段文本中的各个词。一般在实际求解过程中,通常采用下式计算其概率值:

在实践中,如果文本的长度较长,上述公式右部的估算会非常困难。因此,研究者们提出使用一个简化模型:n元模型(n-gram model)。在n元模型中估算条件概率时,距离大于等于n的上文词会被忽略,也就是对上述条件概率做了以下近似:

在元模型中,传统的方法一般采用频率计数的比例来估算元条件概率:

其中,表示文本序列在语料中出现的次数。
为了更好地保留词序信息,构建更有效的语言模型,我们希望在元模型中选用更大的。但是,当较大时,长度为序列出现的次数就会非常少,在按照上述公式估计元条件概率时,就会遇到数据稀疏问题,导致估算结果不准确。因此,一般在百万词级别的语料中,三元模型是比较常用的选择,同时也需要配合相应的平滑算法,进一步降低数据稀疏带来的影响。
为了更好地解决元模型估算概率时遇到的数据稀疏问题,神经网络语言模型应运而生。

神经网络语言模型(NNLM)

神经网络语言模型(Neural Network Language Model ,NNLM)在学习语言模型的同时,也能得到词向量。
NNLM 同样也是对n 元语言模型进行建模,估算的值。但与传统方法不同的是,NNLM 不通过计数的方法对元条件概率进行估计,而是直接通过一个神经网络结构,对其进行建模求解。下图展示了NNLM 的基本结构。

自然语言处理_第1张图片
NNLM模型

具体而言,对语料中一段长度为的序列,元语言模型需要最大化以下概率:

其中, 为需要通过语言模型预测的词(目标词)。对于整个模型而言,输入为条件部分的整个词序列:,输出为目标词的分布。而神经网络的目标就是要让输出中,(目标词)的概率最大。
神经网络语言模型采用普通的三层前馈神经网络结构,其中第一层为输入层。Bengio提出使用各词的词向量作为输入以解决数据稀疏问题,因此输入层为词的词向量的顺序拼接:

当输入层完成对上文的表示之后,模型将其送入剩下两层神经网络,依次得到隐藏层和输出层:



其中,。表示词汇表的大小,表示词向量的维度,是隐层的维度。矩阵表示从输入层到输出层的直连边权重矩阵。如果使用该直连边,可以减少一半的迭代次数;但如果没有直连边,可以生成性能更好的语言模型。因此在后续工作中,很少有使用输入层到输出层直连边的工作。

输出层一共有个元素,,依次对应下一个词为词表中某个词的可能性。这里使用softmax函数,将其转化为对应的概率。

在NNLM模型中,词向量出现在两个地方,一个是输入层的词向量,另一是隐层的权重,的维度是,这可以看做是个维的行向量,其中的每一个向量,均可以看做某个词在模型中的另一个词向量,记为。在不考虑 的情况下,每个词在模型中有两套词向量。通常在实际工作中只是用第一个作为词向量。

将展开,得到:

被称为能量函数。

log双线性语言模型(LBL)

2007 年,Mnih和Hinton在神经网络语言模型(NNLM)的基础上提出了log双线性语言模型(Log-Bilinear Language Model,LBL)。LBL模型的能量函数为:

LBL模型的能量函数与NNLM的能量函数主要有两个区别。一、LBL 模型中,没有非线性的激活函数tanh,而由于NNLM 是非线性的神经网络结构,激活函数必不可少;二、LBL 模型中,只有一份词向量e,也就是说,无论一个词是作为上下文,还是作为目标词,使用的是同一份词向量。其中第二点(只有一份词向量),只在原版的LBL模型中存在,后续的改进工作均不包含这一特点。

循环神经网络语言模型(RNNLM)

循环神经网络语言模型(Recurrent Neural Network based Language Model,RNNLM)则直接对进行建模(注意不是)

该模型就是把NNLM隐层变成RNN,每一个隐层包含此前所有上文信息

RNNLM里面最厉害的就属ELMo了。该模型利用多层双向LSTM的加权和来表示词向量,其中权重可根据具体任务动态调节。

C&W模型

与基于语言模型的词向量生成方法不同,C&W以直接生成词向量为目标。


自然语言处理_第2张图片
C&W模型

C&W模型没有去求解,而是直接对n元短语打分。对于语料中出现过的元短语,模型会对其打高分;而对于语料中没有出现的随机短语,模型会对其打低分。通过这种方式,C&W 模型可以更直接地学习得到符合分布假说的词向量。
具体而言,对于整个语料,C&W模型需要最小化:

其中,为从语料中选出的一个元短语,为序列中的中间词,也是目标词,即;表示的上下文;为字典中的某一个词。正样本来自语料,而负样本则是将正样本序列中的中间词替换成其它词。
即:

C&W模型与NNLM相比,主要的不同点在于C&W模型将目标词放到了输入层,同时输出层也从语言模型的个节点变为一个节点,这个节点的数值表示对这组n元短语的打分。这个区别使得C&W模型成为神经网络词向量模型中最为特殊的一个,其它模型的目标词均在输出层,只有C&W模型的目标词在输入层。

CBOW模型

自然语言处理_第3张图片
CBOW模型

CBOW模型的结构如上图,该模型一方面根据C&W模型的经验,使用一段文本的中间词作为目标词;另一方面,又以NNLM作为蓝本,并在其基础上做了两个简化。一、CBOW没有隐藏层,去掉隐藏层之后,模型从神经网络结构直接转化为log线性结构,与Logistic回归一致。log线性结构比三层神经网络结构少了一个矩阵运算,大幅度地提升了模型的训练速度。二、CBOW去除了上下文各词的词序信息,使用上下文各词词向量的平均值,代替神经网络语言模型使用的上文各词词向量的拼接。形式化地,CBOW模型对于一段训练样本,输入为:

由于没有隐藏层,CBOW模型的输入层直接就是上下文的表示。CBOW 模型根据上下文的表示,直接对目标词进行预测:

对于整个语料而言,与神经网络语言模型类似,CBOW的优化目标为最大化:

Skip-gram模型

自然语言处理_第4张图片
Skip-gram模型

Skip-gram模型的结构如上图,与CBOW模型一样,Skip-gram模型中也没有隐藏层。和CBOW模型不同的是,Skip-gram模型每次从目标词的上下文中选择一个词,将其词向量作为模型的输入,也就是上下文的表示。Skip-gram模型同样通过上下文预测目标词,对于整个语料的优化目标为最大化:

其中,

      

欢迎使用Markdown编辑器

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目 Value
电脑 $1600
手机 $12
导管 $1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列 第三列
第一列文本居中 第二列文本居右 第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

你可能感兴趣的:(自然语言处理)