精华内容
下载资源
问答
  • 克 得到 。 安装 该软件包仅适用于ESM:需要使用Node 12+才能使用它,并且必须将其import而不是require d。...nGram ( 6 ) ( 'n-gram' ) // ['n-gram'] nGram ( 7 ) ( 'n-gram' ) // [] // Anything with a `.
  • n-gram tree 一个使用N-Gram统计语言模型作预测的数,当找不到(即某一环节概率为0时)自动取用低阶的(N-1)-Gram模型,训练速度巨快,储存空间小。支持增量式训练。 支持序列化后压缩再保存到本地,也可以读出(要...
  • 自然语言处理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("")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) 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本身也指一个由 N N N个单词组成的集合,各单词具有先后顺序,且不要求单词之间互不相同。常用的有 Bi-gram ( N = 2 N=2 N=2) 和 Tri-gram ( N = 3 N=3 N=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中的概率计算

      假设我们有一个由 n n n个词组成的句子 S = ( w 1 , w 2 , ⋯   , w n ) S=(w_1,w_2,\cdots,w_n) S=(w1,w2,,wn),如何衡量它的概率呢?让我们假设,每一个单词 w i w_i wi都要依赖于从第一个单词 w 1 w_1 w1到它之前一个单词 w i − 1 w_{i-1} wi1的影响:
    p ( S ) = p ( w 1 w 2 ⋯ w n ) = p ( w 1 ) p ( w 2 ∣ w 1 ) ⋯ p ( w n ∣ w n − 1 ⋯ w 2 w 1 ) 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(S)=p(w1w2wn)=p(w1)p(w2w1)p(wnwn1w2w1)
    是不是很简单?是的,不过这个衡量方法有两个缺陷:

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

      为了解决第一个问题,我们引入马尔科夫假设(Markov Assumption)一个词的出现仅与它之前的若干个词有关
    p ( w 1 ⋯ w n ) = ∏ p ( w i ∣ w i − 1 ⋯ w 1 ) ≈ ∏ p ( w i ∣ w i − 1 ⋯ w i − N + 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}) p(w1wn)=p(wiwi1w1)p(wiwi1wiN+1)

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

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

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

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

      容易统计,“I”出现了3次,“I am”出现了2次,因此能计算概率:
    p ( a m ∣ I ) = 2 3 p(am|I)=\frac{2}{3} p(amI)=32
      同理,还能计算出如下概率:
    p ( I ∣ < s > ) = 0.67 p ( S a m ∣ a m ) = 0.5 p ( < s > ∣ S a m ) = 0.5 p ( d o ∣ I ) = 0.33 p ( n o t ∣ d o ) = 1 p ( l i k e ∣ n o t ) = 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} p(I<s>)=0.67p(doI)=0.33p(Samam)=0.5p(notdo)=1p(<s>Sam)=0.5p(likenot)=1

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

      据统计, p ( I ∣ < s > ) = 0.25 p(I|<s>)=0.25 p(I<s>)=0.25 p ( < s > ∣ f o o d ) = 0.68 p(<s>|food)=0.68 p(<s>food)=0.68,于是:
    p ( < s > I   w a n t   c h i n e s e   f o o d < s > ) = 0.25 × 0.33 × 0.0065 × 0.52 × 0.68 = 1.896 × 1 0 − 4 p(<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} p(<s>I want chinese food<s>)=0.25×0.33×0.0065×0.52×0.68=1.896×104
      我们算出了“I want chinese food”这句话的概率,但有时候这句话会很长,那么概率(都是小于1的常数)的相乘很可能造成数据下溢(downflow),即很多个小于1的常数相乘会约等于0,此时可以使用log概率解决。


    N-gram的用途

    用途一:词性标注

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

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

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

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


    用途二:垃圾短信分类

      文章开头提到的那个垃圾短信分类问题,我们可以用N-gram来解决。在朴素贝叶斯的基础上,稍微对条件概率做一点改动即可。
    p ( 垃 圾 短 信 ∣ " 在 家 日 赚 百 万 " ) ∝ p ( 垃 圾 邮 件 ) p ( " 在 家 日 赚 百 万 " ∣ 垃 圾 短 信 ) p(垃圾短信|"在家日赚百万")\propto p(垃圾邮件)p("在家日赚百万"|垃圾短信) p("")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) p(""J)=p("","","","","",""J)=p(""J)×p("""",J)×p("""",J)×p("""",J)×p("""",J)×p("""",J)

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

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

    用途三:分词器

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

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

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


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

    机器翻译

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

    这里写图片描述

    语音识别

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


    N-gram中N的确定

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

    P P ( W ) = 1 P ( w 1 w 2 ⋯ w n ) n = ∏ i = 1 n 1 p ( w i ∣ w i − 1 ⋯ w 1 ) n PP(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)}} PP(W)=nP(w1w2wn)1 =ni=1np(wiwi1w1)1
      结果显示,Tri-gram的Perplexity最小,因此它的效果是最好的。那么 N N N越大是否越好呢?


    N-gram中的数据平滑方法

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


    拉普拉斯平滑

    Add-one

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

    Add-K

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

    p ( w n ∣ w n − 1 ) = C ( w n − 1 w n ) + k C ( w n − 1 ) + k ∣ V ∣ p(w_n|w_{n-1})=\frac{C(w_{n-1}w_n)+k}{C(w_{n-1})+k|V|} p(wnwn1)=C(wn1)+kVC(wn1wn)+k


    内插与回溯

    内插

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

    p ^ ( w n ∣ w n − 1 w n − 2 ) = λ 3 p ( w n ∣ w n − 1 w n − 2 ) + λ 2 p ( w n ∣ w n − 1 ) + λ 1 p ( w n ) \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) p^(wnwn1wn2)=λ3p(wnwn1wn2)+λ2p(wnwn1)+λ1p(wn)

    回溯

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

    p ( w n ∣ w n − 1 ⋯ w n − N + 1 ) = { p ∗ ( w n ∣ w n − 1 ⋯ w n − N + 1 ) C ( w n − 1 ⋯ w n − N + 1 ) > 0 α ( w n − 1 ⋯ w n − N + 1 ) p ( w n ∣ w n − 1 ⋯ w n − N + 2 ) o t h e r w i s e p(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 . p(wnwn1wnN+1)={p(wnwn1wnN+1)α(wn1wnN+1)p(wnwn1wnN+2)C(wn1wnN+1)>0otherwise


    Absolute Discounting

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


    Kneser-Ney Smoothing

      考虑这样一个填空:

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

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

    P c o n t i n u a t i o n ( w ) ∝ ∣ { v : C ( v w ) > 0 } ∣ P_{continuation}(w)\propto |\left \{v:C(vw)>0\right\}| Pcontinuation(w){v:C(vw)>0}
      作为概率,需要进行归一化:
    P c o n t i n u a t i o n ( w ) = ∣ { v : C ( v w ) > 0 } ∣ ∑ w ′ ∣ { v : C ( v w ′ ) > 0 } ∣ P_{continuation}(w)=\frac{|\left \{v:C(vw)>0\right\}|}{\sum_{w'}|\left\{v:C(vw')>0\right\}|} Pcontinuation(w)=w{v:C(vw)>0}{v:C(vw)>0}

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


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

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


    N-gram的进化版:NNLM

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


    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

    展开全文
  • Adhoc-n-gram距离技术 请在eclipse中运行该项目之前,将jpcap.jar添加到您的类路径中。 代码使用属性文件。 确保使其在Eclipse中可用。 有关任何说明或帮助建立/运行或理解此代码的信息,请联系...
  • N-gram

    2019-10-13 07:06:27
    通常是基于一定得语料库,用N-gram来预计或者评估一个句子是否合理。 可以用来评估字符串之间的差异程度。 常见的应用: 基于N-Gram模型定义的字符串距离 利用N-Gram模型评估语句是否合理 ...
    • 作用:

      • 通常是基于一定得语料库,用N-gram来预计或者评估一个句子是否合理。
      • 可以用来评估字符串之间的差异程度。
    • 常见的应用:

      • 基于N-Gram模型定义的字符串距离

      • 利用N-Gram模型评估语句是否合理

      • 使用N-Gram模型时的数据平滑算法
    • N-Gram在模糊匹配中的应用:

      • N-Gram距离,把字符串切分成每个长度为N的子字符串,计算共有子串等。

    • 利用N-Gram模型评估语句是否合理(和前面外在不一样本质一样):

      • 例1:语句不合理

      • 例2:知道前面信息越多,对后面的约束越强。

      • m个词的序列,由链式规则,计算P(w1,w2,⋯,wm)=P(w1)P(w2|w1)P(w3|w1,w2)⋯P(wm|w1,⋯,wm−1);马尔科夫链假设(当前这个词只和前面几个词有关)不必追溯到最开始的词,所以P(wi|w1,⋯,wi−1)=P(wi|wi−n+1,⋯,wi−1);最后可以利用最大似然法求出一组参数,是训练 样本概率最大。

      • 使用N-Gram模型时的数据平滑算法:
    • N-gram实际E1:

      • 搜索引擎,输入一个词时,会出现一个下拉的备选框。

      • 输入法提示

    • E2:某某作家或者语料库风格的文本自动生成
      • 计算机根据作家语料库利用N-gram模型自动生成文段。
    •  
    • 其他:

      • 模式匹配(字符串查找)又分为

        • 精确匹配(KMP算法、BM算法和BMH算法等等)

        • 模糊匹配:一个可能错拼单词映射到一个推荐的正确拼写上所采用的技术就是模糊匹配。

      • 马尔科夫链假设
    展开全文
  • N-Gram

    2019-08-28 15:38:10
    N-Gram是一种统计语言模型,用来根据前(n-1)个item来预测第n个item。在应用层面,这些item字符(输入法应用)等。一般来讲,可以从大规模文本或音频语料库生成N-Gram模型。 习惯上,1-gram称为unigram,2-gram称为...

    一、什么是N-Gram

    N-Gram是一种统计语言模型,用来根据前(n-1)个item来预测第n个item。在应用层面,这些item字符(输入法应用)等。一般来讲,可以从大规模文本或音频语料库生成N-Gram模型。 习惯上,1-gram称为unigram,2-gram称为bigram,3-gram是trigram。还有four-gram、five-gram等,不过大于n>5的应用很少见。

    N-Gram语言模型的思想,可以追溯到信息论大师香农的研究工作,他提出一个问题:给定一串字母,如”for ex”,下一个最大可能性出现的字母是什么。从训练语料数据中,我们可以通过极大似然估计的方法,得到N个概率分布:是a的概率是0.4,是b的概率是0.0001,是c的概率是…,当然,别忘记约束条件:所有的N个概率分布的总和为1

    N-Gram模型概率公式推导。根据条件概率和乘法公式:P(B|A)=P(A,B)P(A),假设一个序列T由A1,A2,A3,…,An组成,那么P(T)的概率为:

    P(A1A2A3…An)=P(A1)∗P(A2|A1)∗P(A3|A2,A1)∗…∗P(An|A1,A2,…,An−1)其中P(A1,A2,…,An−1)>0

    如果直接这么计算,是有很大困难的,需要引入马尔科夫假设,即:一个item的出现概率,只与其前m个items有关,当m=0时,就是unigram,m=1时,是bigram模型,m=2时,是trigram模型。例如当m=1时,上述P(T)的概率为:

    P(A1A2A3…An)=P(A1)∗P(A2|A1)∗P(A3|A2)∗P(A4|A3)∗…∗P(An|An−1)

    而P(An|An−1)条件概率可以通过极大似然估计求得,等于:Count(An−1,An)/Count(An−1)

    二、实例讲解N-Gram的一个应用

    二元语言模型判断句子是否合理:假设现在有一个语料库,我们统计了下面的一些词出现的数量

    下面的这些概率值作为已知条件:

    P(i|)=0.25,P(|food)=0.68,P(want|)=0.25

    下面这个表给出的是基于Bigram模型进行计数之结果:

    例如,其中第一行,第二列表示给定前一个词是 “i” 时,当前词为“want”的情况一共出现了827次。据此,我们便可以算得相应的频率分布表如下:

    比如说,我们就以表中的P(eat|i)=0.0036这个概率值讲解,从表一得出“i”一共出现了2533次,而其后出现eat的次数一共有9次,P(eat|i)=P(eat,i)/P(i)=count(eat,i)/count(i)=9/2533=0.0036

    下面我们通过基于这个语料库来判断s1=“ i want chinese food” 与s2 = " want i chinese food"哪个句子更合理:通过例子来讲解是最人性化的(其中涉及的概率查上表)

    首先来判断P(s1) :P(s1)=P(i|)P(want|i)P(chinese|want)P(food|chinese)P(|food)=0.25∗0.33∗0.0065∗0.52∗0.68=0.000189618
     再来求P(s2):P(s2)=P(want|)P(i|want)P(chinese|i)P(food|chinese)P(|food)=0.25∗0.0022∗0∗0.52∗0.68=0
     通过比较我们可以明显发现P(s2) < P(s1),也就是说s1= " i want chinese food"更像人话。再深层次的分析,我们可以看到这两个句子的概率的不同,主要是由于顺序i want还是want i的问题,根据我们的直觉和常用搭配语法,i want要比want i出现的几率要大很多。所以两者的差异,第一个概率大,第二个概率小,也就能说的通了

    N-gram模型的一个常见应用

    搜索引擎(Google或者Baidu)、或者输入法的猜想或者提示。你在用谷歌时,输入一个或几个词,搜索框通常会以下拉菜单的形式给出几个像下图一样的备选,这些备选其实是在猜想你想要搜索的那个词串。

    再者,当你用输入法输入一个汉字的时候,输入法通常可以联系出一个完整的词,例如我输入一个“刘”字,通常输入法会提示我是否要输入的是“刘备”。通过上面的介绍,你应该能够很敏锐的发觉,这其实是以N-Gram模型为基础来实现的。比如下图:

    那么原理是什么呢?也就是我打入“我们”的时候,后面的“不一样”,”的爱“这些是怎么出来的,怎么排序的?实际上是根据语言模型得出。假如使用的是二元语言模型预测下一个单词:

    排序的过程就是:p(”不一样“|“我们”)>p(”的爱“|“我们”)>p(”相爱吧“|“我们”)>…>p(“这一家”|”我们“),这些概率值的求法和上面提到的完全一样,数据的来源可以是用户搜索的log。

    三、n-gram的n大小对性能的影响

    n越大,对下一个词出现的约束性信息更多,更大的辨别力,但是更稀疏,并且n-gram的总数也更多,为 V^n个(V为词汇表的大小)

    n越小,在训练语料库中出现的次数更多,更可靠的统计结果,更高的可靠性 ,但是约束信息更少,其中当N为特定值的时候,我们来看一下n-gram可能的总数,如下表:

    对于上图,用一个例子来进行解释,加入目前词汇表中就只有三个单词,”我爱你“,那么bigram的总数是32=9个,有”我我“,我爱,我你,爱爱,爱你,爱我,你你,你我,你爱这9个,所以对应上面的表示是bigrams是200002=400,000,000,trigrams=20000^3 = 8,000,000,000,000

    四、N-Gram模型的缺点

    不过,Ngram模型有其局限性:

    首先,由于参数空间的爆炸式增长,它无法处理更长程的context(N > 3)

    其次,它没有考虑词与词之间内在的联系性。例如,考虑"the cat is walking in the bedroom"这句话。如果我们在训练语料中看到了很多类似“the dog is walking in the bedroom”或是“the cat is running in the bedroom”这样的句子,那么,即使我们没有见过这句话,也可以从“cat”和“dog”(“walking”和“running”)之间的相似性,推测出这句话的概率。然而, Ngram模型做不到。这是因为,Ngram本质上是将词当做一个个孤立的原子单元去处理的。这种处理方式对应到数学上的形式是一个个离散的one-hot向量。例如,对于一个大小为5的词典:{“I”, “love”, “nature”, “luaguage”, “processing”},“nature”对应的one-hot向量为:[0,0,1,0,0],显然,one-hot向量的维度等于词典的大小。这在动辄上万甚至百万词典的实际应用中,面临着巨大的维度灾难问题。

    展开全文
  • 使用字符 N-gram 的电影评论语义分析 在这个项目中,电影评论的语义分析是通过使用字符。 评论数据在文件夹data 。 data/pos中的评论在语义上是正面的,而data/... gram-n : N-gram 中 N 的值,可以是任何正整数。 但是
  • n-gram

    2018-10-26 20:17:00
    n-gram 介绍语言模型 什么是N-gram模型 N-Gram模型详解 应用n-gram模型语言来评估 n-gram 模型其他应用举例 总结 介绍语言模型 什么是语言模型?简单地说,语言模型就是用来计算一个句子的概率的模型,...

    n-gram

    1. 介绍语言模型
    2. 什么是N-gram模型
    3. N-Gram模型详解
    4. 应用n-gram模型语言来评估
    5. n-gram 模型其他应用举例
    6. 总结

    介绍语言模型

    什么是语言模型?简单地说,语言模型就是用来计算一个句子的概率的模型,也就是判断一句话是否合理的概率?说说其应用,一直以来,如何让计算机可以理解我们人类的语言,都是人工智能领域的大问题。而机器翻译,问答系统,语音识别,分词,输入法,搜索引擎的自动补全等也都应用到了语言模型。当然,一开始人们都是进行基于规则的语言模型的研究,但这样往往有很大的问题,后来有人发明了基于统计的语言模型,并发现了其巨大的效果,而今天我们要讲的N-gram语言模型,也正是一种于基于统计的语言模型

    N-gram语言模型可以说是当下应用最广的语言模型,当然了,随着深度学习的发展,现在也有用RNN/LSTM这样的神经网络语言模型,效果比N-gram有时候要更好一些,但RNN解码出每一个词都得现算语言模型分数,有较慢的劣势。

    N-Gram模型详解

    既然要做语言模型,基于统计概率来说,我们需要计算句子的概率大小:,这个也就是最终要求的一句话的概率了,概率大,说明更合理,概率小,说明不合理,不是人话。。。。

    因为是不能直接计算,所以我们先应用条件概率得到

     

    中间插入下条件概率: P(B|A):A 条件下 B 发生的概率。从一个大的空间进入到一个子空间(切片),计算在子空间中的占比。

    然而,如果直接算条件概率转化后的式子的话,对每个词要考虑它前面的所有词,这在实际中意义不大,显然并不好算。那这个时候我们可以添加什么假设来简化吗?可以的,我们可以基于马尔科夫假设来做简化。

    什么是马尔科夫假设?

    马尔科夫假设是指,每个词出现的概率只跟它前面的少数几个词有关。比如,二阶马尔科夫假设只考虑前面两个词,相应的语言模型是三元模型。引入了马尔科夫假设的语言模型,也可以叫做马尔科夫模型。

    马尔可夫链(Markov chain)为状态空间中经过从一个状态到另一个状态的转换的随机过程。该过程要求具备"无记忆"的性质:下一状态的概率分布只能由当前状态决定,在时间序列中它前面的事件均与之无关。

    也就是说,应用了这个假设表明了当前这个词仅仅跟前面几个有限的词相关,因此也就不必追溯到最开始的那个词,这样便可以大幅缩减上述算式的长度。即式子变成了这样:

     

    注:这里的m表示前m个词相关

    然后,我们就可以设置m=1,2,3,....得到相应的一元模型,二元模型,三元模型了,关于

    当 m=1, 一个一元模型(unigram model)即为 :

    当 m=2, 一个二元模型(bigram model)即为 :

    当 m=3, 一个三元模型(trigram model)即为

    而N-Gram模型也就是这样,当m=1,叫1-gram或者unigram ;m=2,叫2-gram或者bigram ;当 m=3叫3-gram或者trigram ;当m=N时,就表示的是N-gram啦。

    说明了什么是N-Gram模型之后,下面说说N-Gram经典应用,同时更深入的理解下:

    利用N-Gram模型评估语句是否合理

    假设现在有一个语料库,我们统计了下面的一些词出现的数量

    下面的这些概率值作为已知条件:

    p(want|<s>) = 0.25

    下面这个表给出的是基于Bigram模型进行计数之结果

    例如,其中第一行,第二列 表示给定前一个词是 "i" 时,当前词为"want"的情况一共出现了827次。据此,我们便可以算得相应的频率分布表如下。

    比如说,我们就以表中的p(eat|i)=0.0036这个概率值讲解,从表一得出"i"一共出现了2533次,而其后出现eat的次数一共有9次,p(eat|i)=p(eat,i)/p(i)=count(eat,i)/count(i)=9/2533 = 0.0036

    下面我们通过基于这个语料库来判断s1="<s> i want english food</s>" 与s2 = "<s> want i english food</s>"哪个句子更合理:

    首先来判断p(s1)

    P(s1)=P(i|<s>)P(want|i)P(english|want)P(food|english)P(</s>|food)

    =0.25×0.33×0.0011×0.5×0.68=0.000031

    再来求p(s2)?

    P(s2)=P(want|<s>)P(i|want)P(english|want)P(food|english)P(</s>|food)

    =0.25*0.0022*0.0011*0.5*0.68 = 0.00000002057

    通过比较我们可以明显发现0.00000002057<0.000031,也就是说s1= "i want english food</s>"更合理。

    当然,以上是对于二元语言模型(bigram model)的,大家也可以算下三元,或者1元语言模型的概率,不过结果都应该是一样的,

    再深层次的分析,我们可以发现这两个句子的概率的不同,主要是由于顺序i want还是want i的问题,根据我们的直觉和常用搭配语法,i want要比want i出现的几率要大很多。所以两者的差异,第一个概率大,第二个概率小,也就能说的通了。

    注意,以上的例子来自:自然语言处理中的N-Gram模型详解 - 白马负金羁 - CSDN博客

    n-gram 模型其他应用举例

    n-gram模型也有其他很多应用,以下一一举例:

    1.研究人类文明:n-gram模型催生了一门新学科(Culturomics)的成立,通过数字化的文本,来研究人类行为和文化趋势。《可视化未来》这本书有详细介绍,也可以通过知乎上的详细介绍,还有就是TED上的视频:what_we_learned_from_5_million_books

    2.搜索引擎:当你在谷歌或者百度的时候,输入一个或几个词,搜索框通常会以下拉菜单的形式给出几个像下图一样的备选,这些备选其实是在猜想你想要搜索的那个词串。如下图:

    实际上这些都是根据语言模型得出。比如使用的是二元语言模型预测下一个单词:排序的过程就是:

    p("不一样"|"我们")>p("的爱"|"我们")>p("相爱吧"|"我们")>.......>p("这一家"|"我们"),这些概率值的求法和上面提到的完全一样,数据的来源可以是用户搜索的log。

    3.输入法:比如输入"zhongguo",可能的输出有:中国,种过,中过等等....这背后的技术就要用到n-gram语言模型了。item就是每一个拼音对应的可能的字。

    .......(还有很多,只有有关语言模型,都可以应用)

    总结

    以上就是今天我们了解的所有内容了。当然,对于n-gram,我们可能需要知道语料库的规模越大,做出的n-gram对统计语言模型才更有用,或者n-gram的n大小对性能的影响也是很大的,比如n更大的时候对下一个词出现的约束性信息更多,有更大的辨别力,n更小的时候在训练语料库中出现的次数更多,有更高的可靠性 ,等等,这些有兴趣的童鞋就自己去查查吧,最后推荐一些书籍:

    吴军. 2012. 《数学之美》.

    关毅. 2007. 哈工大:统计自然语言处理.

    fandywang, 2012,《NLP&统计语言模型》.

    等等,都有对n-gram或者语言模型的讲述,值得一看的!

    ,等等,这些有兴趣的童鞋就自己去查查吧,最后推荐一些书籍:
    [, Děng děng, zhèxiē yǒu xìngqù de tóngxié jiù zìjǐ qù chá chá ba, zuìhòu tuījiàn yīxiē shūjí:]
    , etc., these interested children's shoes will check it out, and finally recommend some books:
     
    展开全文
  • n-gram和skip-gram

    千次阅读 2020-05-28 15:12:06
    N-Gram是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度是N的字节片段序列。 该模型基于这样一种假设,第N个词的出现只与前面N-1个词相关,而与其它...
  • n-gram-开源

    2021-04-26 22:57:13
    N-GRAM-用于从xml文件提取n-gram的工具主要功能:(i)XPath表达式,用于节点选择和停止模式识别; (ii)自定义xsl样式表以过滤n-gram数据。
  • N-gram-Language-Model-源码

    2021-03-31 00:49:19
    N-gram语言模型 简单的N-gram语言模型
  • n-Gram

    2014-11-11 11:56:51
    An n-gram model is a type of probabilistic language model for predicting the next item in such a sequence in the form of a –order Markov model.[1] n-gram models are now widely used in ...
  • N-gram-patterns-开源

    2021-04-26 02:14:36
    该项目的目标是使用google n-gram数据构建共现网络。 该项目提供了一种简单快速的方法来分析Google n-gram数据,该方法由Google Inc.在2006年贡献。
  • n-gram运动-源码

    2021-02-21 05:55:49
    n-gram运动
  • 自然语言处理中的N-Gram模型详解

    万次阅读 多人点赞 2016-04-29 21:32:23
    N-Gram(有时也称为N元模型)是自然语言处理中一个非常重要的概念,通常在NLP中,人们基于一定的语料库,可以利用N-Gram来预计或者评估一个句子是否合理。另外一方面,N-Gram的另外一个作用是用来评估两个字符串之间...
  • 图解N-gram语言模型的原理--以kenlm为例

    万次阅读 多人点赞 2018-08-29 14:34:24
    详细介绍基于N-gram语言模型的原理–从kenlm的源码说起 常用的N-gram训练工具有SRILM、IRSTLM、BerkeleyLM和KenLM等。这几种工具所 用的算法思想基本一致,只是在实现细节上有所不同,所以我们只需理解其中一个训 ...
  • N-gram语言模型

    2018-06-07 10:06:15
    本项目利用python实现N-gram语言模型,采用的平滑算法是Kneser-Ney平滑。
  • n-gram模型

    2019-12-25 17:31:50
    NLP之n-gram模型一、什么是n-gram模型二、n-gram模型用于评估语句是否合理三、二元语言模型判断句子是否合理四、N-gram模型的一个常见应用五、n-gramn大小对性能的影响 一、什么是n-gram模型 N-Gram是一种基于统计...
  • 恶意代码---N-gram特征

    2021-04-28 11:08:36
    1)N-Gram特征的创建:设定滑动窗口长度(字节片段长度N),对恶意代码内容按字节特征大小进行滑动,每一个字节片段称为gram;统计gram出现的频度,设定阈值进行归一化。 2)恶意代码特征提取方法:n-gram字节、抽象...
  • 1.n-gram 自己理解: n代表窗口长度,n-gram的思想就是先滑窗,然后统计频次,然后计算条件概率,你可以取前面n个的条件概率,不一定要取全部的,最后得到的是整个句子的一个概率,那这个概率可以代表句子的合理性。...
  • N-Gram模型入门

    千次阅读 2017-11-02 14:46:43
    本文主要是简单讲解一下语言模型N-Gram。网上已经有许多关于N-Gram模型讲解了,下面几个链接是我在阅读过程中认为比较好的文章。和大家分享一下。 N-Gram文章-1 N-Gram文章-2 1.N-Gram模型
  • 语言模型--n-gram解读

    2019-06-12 14:27:17
    N-Gram是基于一个假设:第n个词出现与前n-1个词相关,而与其他任何词不相关。(这也是隐马尔可夫当中的假设。)整个句子出现的概率就等于各个词出现的概率乘积。各个词的概率可以通过语料中统计计算得到。假设句子T...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,567
精华内容 9,426
关键字:

n-gram