精华内容
下载资源
问答
  • 自然语言处理NLP中的N-gram模型

    万次阅读 多人点赞 2018-05-07 21:00:03
    自然语言处理NLP中的N-gram模型 自然语言处理NLP中的N-gram模型 Naive Bayes N-gram N-gram简介 N-gram中的概率计算 N-gram的用途 用途一:词性标注 用途二:垃圾短信分类 用途三:分词器 用途四:机器翻译和...

    自然语言处理NLP中的N-gram模型

    Naive Bayes

      首先我们复习一下一个非常基本的模型,朴素贝叶斯(Naive Bayes)。朴素贝叶斯的关键组成是贝叶斯公式与条件独立性假设。为了方便说明,我们举一个垃圾短信分类的例子。

    **"在家日赚百万,惊人秘密..."**

      上面这句话抄自我手机中的一条垃圾短信,自从去过澳门,手机就时不时收到这样的关于赌场的短信。朴素贝叶斯模型就是要衡量这句话属于垃圾短信敏感句子的概率,我们以前半句为例:
    p("")p()p("")p(垃圾短信|"在家日赚百万")\propto p(垃圾邮件)p("在家日赚百万"|垃圾短信)
    由条件独立性假设:
    p(""J)=p("","","","","",""J)=p(""J)p(""J)p(""J)p(""J)p(""J)p(""J)p("在家日赚百万"|J)=p("在","家","日","赚","百","万"|J)\\ =p("在"|J)p("家"|J)p("日"|J)p("赚"|J)p("百"|J)p("万"|J)
      上面每一项条件概率都可以通过在训练数据的垃圾短信中统计每个字出现的次数得到,然而这里有一个问题,朴素贝叶斯将句子处理为一个**词袋模型(Bag-of-Words, BoW)**,以至于不考虑每个单词的顺序。这一点在中文里可能没有问题,因为有时候即使把顺序捣乱,我们还是能看懂这句话在说什么,但有时候不行,例如:

    **我烤面筋 = 面筋烤我 ?**

      那么有没有模型是考虑句子中单词之间的顺序的呢?有,N-gram就是。


    N-gram

    N-gram简介

      在介绍N-gram之前,让我们回想一下**“联想”**的过程是怎样发生的。如果你是一个玩LOL的人,那么当我说“正方形打野”、“你是真的皮”,“你皮任你皮”这些词或词组时,你应该能想到的下一个词可能是“大司马”,而不是“五五开”。如果你不是LOL玩家,没关系,当我说“上火”、“金罐”这两个词,你能想到的下一个词应该更可能“加多宝”,而不是“可口可乐”。
      N-gram正是基于这样的想法,它的第一个特点是某个词的出现依赖于其他若干个词,第二个特点是我们获得的信息越多,预测越准确。我想说,我们每个人的大脑中都有一个N-gram模型,而且是在不断完善和训练的。我们的见识与经历,都在丰富着我们的阅历,增强着我们的联想能力。

      N-gram模型是一种语言模型(Language Model,LM),语言模型是一个基于概率的判别模型,它的输入是一句话(单词的顺序序列),输出是这句话的概率,即这些单词的联合概率(joint probability)。
    这里写图片描述

      N-gram本身也指一个由NN个单词组成的集合,各单词具有先后顺序,且不要求单词之间互不相同。常用的有 Bi-gram (N=2N=2) 和 Tri-gram (N=3N=3),一般已经够用了。例如在上面这句话里,我可以分解的 Bi-gram 和 Tri-gram :

    Bi-gram : {I, love}, {love, deep}, {love, deep}, {deep, learning}
    Tri-gram : {I, love, deep}, {love, deep, learning}


    N-gram中的概率计算

      假设我们有一个由nn个词组成的句子S=(w1,w2,,wn)S=(w_1,w_2,\cdots,w_n),如何衡量它的概率呢?让我们假设,每一个单词wiw_i都要依赖于从第一个单词w1w_1到它之前一个单词wi1w_{i-1}的影响:
    p(S)=p(w1w2wn)=p(w1)p(w2w1)p(wnwn1w2w1)p(S)=p(w_1w_2\cdots w_n)=p(w_1)p(w_2|w_1)\cdots p(w_n|w_{n-1}\cdots w_2w_1)
    是不是很简单?是的,不过这个衡量方法有两个缺陷:

    • 参数空间过大,概率 p(wnwn1w2w1)p(w_n|w_{n-1}\cdots w_2w_1) 的参数有 O(n)O(n) 个。
    • 数据稀疏严重,词同时出现的情况可能没有,组合阶数高时尤其明显。

      为了解决第一个问题,我们引入马尔科夫假设(Markov Assumption)一个词的出现仅与它之前的若干个词有关
    p(w1wn)=p(wiwi1w1)p(wiwi1wiN+1)p(w_1\cdots w_n)=\prod p(w_i|w_{i-1}\cdots w_1)\approx \prod p(w_i|w_{i-1}\cdots w_{i-N+1})

    • 如果一个词的出现仅依赖于它前面出现的一个词,那么我们就称之为 Bi-gram
      p(S)=p(w1w2wn)=p(w1)p(w2w1)p(wnwn1)p(S)=p(w_1w_2\cdots w_n)=p(w_1)p(w_2|w_1)\cdots p(w_n|w_{n-1})
    • 如果一个词的出现仅依赖于它前面出现的两个词,那么我们就称之为 Tri-gram
      p(S)=p(w1w2wn)=p(w1)p(w2w1)p(wnwn1wn2)p(S)=p(w_1w_2\cdots w_n)=p(w_1)p(w_2|w_1)\cdots p(w_n|w_{n-1}w_{n-2})

    N-gram的 NN 可以取很高,然而现实中一般 bi-gram 和 tri-gram 就够用了。

      那么,如何计算其中的每一项条件概率 p(wnwn1w2w1)p(w_n|w_{n-1}\cdots w_2w_1) 呢?答案是**极大似然估计(Maximum Likelihood Estimation,MLE)**,说人话就是数频数:
    p(wnwn1)=C(wn1wn)C(wn1)p(w_n|w_{n-1})=\frac{C(w_{n-1}w_n)}{C(w_{n-1})}
    p(wnwn1wn2)=C(wn2wn1wn)C(wn2wn1)p(w_n|w_{n-1}w_{n-2})=\frac{C(w_{n-2}w_{n-1}w_n)}{C(w_{n-2}w_{n-1})}
    p(wnwn1w2w1)=C(w1w2wn)C(w1w2wn1)p(w_n|w_{n-1}\cdots w_2w_1)=\frac{C(w_1w_2\cdots w_n)}{C(w_1w_2\cdots w_{n-1})}

      具体地,以Bi-gram为例,我们有这样一个由三句话组成的语料库:

      容易统计,“I”出现了3次,“I am”出现了2次,因此能计算概率:
    p(amI)=23p(am|I)=\frac{2}{3}
      同理,还能计算出如下概率:
    p(I<s>)=0.67p(Samam)=0.5p(<s>Sam)=0.5p(doI)=0.33p(notdo)=1p(likenot)=1\begin{matrix}p(I|<s>)=0.67 & p(Sam | am)=0.5 & p(<s>|Sam)=0.5 \\ p(do|I)=0.33 & p(not|do)=1 & p(like|not)=1\end{matrix}

      另外再提供一个《Language Modeling with Ngrams》中的例子,Jurafsky et al., 1994 从加州一个餐厅的数据库中做了一些统计:
    这里写图片描述
    这里写图片描述
    这里写图片描述

      据统计,p(I<s>)=0.25p(I|<s>)=0.25p(<s>food)=0.68p(<s>|food)=0.68,于是:
    p(<s>I want chinese food<s>)=0.25×0.33×0.0065×0.52×0.68=1.896×104p(<s>I\ want\ chinese\ food<s>)\\=0.25\times 0.33\times 0.0065 \times 0.52 \times 0.68=1.896\times 10^{-4}
      我们算出了“I want chinese food”这句话的概率,但有时候这句话会很长,那么概率(都是小于1的常数)的相乘很可能造成数据下溢(downflow),即很多个小于1的常数相乘会约等于0,此时可以使用log概率解决。


    N-gram的用途

    用途一:词性标注

      N-gram可以实现词性标注。例如“爱”这个词,它既可以作为动词使用,也可以作为名词使用。不失一般性,假设我们需要匹配一句话中“爱”的词性。
    这里写图片描述

      我们可以将词性标注看成一个多分类问题,按照Bi-gram计算每一个词性概率:

    p(i"","")=i""""p(词性_i|"龙龙"的词性, "爱")=\frac{前面是“名词”的“爱”作为词性_i 的出现次数}{前面是"名词"的"爱"的出现次数}

      选取概率更大的词性(比如动词)作为这句话中“爱”字的词性。


    用途二:垃圾短信分类

      文章开头提到的那个垃圾短信分类问题,我们可以用N-gram来解决。在朴素贝叶斯的基础上,稍微对条件概率做一点改动即可。
    p("")p()p("")p(垃圾短信|"在家日赚百万")\propto p(垃圾邮件)p("在家日赚百万"|垃圾短信)
    条件概率不再是各词语之间独立:
    p(""J)=p("","","","","",""J)=p(""J)×p("""",J)×p("""",J)×p("""",J)×p("""",J)×p("""",J)p("在家日赚百万"|J)=p("在","家","日","赚","百","万"|J)\\ =p("在"|J)\times p("家"|"在",J)\times p("日"|"家",J)\times\\p("赚"|"日",J)\times p("百"|"赚",J)\times p("万"|"百",J)

      垃圾短信分类问题可以总结为以下三个步骤:

    • 步骤一:给短信的每个句子断句。
    • 步骤二:用N-gram判断每个句子是否垃圾短信中的敏感句子。
    • 步骤三:若敏感句子个数超过一定阈值,认为整个邮件是垃圾短信。

    用途三:分词器

      在NLP中,分词的效果很大程度上影响着模型的性能,因此分词甚至可以说是最重要的工程。用N-gram可以实现一个简单的分词器(Tokenizer)。同样地,将分词理解为多分类问题:XX 表示有待分词的句子,YiY_i 表示该句子的一个分词方案。

    X=""X="我爱深度学习"
    Y1={"","",""}Y2={"","","",""}Y3={"","",""}Y_1=\{"我","爱深","度学习"\}\\ Y_2=\{"我爱","深","度学","习"\}\\ Y_3=\{"我","爱","深度学习"\}
    p(Y1)=p()p()p()p(Y2)=p()p()p()p()p(Y3)=p()p()p()p(Y_1)=p(我)p(爱深|我)p(度学习|爱深)\\ p(Y_2)=p(我爱)p(深|我爱)p(度学|深)p(习|度学)\\ p(Y_3)=p(我)p(爱|我)p(深度学习|爱)

      三个概率中,“我爱”可能在语料库中比较常见,因此p()p(爱|我)会比较大,然而“我爱深”这样的组合比较少见,于是p()p(爱深|我)p()p(深|我爱)都比较小,导致p(Y3)p(Y_3)p(Y1)p(Y_1)p(Y2)p(Y_2)都大,因此第三种分词方案最佳。


    用途四:机器翻译和语音识别

    机器翻译

      同一句话,可能有多种翻译方式,它们的区别仅在于单词的组合顺序,这时候使用N-gram分别计算各种情况的概率,选最大的那个即可。

    这里写图片描述

    语音识别

      同一种发音,可能被解析成不同的句子,然而其中有一种更符合语法规则。
    这里写图片描述


    N-gram中N的确定

      为了确定NN的取值,《Language Modeling with Ngrams》使用了 Perplexity 这一指标,该指标越小表示一个语言模型的效果越好。文章使用了华尔街日报的数据库,该数据库的字典大小为19,979,训练集包含 38 million 个词,测试集包含 1.5 million 个词。针对不同的N-gram,计算各自的 Perplexity。

    PP(W)=1P(w1w2wn)n=i=1n1p(wiwi1w1)nPP(W)=\sqrt[n]{\frac{1}{P(w_1w_2\cdots w_n)}}=\sqrt[n]{\prod_{i=1}^n \frac{1}{p(w_i|w_{i-1}\cdots w_1)}}
      结果显示,Tri-gram的Perplexity最小,因此它的效果是最好的。那么NN越大是否越好呢?


    N-gram中的数据平滑方法

      上面提到,N-gram的NN越大,模型 Perplexity 越小,表示模型效果越好。这在直观意义上是说得通的,毕竟依赖的词越多,我们获得的信息量越多,对未来的预测就越准确。然而,语言是有极强的创造性的(Creative),当NN变大时,更容易出现这样的状况:某些n-gram从未出现过,这就是稀疏问题
      n-gram最大的问题就是稀疏问题(Sparsity)。例如,在bi-gram中,若词库中有20k个词,那么两两组合(C20k2C_{20k}^2)就有近2亿个组合。其中的很多组合在语料库中都没有出现,根据极大似然估计得到的组合概率将会是0,从而整个句子的概率就会为0。最后的结果是,我们的模型只能计算零星的几个句子的概率,而大部分的句子算得的概率是0,这显然是不合理的。
      因此,我们要进行数据平滑(data Smoothing),数据平滑的目的有两个:一个是使所有的N-gram概率之和为1,使所有的n-gram概率都不为0。它的本质,是重新分配整个概率空间,使已经出现过的n-gram的概率降低,补充给未曾出现过的n-gram。


    拉普拉斯平滑

    Add-one

      拉普拉斯平滑,即强制让所有的n-gram至少出现一次,只需要在分子和分母上分别做加法即可。这个方法的弊端是,大部分n-gram都是没有出现过的,很容易为他们分配过多的概率空间。
    p(wnwn1)=C(wn1wn)+1C(wn1)+Vp(w_n|w_{n-1})=\frac{C(w_{n-1}w_n)+1}{C(w_{n-1})+|V|}

    Add-K

      在Add-one的基础上做了一点小改动,原本是加一,现在加上一个小于1的常数KK。但是缺点是这个常数仍然需要人工确定,对于不同的语料库KK可能不同。

    p(wnwn1)=C(wn1wn)+kC(wn1)+kVp(w_n|w_{n-1})=\frac{C(w_{n-1}w_n)+k}{C(w_{n-1})+k|V|}


    内插与回溯

    内插

      **内插法(Interpolation)**有点像滑动平均,它的核心思想是,既然高阶组合可能出现次数为0,那稍微低阶一点的组合总有不为0的。如下是一个三阶组合,假设p(wnwn1wn2)=0p(w_n|w_{n-1}w_{n-2})=0,而p(wnwn1)>0p(w_n|w_{n-1})>0p(wn)>0p(w_n)>0,则加权平均后的概率不为0,从而达到平滑的效果。

    p^(wnwn1wn2)=λ3p(wnwn1wn2)+λ2p(wnwn1)+λ1p(wn)\hat{p}(w_n|w_{n-1}w_{n-2})=\lambda_3 p(w_n|w_{n-1}w_{n-2})+\lambda_2p(w_n|w_{n-1})+\lambda_1p(w_n)

    回溯

      **回溯法(backoff)**与内插有点像,只是它会尽可能地用最高阶组合计算概率,当高阶组合不存在时,退而求其次找次低阶,直到找到非零组合为止。参考下式,这是一个递归运算。

    p(wnwn1wnN+1)={p(wnwn1wnN+1)C(wn1wnN+1)>0α(wn1wnN+1)p(wnwn1wnN+2)otherwisep(w_n|w_{n-1}\cdots w_{n-N+1})=\left \{ \begin{matrix} p^*(w_n|w_{n-1}\cdots w_{n-N+1}) & C(w_{n-1}\cdots w_{n-N+1})>0\\ \alpha(w_{n-1}\cdots w_{n-N+1})p(w_n|w_{n-1}\cdots w_{n-N+2}) & otherwise\end{matrix} \right .


    Absolute Discounting

      Church & Gale (1991) 取了个巧,他们在训练集里找到一些出现次数为C=4C=4的bi-gram,然后在留出集(held-out)中统计它们的出现次数,平均下来发现约等于3.23。接着他们继续统计其他的CC,发现除了0和1外,基本上留出集bi-gram的出现次数等于训练集出现次数减去0.75。
      因此,他们提出直接在分子上减去一个常数,然后在后面加上一项保证概率求和为1。此处d=0.75d=0.75
    p(wnwn1)=C(wn1wn)dC(wn1)+λ(wn1)p(wn)p(w_n|w_{n-1})=\frac{C(w_{n-1}w_n)-d}{C(w_{n-1})}+\lambda(w_{n-1})p(w_n)


    Kneser-Ney Smoothing

      考虑这样一个填空:

    **I can't see without my ( )**

      一个完形填空题,正常来说,我们可能会填入**“glasses”这个词,意思是“我不戴眼镜就看不到东西”。那么,考虑上面提到的内插模型:
    λ2p(wiwi1)+λ1p(wi)\lambda_2 p(w_i|w_{i-1})+\lambda_1 p(w_i)
      这个模型很可能会在这个空里填上
    “Kong”这个词,是不是觉得很奇怪?因为语料库里,“Hong Kong”** 这个词组是高频词汇,以至于λ1p(wi)\lambda_1 p(w_i)这一项的概率会跟高,而**“glasses”是低频词,相应的概率较低,于是模型就填上了“Kong”**,在我们看来这显然是不合理的,但在模型看来却是合理的选择。
      为了解决这个问题,Kneser and Ney (1995) , Chen and Goodman(1998) 提出,修改这个 p(wi)p(w_i),具体来说,是要求它与“wiw_i为结尾的bi-gram的集合的势正相关的变量”,以表征wiw_i这个单词作为一个新的接续的可能性(即作为其他单词的下一个词的可能性)。
      以Bi-gram为例,实际上就是用下面这个PcontinuationP_{continuation}代替原来的p(w)p(w),所谓集合的势其实是要求集合中的元素互不相同后取集合的大小,其意义就是:语料库有多少种不同的以ww结尾的bi-gram。

    Pcontinuation(w){v:C(vw)>0}P_{continuation}(w)\propto |\left \{v:C(vw)>0\right\}|
      作为概率,需要进行归一化:
    Pcontinuation(w)={v:C(vw)>0}w{v:C(vw)>0}P_{continuation}(w)=\frac{|\left \{v:C(vw)>0\right\}|}{\sum_{w'}|\left\{v:C(vw')>0\right\}|}

      那么,为什么这样改过之后就能有效解决 p(Kong)p(Kong) 偏大的问题呢?根据 PcontinuationP_{continuation} 的定义,我们去统计语料库中以“Kong”结尾的bi-gram,然后发现只有“Hong Kong”一个,于是 PcontinuationP_{continuation} 就比较小了,而 “glasses”,可能有“sun glasses”,“reading glasses”等,相比“Hong Kong”这个专有名词肯定会更多。因此,问题得到解决。
      Kneser-Ney Smoothing的本质是改进Unigram概率p(w)p(w),像上文提到的其他用到这个概率的平滑方法,也可以代入这个概率,比如Absolute Discounting就变成:
    pKN(wnwn1)=C(wn1wn)dC(wn1)+λ(wn1)Pcontinuation(wn)p_{KN}(w_n|w_{n-1})=\frac{C(w_{n-1}w_n)-d}{C(w_{n-1})}+\lambda(w_{n-1})P_{continuation}(w_n)


    N-gram对训练数据集的要求

      关于N-gram的训练数据,如果你以为**“只要是英语就可以了”,那就大错特错了。文献《Language Modeling with Ngrams》**的作者做了个实验,分别用莎士比亚文学作品,以及华尔街日报作为训练集训练两个N-gram,他认为,两个数据集都是英语,那么用他们生成的文本应该也会有所重合。然而结果是,用两个语料库生成的文本没有任何重合性,即使在语法结构上也没有。
      这告诉我们,N-gram的训练是很挑数据集的,你要训练一个问答系统,那就要用问答的语料库来训练,要训练一个金融分析系统,就要用类似于华尔街日报这样的语料库来训练。
    这里写图片描述
    这里写图片描述


    N-gram的进化版:NNLM

      NNLMNeural Network based Language Model,由Bengio在2003年提出,它是一个很简单的模型,由四层组成,输入层、嵌入层、隐层和输出层。模型接收的输入是长度为nn的词序列,输出是下一个词的类别。首先,输入是单词序列的index序列,例如单词 I 在字典(大小为V|V|)中的index是10,单词 am 的 index 是23, Bengio 的 index 是65,则句子“I am Bengio”的index序列就是 10, 23, 65。嵌入层(Embedding)是一个大小为V×K|V|\times K的矩阵,从中取出第10、23、65行向量拼成3×K3\times K的矩阵就是Embedding层的输出了。隐层接受拼接后的Embedding层输出作为输入,以tanh为激活函数,最后送入带softmax的输出层,输出概率。
      NNLM最大的缺点就是参数多,训练慢。另外,NNLM要求输入是定长nn,定长输入这一点本身就很不灵活,同时不能利用完整的历史信息。
    这里写图片描述


    NNLM的进化版:RNNLM

      针对NNLM存在的问题,Mikolov在2010年提出了RNNLM,其结构实际上是用RNN代替NNLM里的隐层,这样做的好处包括减少模型参数、提高训练速度、接受任意长度输入、利用完整的历史信息。同时,RNN的引入意味着可以使用RNN的其他变体,像LSTM、BLSTM、GRU等等,从而在时间序列建模上进行更多更丰富的优化。
      论文给的模型结构图不多,这里就不放出来了,有兴趣可以直接去读论文。另外,RNNLM有开源的工具包,自行编译后得到可执行文件,可在命令行中直接使用。


    Word2Vec

      Word2Vec解决的问题已经和上面讲到的N-gram、NNLM等不一样了,它要做的事情是:学习一个从高维稀疏离散向量到低维稠密连续向量的映射。该映射的特点是,近义词向量的欧氏距离比较小,词向量之间的加减法有实际物理意义。Word2Vec由两部分组成:CBoW和Skip-Gram。其中CBoW的结构很简单,在NNLM的基础上去掉隐层,Embedding层直接连接到Softmax,CBoW的输入是某个Word的上下文(例如前两个词和后两个词),Softmax的输出是关于当前词的某个概率,即CBoW是从上下文到当前词的某种映射或者预测。Skip-Gram则是反过来,从当前词预测上下文,至于为什么叫Skip-Gram这个名字,原因是在处理过程中会对词做采样。
      Word2Vec这个内容比较丰富,这里只做一点概括性的描述,以后应该会再专门写一个博客。


    参考资料

    【博客】一周论文 | Word2Vec 作者Tomas Mikolov 的三篇代表作
    【博客】word2vector:NPLM、CBOW、Skip-gram
    【博客】大白话讲解word2vec到底在做些什么
    【博客】Deep Learning in NLP (一)词向量和语言模型
    【博客】word2vec前世今生
    【博客】Hinton神经网络公开课编程题2–神经概率语言模型(NNLM)
    【博客】神经网络语言模型(NNLM)
    【博客】NLP系列(2)_用朴素贝叶斯进行文本分类(上)
    【博客】NLP系列(5)_从朴素贝叶斯到N-gram语言模型
    【博客】语言模型系列之N-Gram、NPLM及Word2vec
    【博客】OpenNLP ngram n元语法模型(简介)
    【博客】关于N-Gram模型(例子很好)
    【博客】自然语言处理中的N-Gram模型详解
    【博客】Deep Learning 读书笔记(十二):A Neural Probabilistic Language Model
    【博客】Recurrent Neural Network Based Language Model(RNNLM)原理及BPTT数学推导
    【博客】RNNLM的使用方法
    【斯坦福课程】Speech and Language Processing
    【NNLM论文】A Neural Probabilistic Language Models
    【RNNLM论文】Statistical Language Models Based on Neural Networks
    【开源】RNNLM Toolkit

    展开全文
  • 1、自然语言处理圣经---《自然语言处理综论》2、视频课程《深度学习与自然语言处理-2018》3、Natural Language Processing (NLP)4、吴恩达经典课程 - Machine Learning —Coursera5、斯坦福 Natural Language ...

    15套免费的NLP课程及经典教材分享!

    1、自然语言处理圣经—《自然语言处理综论》

    在这里插入图片描述
    Dan Jurafsky and James Martin
    https://web.stanford.edu/~jurafsky/slp3/

    2、视频课程《深度学习与自然语言处理-2018》

    在这里插入图片描述
    Richard Socher (Stanford University)
    https://www.youtube.com/playlist?list=PL3FW7Lu3i5Jsnh1rnUwq_TcylNr7EkRe6

    3、Natural Language Processing (NLP)

    在这里插入图片描述
    Microsoft

    https://www.edx.org/course/natural-language-processing-3

    4、吴恩达经典课程 - Machine Learning —Coursera

    在这里插入图片描述
    https://www.coursera.org/learn/machine-learning/home/welcome

    5、斯坦福 Natural Language Processing with Deep Learning

    在这里插入图片描述
    视频:https://www.youtube.com/playlist?list=PL3FW7Lu3i5Jsnh1rnUwq_TcylNr7EkRe6
    课程资源:http://web.stanford.edu/class/cs224n/

    6、Coursea免费课程 - Sequence Models for Time Series and Natural Language Processing

    在这里插入图片描述
    https://www.coursera.org/learn/sequence-models-tensorflow-gcp?ranMID=40328&ranEAID=SAyYsTvLiGQ&ranSiteID=SAyYsTvLiGQ-ACNikbtJvh2d5Evme5yZQA&siteID=SAyYsTvLiGQ-ACNikbtJvh2d5Evme5yZQA&utm_content=10&utm_medium=partners&utm_source=linkshare&utm_campaign=SAyYsTvLiGQ

    7、免费课程《深度自然语言处理》- Hilary Term 2017 at the University of Oxford

    在这里插入图片描述
    http://www.cs.ox.ac.uk/teaching/courses/2016-2017/dl/

    8、免费课程《基于Python的自然语言处理基础课程》- Datacamp

    在这里插入图片描述
    https://www.datacamp.com/courses/natural-language-processing-fundamentals-in-python

    9、 Coursera免费课程《自然语言处理》- Higher School of Economics

    在这里插入图片描述
    https://www.coursera.org/learn/language-processing?

    10、 Coursera免费课程《不需要写代码如何搭建Chatbot》- IBM

    在这里插入图片描述
    https://www.coursera.org/learn/how-to-build-your-own-chatbot-without-coding

    11、 CS 388 -《自然语言处理》- University of Texas

    在这里插入图片描述
    https://www.cs.utexas.edu/~mooney/cs388/

    12、 书籍《基于Python的自然语言处理》

    在这里插入图片描述
    http://www.nltk.org/book/

    13、 视频课程自然语言处理 - University of Washington

    在这里插入图片描述
    https://courses.cs.washington.edu/courses/csep517/17sp/

    14、Dan Jurafsky & Chris Manning: Natural Language Processing

    在这里插入图片描述
    视频:https://www.youtube.com/playlist?list=PL8FFE3F391203C98C

    15、 NATURAL LANGUAGE PROCESSING - Carnegie Mellon University

    在这里插入图片描述
    http://demo.clab.cs.cmu.edu/NLP/

    展开全文
  • [NLP自然语言处理]谷歌BERT模型深度解析

    万次阅读 多人点赞 2018-10-15 17:49:18
    BERT目前已经刷新的11项自然语言处理任务的最新记录包括:将GLUE基准推至80.4%(绝对改进7.6%),MultiNLI准确度达到86.7% (绝对改进率5.6%),将SQuAD v1.1问答测试F1得分纪录刷新为93.2分(绝对提升1.5分),...

    任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI、算法、编程和大数据知识分享,以及免费的SSR节点和学习资料。其他平台(知乎/B站)也是同名「图灵的猫」,不要迷路哦~

     

    BERT模型代码已经发布,可以在我的github: NLP-BERT--Python3.6-pytorch 中下载,请记得start哦


    目录

    一、前言

    二、如何理解BERT模型

    三、BERT模型解析

          论文的核心:详解BERT模型架构

          关键创新:预训练任务

          实验结果

    四、BERT模型的影响

    对BERT模型的观点

    参考文献


    一、前言

     

    最近谷歌搞了个大新闻,公司AI团队新发布的BERT模型,在机器阅读理解顶级水平测试SQuAD1.1中表现出惊人的成绩:全部两个衡量指标上全面超越人类,并且还在11种不同NLP测试中创出最佳成绩,包括将GLUE基准推至80.4%(绝对改进7.6%),MultiNLI准确度达到86.7% (绝对改进率5.6%)等。可以预见的是,BERT将为NLP带来里程碑式的改变,也是NLP领域近期最重要的进展。

    Rank

    谷歌团队的Thang Luong直接定义:BERT模型开启了NLP的新时代!

    从现在的大趋势来看,使用某种模型预训练一个语言模型看起来是一种比较靠谱的方法。从之前AI2的 ELMo,到 OpenAI的fine-tune transformer,再到Google的这个BERT,全都是对预训练的语言模型的应用。

    BERT这个模型与其它两个不同的是

    1. 它在训练双向语言模型时以减小的概率把少量的词替成了Mask或者另一个随机的词。我个人感觉这个目的在于使模型被迫增加对上下文的记忆。至于这个概率,我猜是Jacob拍脑袋随便设的。
    2. 增加了一个预测下一句的loss。这个看起来就比较新奇了。

    BERT模型具有以下两个特点:

    第一,是这个模型非常的深,12层,并不宽(wide),中间层只有1024,而之前的Transformer模型中间层有2048。这似乎又印证了计算机图像处理的一个观点——深而窄 比 浅而宽 的模型更好。

    第二,MLM(Masked Language Model),同时利用左侧和右侧的词语,这个在ELMo上已经出现了,绝对不是原创。其次,对于Mask(遮挡)在语言模型上的应用,已经被Ziang Xie提出了(我很有幸的也参与到了这篇论文中):[1703.02573] Data Noising as Smoothing in Neural Network Language Models。这也是篇巨星云集的论文:Sida Wang,Jiwei Li(香侬科技的创始人兼CEO兼史上发文最多的NLP学者),Andrew Ng,Dan Jurafsky都是Coauthor。但很可惜的是他们没有关注到这篇论文。用这篇论文的方法去做Masking,相信BRET的能力说不定还会有提升。

     

    二、如何理解BERT模型

    [1] BERT 要解决什么问题?

    通常情况 transformer 模型有很多参数需要训练。譬如 BERT BASE 模型: L=12, H=768, A=12, 需要训练的模型参数总数是 12 * 768 * 12 = 110M。这么多参数需要训练,自然需要海量的训练语料。如果全部用人力标注的办法,来制作训练数据,人力成本太大。

    受《A Neural Probabilistic Language Model》论文的启发,BERT 也用 unsupervised 的办法,来训练 transformer 模型。神经概率语言模型这篇论文,主要讲了两件事儿,1. 能否用数值向量(word vector)来表达自然语言词汇的语义?2. 如何给每个词汇,找到恰当的数值向量?

    Transformer

    这篇论文写得非常精彩,深入浅出,要言不烦,而且面面俱到。经典论文,值得反复咀嚼。很多同行朋友都熟悉这篇论文,内容不重复说了。常用的中文汉字有 3500 个,这些字组合成词汇,中文词汇数量高达 50 万个。假如词向量的维度是 512,那么语言模型的参数数量,至少是 512 * 50万 = 256M

    模型参数数量这么大,必然需要海量的训练语料。从哪里收集这些海量的训练语料?《A Neural Probabilistic Language Model》这篇论文说,每一篇文章,天生是训练语料。难道不需要人工标注吗?回答,不需要。

    我们经常说,“说话不要颠三倒四,要通顺,要连贯”,意思是上下文的词汇,应该具有语义的连贯性。基于自然语言的连贯性,语言模型根据前文的词,预测下一个将出现的词。如果语言模型的参数正确,如果每个词的词向量设置正确,那么语言模型的预测,就应该比较准确。天下文章,数不胜数,所以训练数据,取之不尽用之不竭。

    深度学习四大要素,1. 训练数据、2. 模型、3. 算力、4. 应用。训练数据有了,接下去的问题是模型。

     

    [2] BERT 的五个关键词 Pre-training、Deep、Bidirectional、Transformer、Language Understanding 分别是什么意思?

    《A Neural Probabilistic Language Model》这篇论文讲的 Language Model,严格讲是语言生成模型(Language Generative Model),预测语句中下一个将会出现的词汇。语言生成模型能不能直接移用到其它 NLP 问题上去?

    譬如,淘宝上有很多用户评论,能否把每一条用户转换成评分?-2、-1、0、1、2,其中 -2 是极差,+2 是极好。假如有这样一条用户评语,“买了一件鹿晗同款衬衫,没想到,穿在自己身上,不像小鲜肉,倒像是厨师”,请问这条评语,等同于 -2,还是其它?

    语言生成模型,能不能很好地解决上述问题?进一步问,有没有 “通用的” 语言模型,能够理解语言的语义,适用于各种 NLP 问题?BERT 这篇论文的题目很直白,《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》,一眼看去,就能猜得到这篇文章会讲哪些内容。

    这个题目有五个关键词,分别是 Pre-training、Deep、Bidirectional、Transformers、和 Language Understanding。其中 pre-training 的意思是,作者认为,确实存在通用的语言模型,先用文章预训练通用模型,然后再根据具体应用,用 supervised 训练数据,精加工(fine tuning)模型,使之适用于具体应用。为了区别于针对语言生成的 Language Model,作者给通用的语言模型,取了一个名字,叫语言表征模型 Language Representation Model。

    能实现语言表征目标的模型,可能会有很多种,具体用哪一种呢?作者提议,用 Deep Bidirectional Transformers 模型。假如给一个句子 “能实现语言表征[mask]的模型”,遮盖住其中“目标”一词。从前往后预测[mask],也就是用“能/实现/语言/表征”,来预测[mask];或者,从后往前预测[mask],也就是用“模型/的”,来预测[mask],称之为单向预测 unidirectional。单向预测,不能完整地理解整个语句的语义。于是研究者们尝试双向预测。把从前往后,与从后往前的两个预测,拼接在一起 [mask1/mask2],这就是双向预测 bi-directional。细节参阅《Neural Machine Translation by Jointly Learning to Align and Translate》。

    BERT 的作者认为,bi-directional 仍然不能完整地理解整个语句的语义,更好的办法是用上下文全向来预测[mask],也就是用 “能/实现/语言/表征/../的/模型”,来预测[mask]。BERT 作者把上下文全向的预测方法,称之为 deep bi-directional。如何来实现上下文全向预测呢?BERT 的作者建议使用 Transformer 模型。这个模型由《Attention Is All You Need》一文发明。

    这个模型的核心是聚焦机制,对于一个语句,可以同时启用多个聚焦点,而不必局限于从前往后的,或者从后往前的,序列串行处理。不仅要正确地选择模型的结构,而且还要正确地训练模型的参数,这样才能保障模型能够准确地理解语句的语义。BERT 用了两个步骤,试图去正确地训练模型的参数。第一个步骤是把一篇文章中,15% 的词汇遮盖,让模型根据上下文全向地预测被遮盖的词。假如有 1 万篇文章,每篇文章平均有 100 个词汇,随机遮盖 15% 的词汇,模型的任务是正确地预测这 15 万个被遮盖的词汇。通过全向预测被遮盖住的词汇,来初步训练 Transformer 模型的参数。然后,用第二个步骤继续训练模型的参数。譬如从上述 1 万篇文章中,挑选 20 万对语句,总共 40 万条语句。挑选语句对的时候,其中 2*10 万对语句,是连续的两条上下文语句,另外 2*10 万对语句,不是连续的语句。然后让 Transformer 模型来识别这 20 万对语句,哪些是连续的,哪些不连续。

    这两步训练合在一起,称为预训练 pre-training。训练结束后的 Transformer 模型,包括它的参数,是作者期待的通用的语言表征模型。

     

    三、BERT模型解析

    首先来看下谷歌AI团队做的这篇论文。

    BERT的新语言表示模型,它代表Transformer的双向编码器表示。与最近的其他语言表示模型不同,BERT旨在通过联合调节所有层中的上下文来预先训练深度双向表示。因此,预训练的BERT表示可以通过一个额外的输出层进行微调,适用于广泛任务的最先进模型的构建,比如问答任务和语言推理,无需针对具体任务做大幅架构修改。

    论文作者认为现有的技术严重制约了预训练表示的能力。其主要局限在于标准语言模型是单向的,这使得在模型的预训练中可以使用的架构类型很有限。

    在论文中,作者通过提出BERT:即Transformer的双向编码表示来改进基于架构微调的方法。

    BERT 提出一种新的预训练目标:遮蔽语言模型(masked language model,MLM),来克服上文提到的单向性局限。MLM 的灵感来自 Cloze 任务(Taylor, 1953)。MLM 随机遮蔽模型输入中的一些 token,目标在于仅基于遮蔽词的语境来预测其原始词汇 id。

    与从左到右的语言模型预训练不同,MLM 目标允许表征融合左右两侧的语境,从而预训练一个深度双向 Transformer。除了遮蔽语言模型之外,本文作者还引入了一个“下一句预测”(next sentence prediction)任务,可以和MLM共同预训练文本对的表示。

    论文的主要贡献在于:

    • 证明了双向预训练对语言表示的重要性。与之前使用的单向语言模型进行预训练不同,BERT使用遮蔽语言模型来实现预训练的深度双向表示。
    • 论文表明,预先训练的表示免去了许多工程任务需要针对特定任务修改体系架构的需求。 BERT是第一个基于微调的表示模型,它在大量的句子级和token级任务上实现了最先进的性能,强于许多面向特定任务体系架构的系统。
    • BERT刷新了11项NLP任务的性能记录。本文还报告了 BERT 的模型简化研究(ablation study),表明模型的双向性是一项重要的新成果。相关代码和预先训练的模型将会公布在goo.gl/language/bert上。

    BERT目前已经刷新的11项自然语言处理任务的最新记录包括:将GLUE基准推至80.4%(绝对改进7.6%),MultiNLI准确度达到86.7% (绝对改进率5.6%),将SQuAD v1.1问答测试F1得分纪录刷新为93.2分(绝对提升1.5分),超过人类表现2.0分。

    论文的核心:详解BERT模型架构

    本节介绍BERT模型架构和具体实现,并介绍预训练任务,这是这篇论文的核心创新。

    模型架构

    BERT的模型架构是基于Vaswani et al. (2017) 中描述的原始实现multi-layer bidirectional Transformer编码器,并在tensor2tensor库中发布。由于Transformer的使用最近变得无处不在,论文中的实现与原始实现完全相同,因此这里将省略对模型结构的详细描述。

    在这项工作中,论文将层数(即Transformer blocks)表示为L,将隐藏大小表示为H,将self-attention heads的数量表示为A。在所有情况下,将feed-forward/filter 的大小设置为 4H,即H = 768时为3072,H = 1024时为4096。论文主要报告了两种模型大小的结果:

    • BERT_{BASE} : L=12, H=768, A=12, Total Parameters=110M
    • BERT_{LARGE} : L=24, H=1024, A=16, Total Parameters=340M

    为了进行比较,论文选择了 BERT_{LARGE} ,它与OpenAI GPT具有相同的模型大小。然而,重要的是,BERT Transformer 使用双向self-attention,而GPT Transformer 使用受限制的self-attention,其中每个token只能处理其左侧的上下文。研究团队注意到,在文献中,双向 Transformer 通常被称为“Transformer encoder”,而左侧上下文被称为“Transformer decoder”,因为它可以用于文本生成。BERT,OpenAI GPT和ELMo之间的比较如图1所示。

    图1:预训练模型架构的差异。BERT使用双向Transformer。OpenAI GPT使用从左到右的Transformer。ELMo使用经过独立训练的从左到右和从右到左LSTM的串联来生成下游任务的特征。三个模型中,只有BERT表示在所有层中共同依赖于左右上下文。

    输入表示(input representation)

    论文的输入表示(input representation)能够在一个token序列中明确地表示单个文本句子或一对文本句子(例如, [Question, Answer])。对于给定token,其输入表示通过对相应的tokensegmentposition embeddings进行求和来构造。图2是输入表示的直观表示:

    图2:BERT输入表示。输入嵌入是token embeddings, segmentation embeddings 和position embeddings 的总和。

    具体如下:

    • 使用WordPiece嵌入(Wu et al., 2016)和30,000个token的词汇表。用##表示分词。
    • 使用学习的positional embeddings,支持的序列长度最多为512个token。
    • 每个序列的第一个token始终是特殊分类嵌入([CLS])。对应于该token的最终隐藏状态(即,Transformer的输出)被用作分类任务的聚合序列表示。对于非分类任务,将忽略此向量。
    • 句子对被打包成一个序列。以两种方式区分句子。首先,用特殊标记([SEP])将它们分开。其次,添加一个learned sentence A嵌入到第一个句子的每个token中,一个sentence B嵌入到第二个句子的每个token中。
    • 对于单个句子输入,只使用 sentence A嵌入。

    关键创新:预训练任务

    与Peters et al. (2018) 和 Radford et al. (2018)不同,论文不使用传统的从左到右或从右到左的语言模型来预训练BERT。相反,使用两个新的无监督预测任务对BERT进行预训练。

    任务1: Masked LM

    从直觉上看,研究团队有理由相信,深度双向模型比left-to-right 模型或left-to-right and right-to-left模型的浅层连接更强大。遗憾的是,标准条件语言模型只能从左到右或从右到左进行训练,因为双向条件作用将允许每个单词在多层上下文中间接地“see itself”。

    为了训练一个深度双向表示(deep bidirectional representation),研究团队采用了一种简单的方法,即随机屏蔽(masking)部分输入token,然后只预测那些被屏蔽的token。论文将这个过程称为“masked LM”(MLM),尽管在文献中它经常被称为Cloze任务(Taylor, 1953)。

    在这个例子中,与masked token对应的最终隐藏向量被输入到词汇表上的输出softmax中,就像在标准LM中一样。在团队所有实验中,随机地屏蔽了每个序列中15%的WordPiece token。与去噪的自动编码器(Vincent et al., 2008)相反,只预测masked words而不是重建整个输入。

    虽然这确实能让团队获得双向预训练模型,但这种方法有两个缺点。首先,预训练和finetuning之间不匹配,因为在finetuning期间从未看到[MASK]token。为了解决这个问题,团队并不总是用实际的[MASK]token替换被“masked”的词汇。相反,训练数据生成器随机选择15%的token。例如在这个句子“my dog is hairy”中,它选择的token是“hairy”。然后,执行以下过程:

    数据生成器将执行以下操作,而不是始终用[MASK]替换所选单词:

    • 80%的时间:用[MASK]标记替换单词,例如,my dog is hairy → my dog is [MASK]
    • 10%的时间:用一个随机的单词替换该单词,例如,my dog is hairy → my dog is apple
    • 10%的时间:保持单词不变,例如,my dog is hairy → my dog is hairy. 这样做的目的是将表示偏向于实际观察到的单词。

    Transformer encoder不知道它将被要求预测哪些单词或哪些单词已被随机单词替换,因此它被迫保持每个输入token的分布式上下文表示。此外,因为随机替换只发生在所有token的1.5%(即15%的10%),这似乎不会损害模型的语言理解能力

    使用MLM的第二个缺点是每个batch只预测了15%的token,这表明模型可能需要更多的预训练步骤才能收敛。团队证明MLM的收敛速度略慢于 left-to-right的模型(预测每个token),但MLM模型在实验上获得的提升远远超过增加的训练成本。

     

    任务2:下一句预测

    许多重要的下游任务,如问答(QA)和自然语言推理(NLI)都是基于理解两个句子之间的关系,这并没有通过语言建模直接获得。

    在为了训练一个理解句子的模型关系,预先训练一个二进制化的下一句测任务,这一任务可以从任何单语语料库中生成。具体地说,当选择句子A和B作为预训练样本时,B有50%的可能是A的下一个句子,也有50%的可能是来自语料库的随机句子。例如:

    Input = [CLS] the man went to [MASK] store [SEP]

    he bought a gallon [MASK] milk [SEP]

    Label = IsNext

    Input = [CLS] the man [MASK] to the store [SEP]

    penguin [MASK] are flight ##less birds [SEP]

    Label = NotNext

    团队完全随机地选择了NotNext语句,最终的预训练模型在此任务上实现了97%-98%的准确率

    实验结果

    如前文所述,BERT在11项NLP任务中刷新了性能表现记录!在这一节中,团队直观呈现BERT在这些任务的实验结果,具体的实验设置和比较请阅读原论文.

    图3:我们的面向特定任务的模型是将BERT与一个额外的输出层结合而形成的,因此需要从头开始学习最小数量的参数。在这些任务中,(a)和(b)是序列级任务,而(c)和(d)是token级任务。在图中,E表示输入嵌入,Ti表示tokeni的上下文表示,[CLS]是用于分类输出的特殊符号,[SEP]是用于分隔非连续token序列的特殊符号。

    图4:GLUE测试结果,由GLUE评估服务器给出。每个任务下方的数字表示训练样例的数量。“平均”一栏中的数据与GLUE官方评分稍有不同,因为我们排除了有问题的WNLI集。BERT 和OpenAI GPT的结果是单模型、单任务下的数据。所有结果来自https://gluebenchmark.com/leaderboardhttps://blog.openai.com/language-unsupervised/

    图5:SQuAD 结果。BERT 集成是使用不同预训练检查点和fine-tuning seed的 7x 系统。

    图6:CoNLL-2003 命名实体识别结果。超参数由开发集选择,得出的开发和测试分数是使用这些超参数进行五次随机重启的平均值。

     

    四、BERT模型的影响

    BERT是一个语言表征模型(language representation model),通过超大数据、巨大模型、和极大的计算开销训练而成,在11个自然语言处理的任务中取得了最优(state-of-the-art, SOTA)结果。或许你已经猜到了此模型出自何方,没错,它产自谷歌。估计不少人会调侃这种规模的实验已经基本让一般的实验室和研究员望尘莫及了,但它确实给我们提供了很多宝贵的经验:

    1. 深度学习就是表征学习 (Deep learning is representation learning):"We show that pre-trained representations eliminate the needs of many heavily engineered task-specific architectures". 在11项BERT刷出新境界的任务中,大多只在预训练表征(pre-trained representation)微调(fine-tuning)的基础上加一个线性层作为输出(linear output layer)。在序列标注的任务里(e.g. NER),甚至连序列输出的依赖关系都先不管(i.e. non-autoregressive and no CRF),照样秒杀之前的SOTA,可见其表征学习能力之强大。
    2. 规模很重要(Scale matters):"One of our core claims is that the deep bidirectionality of BERT, which is enabled by masked LM pre-training, is the single most important improvement of BERT compared to previous work". 这种遮挡(mask)在语言模型上的应用对很多人来说已经不新鲜了,但确是BERT的作者在如此超大规模的数据+模型+算力的基础上验证了其强大的表征学习能力。这样的模型,甚至可以延伸到很多其他的模型,可能之前都被不同的实验室提出和试验过,只是由于规模的局限没能充分挖掘这些模型的潜力,而遗憾地让它们被淹没在了滚滚的paper洪流之中。
    3. 预训练价值很大(Pre-training is important):"We believe that this is the first work to demonstrate that scaling to extreme model sizes also leads to large improvements on very small-scale tasks, provided that the model has been sufficiently pre-trained". 预训练已经被广泛应用在各个领域了(e.g. ImageNet for CV, Word2Vec in NLP),多是通过大模型大数据,这样的大模型给小规模任务能带来的提升有几何,作者也给出了自己的答案。BERT模型的预训练是用Transformer做的,但我想换做LSTM或者GRU的话应该不会有太大性能上的差别,当然训练计算时的并行能力就另当别论了。

    对BERT模型的观点
     

    0. high-performance的原因其实还是归结于两点,除了模型的改进,更重要的是用了超大的数据集(BooksCorpus 800M + English Wikipedia 2.5G单词)和超大的算力(对应于超大模型)在相关的任务上做预训练,实现了在目标任务上表现的单调增长

    1. 这个模型的双向和Elmo不一样,大部分人对他这个双向在novelty上的contribution 的大小有误解,我觉得这个细节可能是他比Elmo显著提升的原因。Elmo是拼一个左到右和一个右到左,他这个是训练中直接开一个窗口,用了个有顺序的cbow。

    2. 可复现性差:有钱才能为所欲为(Reddit对跑一次BERT的价格讨论)

    For TPU pods:
    
    4 TPUs * ~$2/h (preemptible) * 24 h/day * 4 days = $768 (base model)
    
    16 TPUs = ~$3k (large model)
    
    
    
    For TPU:
    
    16 tpus * $8/hr * 24 h/day * 4 days = 12k
    
    64 tpus * $8/hr * 24 h/day * 4 days = 50k

    最后他问到:For GPU:"BERT-Large is 24-layer, 1024-hidden and was trained for 40 epochs over a 3.3 billion word corpus. So maybe 1 year to train on 8 P100s? " ,然后这个就很interesting了。

    参考文献

    1. 知乎:如何评价谷歌最新的BERT模型

    2. 华尔街见闻:NLP历史突破

    3. OPENAI-Improving Language Understanding with Unsupervised Learning

    4. https://gluebenchmark.com/leaderboard

     

    >>>关于作者

    CSDN 博客专家,2019-CSDN百大博主,计算机(机器学习方向)博士在读,业余Kaggle选手,有过美团、腾讯算法工程师经历,目前就职于Amazon AI lab。喜爱分享和知识整合。

    关注微信公众号,点击“学习资料”菜单即可获取算法、编程资源以及教学视频,还有免费SSR节点相送哦。其他平台(微信/知乎/B站),欢迎关注同名公众号「图灵的猫」~

    展开全文
  • 自然语言生成/总结 (2004) ROUGE: A Package for Automatic Evaluation of Summaries ???? Introduces ROUGE, an evaluation metric for summarization that is used to this day on a variety of sequence ...

    自然语言生成/总结

    展开全文
  • 自然语言与编程语言

    2019-10-30 19:05:19
    自然语言与编程语言 自然语言中词汇比编程语言中词汇丰富。 自然语言是非结构化,编程语言是结构化的。结构化:信息具有明确的结构关系。 自然语言含有大量歧义。 容错性。 易变性。 简略性。 自然语言处理层次 ...
  • 自然语言理解

    千次阅读 2018-08-14 00:44:20
    人类对机器理解语言的认识走了一条大...包括,目前语音理解的输出输入的打通都需要自然语言理解的基础支撑,目前,自然语言理解使用了万金油技术--神经网络,如虎添翼,一路攻城拔寨,效能飞速上升。学习掌握 NLP...
  • 中文自然语言处理入门实战

    万次阅读 多人点赞 2018-07-03 02:45:10
    本达人课,作为中文自然语言处理边学边实战的入门级教程,以小数据量的“简易版”实例,通过实战带大家快速掌握 NLP 在中文方面开发的基本能力。 本课程共包含 18 节。各小节之间并没有紧密耦合,但是整个内容还是...
  • 汉语自然语言处理工具包下载

    万次阅读 2017-07-03 15:22:47
    Python Windows10 汉语自然语言处理基本组件: 20170703 2018/01/16:Github长期更新,Windows,Linux通用
  • 自然语言处理实战入门

    千人学习 2019-03-15 15:21:29
    随着人工智能的快速发展,自然语言处理和机器学习技术的应用愈加广泛。要想快速入门这些前沿技术总是存在着各种各样的困难,本教程力求为同学们对该领域整体概况有一个明晰的认识,并选择网络爬虫,汉语分词,可视化...
  • 从零开始自然语言处理

    千人学习 2019-08-07 14:38:22
    本课程隶属于自然语言处理(NLP)实战系列。自然语言处理(NLP)是数据科学里的一个分支,它的主要覆盖的内容是:以一种智能与高效的方式,对文本数据进行系统化分析、理解与信息提取的过程。通过使用NLP以及它的组件,...
  • 自然语言处理(NLP)相关学习资料/资源 书籍推荐 自然语言处理方面 1. 统计自然语言处理(第2版) 作者:宗成庆 出版社:清华大学出版社 出版年:2013 页数:570 内容简介:系统地描述了神经网络之前的基于统计的...
  • 自然语言处理大体包括了自然语言理解和自然语言生成两个部分,实现人机间自然语言通信意味着要使计算机既能理解自然语言文本的意义,也能以自然语言文本来表达给定的意图、思想等,前者称为自然语言理解,后者称为...
  • 自然语言处理入门

    千次阅读 2019-07-28 19:57:36
    自然语言处理入门自然语言处理入门自然语言的概念自然语言的理解自然语言处理的概念自然语言处理的相关技术自然语言处理难点相关学习链接 自然语言处理入门 自然语言的概念 自然语言的理解 自然语言处理(NLP) ...
  • 给外行能看懂的科普:这就叫自然语言处理如何向文科同学科普自然语言处理(NLP)? 刘知远,NLPer前几年曾经马少平老师的引荐,为某科普图书写过一篇短文介绍自然语言处理。如果只是介绍NLP的概念、任务和挑战,...
  • 文章目录论述自然语言处理的技术范畴(基本全貌) 一、前言二、主要技术范畴1、语音合成(Speech Synthesis)2、语音识别(Speech Recognition)3、中文自动分词4、词性标注5、句法分析7、文本分类7、文本挖掘8、信息抽取9...
  • 自然语言处理

    千次阅读 2017-08-26 09:50:00
    自然语言 自然语言通常是指一种自然地随文化演化的语言。英语、汉语、日语为自然语言的例子,而世界语则为人造语言,即是一种为某些特定目的而创造的语言。 不过,有时所有人类使用的语言(包括上述自然地随文化演化...
  • 什么是自然语言处理? 自然语言处理(NLP)是指机器理解并解释人类写作、说话方式的能力。 NLP的目标是让计算机/机器在理解语言上像人类一样智能。最终目标是弥补人类交流(自然语言)和计算机理解(机器语言)之间...
  • 自然语言学习笔记

    千次阅读 2019-07-31 19:26:45
    自然语言学习笔记自然语言自然语言研究的两问题自然语言的理解NLP(自然语言处理(AI分支))相关学习链接 自然语言 自然语言通常是指一种自然地随文化演化的语言。例如,英语、汉语、日语为自然语言的例子,这一种...
  • 自然语言处理专题

    千次阅读 多人点赞 2019-01-21 11:49:28
    NLP,全名 Natural Language Processing(自然语言处理)。从 1949 年的机器翻译设计方案到如今比尔盖茨认为“自然语言理解是人工智能皇冠上的明珠” ,NLP 成为了人工智能领域的重要战略目标。有读者曾留言问道...
  • 自然语言处理(NLP)入门

    万次阅读 多人点赞 2017-11-21 20:32:26
    本文简要介绍Python自然语言处理(NLP),使用Python的NLTK库。NLTK是Python的自然语言处理工具包,在NLP领域中,最常使用的一个Python库。什么是NLP?简单来说,自然语言处理(NLP)就是开发能够理解人类语言的应用程序...
  • 自然语言处理十大应用

    千次阅读 2020-07-16 12:56:14
    自然语言处理是数据科学领域最热门的课题之一。公司在这一领域投入大量资金进行研究。每个人都在努力了解自然语言处理及其应用,并以此为生。 你知道为什么吗? 因为仅仅在短短几年的时间里,自然语言处理已经...
  • 什么是自然语言理解?自然语言理解的准则是什么? 自然语言理解与“智能”一样,存在各种各样的理解和解释,是利用计算机对自然语言进行理解。 自然语言理解的准则:给计算机输入一段自然语言为本,如果计算机能问答...
  • Tensorflow-自然语言处理

    千人学习 2018-04-01 09:52:29
    课程以Tensorflow作为机器学习的核心武器,基于自然语言处理热点话题进行案例实战。选择当下热门模型,使用真实数据集进行实战演示,通俗讲解整个算法模型并使用tensorflow进行实战,详解其中的原理与代码实现。
  • 自然语言处理理论书籍很多,讲实际操作的不多,能讲的这么系统的更少。Python语言在做NLP方面有较明显的优势。之前国外有《Natural Language Process with Python》,国内热心网友将其翻译为中文版。从这个角度讲,...
  • NPL自然语言处理

    千次阅读 2019-09-08 14:34:24
    自然语言处理(natural language processing,NLP)也称自然语言理解(natural language understanding,NLU),从人工智能研发的一开始,它就作为这一学科的重要研究内容探索人类理解自然语言这一智能行为的基本...
  • Python自然语言处理-BERT模型实战

    千人学习 2019-10-21 21:54:40
    购买课程后,添加小助手微信(微信号:csdn108)回复【唐宇迪】 进入学习群,获取唐宇迪老师答疑 Python自然语言处理-BERT模型实战课程旨在帮助同学们快速掌握当下NLP领域最核心的算法模型BERT的原理构造与应用实例...
  • 自然语言处理Word2Vec视频学习教程

    万人学习 2017-06-21 22:39:12
    自然语言处理Word2Vec视频培训课程:自然语言处理中重要的算法,word2vec原理,词向量模型。教程从语言模型入手,详解词向量构造原理与求解算法。理论与实战结合,使用深度学习框架Tensorflow从零开始打造word2vec词...
  • 自然语言处理定义: 自然语言处理是一门计算机科学、人工智能以及语言学的交叉学科。虽然语言只是人工智能的一部分(人工智能还包括计算机视觉等),但它是非常独特的一部分。这个星球上有许多生物拥有超过人类的...
  • 自然语言处理动手学Bert文本分类

    千人学习 2020-05-30 09:41:43
    Bert作为目前自然语言处理领域最流行的技术之一,文本分类作为自然语言处理领域最常见的任务之一,Pytorch作为目前最流程的深度学习框架之一,三者结合在一起将会产生什么样的花火,本套课程基于Pytorch最新1.4版本...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 57,635
精华内容 23,054
关键字:

自然语言