n-gram_n-gram模型 - CSDN
精华内容
参与话题
  • 自然语言处理中的N-Gram模型详解

    万次阅读 2017-04-25 17:17:25
    N-Gram(有时也称为N元模子)是天然说话处置惩罚中一个很是主要的观点,平日在NLP中,人们基于必定的语料库,可以使用N-Gram来估计或者评估一个句子是否合理。别的一方面,N-Gram的别的一个感化是用来评估两个字符串...

    N-Gram(有时也称为N元模子)是天然说话处置惩罚中一个很是主要的观点,平日在NLP中,人们基于必定的语料库,可以使用N-Gram来估计或者评估一个句子是否合理。别的一方面,N-Gram的别的一个感化是用来评估两个字符串之间的差别水平。这是隐约匹配中常用的一种手腕。本文将今后最先,进而向读者展现N-Gram在天然说话处置惩罚中的种种powerful的运用。

    • 基于N-Gram模子界说的字符串距离
    • 使用N-Gram模子评估语句是否合理
    • 应用N-Gram模子时的数据腻滑算法

    接待存眷白马负金羁的博客 http://blog.csdn.net/baimafujinji,为包管公式、图表得以准确显示,强烈建议你从该地址上检察原版博文。本博客重要存眷偏向包罗:数字图像处置惩罚、算法设计与剖析、数据构造、机械进修、数据发掘、统计剖析要领、天然说话处置惩罚。


    基于N-Gram模子界说的字符串距离

    在天然说话处置惩罚时,最常用也最基本的一个操作是就是“模式匹配”,或者称为“字符串查找”。而模式匹配(字符串查找)又分为准确匹配隐约匹配两种。

    所谓准确匹配,各人应当并不生疏,好比我们要统计一篇文章中要害词 “information” 泛起的次数,这是所应用的要领就是准确的模式匹配。这方面的算法也比力多,并且应当是盘算机相干专业必修的基本课中都市涉及到的内容,例如KMP算法、BM算法和BMH算法等等。

    别的一种匹配就是所谓的隐约匹配,它的运用也到处可见。例如,一样平常的文字处置惩罚软件(例如,Microsoft Word等)都市供给拼写检讨功效。当你输入一个毛病的单词,例如 “ informtaion” 时,体系会提醒你是否要输入的词实在是 “information” 。将一个可能错拼单词映射到一个推举的准确拼写上所才有的手艺就是隐约匹配。

    隐约匹配的要害在于怎样权衡两个长得很像的单词(或字符串)之间的“差别”。这种差别平日又称为“距离”。这方面的详细算法有许多,例如基于编纂距离的观点,人们设计出了 Smith-Waterman 算法和Needleman-Wunsch 算法,个中后者照旧汗青上最早的运用动态计划头脑设计的算法之一。如今Smith-Waterman 算法和Needleman-Wunsch 算法在生物信息学范畴也有主要运用,研讨职员经常用它们来盘算两个DNA序列片断之间的“差别”(或称“距离”)。甚至于在LeetCode上也有一道“No.72 Edit Distance”,其实质就是在考核上述两种算法的实现。可见相干问题离我们并不遥远。

    N-Gram在隐约匹配中的运用

    事实上,笔者在新出书的《算法之美——隐匿在数据构造背后的道理》一书中已经具体先容了包罗Needleman-Wunsch算法、Smith-Waterman算法、N-Gram算法、Soundex算法、Phonix算法等在内的多种距离界说算法(或隐约匹配算法)。现在天为了引出N-Gram模子在NLP中的其他运用,我们起首来先容一下怎样使用N-Gram来界说字符串之间的距离。

    我们除了可以界说两个字符串之间的编纂距离(平日使用Needleman-Wunsch算法或Smith-Waterman算法)之外,还可以界说它们之间的N-Gram距离。N-Gram(有时也称为N元模子)是天然说话处置惩罚中一个很是主要的观点。假设有一个字符串 s,那么该字符串的N-Gram就表现按长度 N 切分原词获得的词段,也就是 s 中所有长度为 N 的子字符串。假想若是有两个字符串,然后划分求它们的N-Gram,那么就可以从它们的共有子串的数目这个角度去界说两个字符串间的N-Gram距离。可是仅仅是简朴地对共有子串举行计数显然也存在不足,这种计划显然疏忽了两个字符串长度差别可能导致的问题。好比字符串 girl 和 girlfriend,二者所拥有的公共子串数目显然与 girl 和其自身所拥有的公共子串数目相等,可是我们并不克不及据此以为 girl 和girlfriend 是两个等同的匹配。

    为相识决该问题,有学者便提出以非反复的N-Gram分词为基本来界说 N-Gram距离这一观点,可以用下面的公式来表述: 
    |GN(s)|+|GN(t)|2×|GN(s)GN(t)| 
    此处,|GN(s)| 是字符串 s 的 N-Gram荟萃,N 值一样平常取2或者3。以 N = 2 为例对字符串Gorbachev和Gorbechyov举行分段,可得如下效果(我们用下画线标出了个中的公共子串)。 


     

    联合上面的公式,即可算得两个字符串之间的距离是8 + 9 − 2 × 4 = 9。显然,字符串之间的距离越小,它们就越靠近。当两个字符串完整相等的时间,它们之间的距离就是0。

    使用N-Gram盘算字符串间距离的Java实例

    在《算法之美——隐匿在数据构造背后的道理》一书中,我们给出了在C++下实现的盘算两个字符串间N-Gram距离的函数,鉴于全书代码已经在本博客中公布,这里不再反复列出。事实上,许多说话的函数库或者对象箱中都已经供给了封装好的盘算 N-Gram 距离的函数,下面这个例子演示了在Java中应用N-Gram 距离的要领。

    针对这个例子,这里须要解释的是:

    • 挪用函数须要引用lucene的JAR包,我所应用的是lucene-suggest-5.0.0.jar
    • 前面我们所给出的算法盘算所得为一个绝对性的距离分值。而Java中所给出的函数在此基本长进行了归一化,也就是说所得之效果是一个介于0~1之间的浮点数,即0的时间表现两个字符串完整差别,而1则表现两个字符串完整雷同。
    import org.apache.lucene.search.spell.*;
    
    public class NGram_distance {
    
        public static void main(String[] args) {
    
            NGramDistance ng = new NGramDistance();
            float score1 = ng.getDistance("Gorbachev", "Gorbechyov");
            System.out.println(score1);
            float score2 = ng.getDistance("girl", "girlfriend");
            System.out.println(score2);
        }
    }

    有兴致的读者可以在引用相干JAR包之后在Eclipse中履行上述Java法式,你会发明,和我们预期的一样,字符串Gorbachev和Gorbechyov所得之距离评分较高(=0.7),解释二者很靠近;而girl和girlfriend所得之距离评分并不高(=0.3999),解释二者并不很靠近。


    使用N-Gram模子评估语句是否合理

    从如今最先,我们所评论辩论的N-Gram模子跟前面讲过N-Gram模子从外在来看已经年夜不雷同,可是请注重它们内涵的接洽(或者说实质上它们仍然是同一的观点)。

    为了引入N-Gram的这个运用,我们从几个例子最先。 
    起首,从统计的角度来看,天然说话中的一个句子 s 可以由任何词串组成,不外概率 P(s) 有年夜有小。例如:

    • s1 = 我刚吃过晚饭
    • s2 = 刚我过晚饭吃

    显然,对于中文而言 s1 是一个通顺而有意义的句子,而s2 则不是,以是对于中文来说,P(s1)>P(s2) 。但差别说话来说,这两个概率值的巨细可能会反转。

    其次,别的一个例子是,若是我们给出了某个句子的一个节选,我们实在可以可以或许推测后续的词应当是什么,例如

    • the large green __ . Possible answer may be “mountain” or “tree” ?
    • Kate swallowed the large green __ . Possible answer may be “pill” or “broccoli” ?

    显然,若是我们知道这个句子片断更多前面的内容的情形下,我们会获得一个越发精确的谜底。这就告知我们,前面的(汗青)信息越多,对后面未知信息的束缚就越强。

    若是我们有一个由 m 个词构成的序列(或者说一个句子),我们愿望算得概率 P(w1,w2,,wm) ,凭据链式规矩,可得 
    P(w1,w2,,wm)=P(w1)P(w2|w1)P(w3|w1,w2)P(wm|w1,,wm1) 
    这个概率显然并欠好算,不妨使用马尔科夫链的假设,即当前这个词仅仅跟前面几个有限的词相干,是以也就不必追溯到最最先的谁人词,如许便可以年夜幅缩减上诉算式的长度。即 
    P(wi|w1,,wi1)=P(wi|win+1,,wi1) 
    特殊地,对于 n 取得较小值的情形 
    当 n=1, 一个一元模子(unigram model)即为 
    P(w1,w2,,wm)=i=1mP(wi) 
    当 n=2, 一个二元模子(bigram model)即为 
    P(w1,w2,,wm)=i=1mP(wi|wi1) 
    当 n=3, 一个三元模子(trigram model)即为 
    P(w1,w2,,wm)=i=1mP(wi|wi2wi1) 
    接下来的思绪就比力明白了,可以使用最年夜似然法来求出一组参数,使得练习样本的概率取得最年夜值。

    • 对于unigram model而言,个中c(w1,..,wn) 表现 n-gram w1,..,wn 在练习语估中泛起的次数,M 是语料库中的总字数(例如对于 yes no no no yes 而言,M=5) 
      P(wi)=C(wi)M
    • 对于bigram model而言, 
      P(wi|wi1)=C(wi1wi)C(wi1)
    • 对于n-gram model而言, 
      P(wi|win1,,wi1)=C(win1,,wi)C(win1,,wi1)

    来看一个详细的例子,假设我们如今有一个语料库如下,个中<s1><s2> 是句首标志,</s2></s1> 是句尾标志: 
    <s1><s2>yesnonononoyes</s2></s1><s1><s2>nononoyesyesyesno</s2></s1>
    下面我们的使命是来评估如下这个句子的概率: 
    <s1><s2>yesnonoyes</s2></s1> 
    我们来演示使用trigram模子来盘算概率的效果 
    P(yes|<s1><s2>)=12,P(no|<s2>yes)=1P(no|yesno)=12,P(yes|nono)=25P(</s2>|noyes)=12,P(</s1>|yes</s2>)=1
    以是我们请求的概率就即是: 
    12×1×12×25×12×1=0.05

    再举一个来自文献[1]的例子,假设如今有一个语料库,我们统计了下面一些词泛起的数目


     

    下面这个概率作为其他一些已知前提给出: 
    P(i|<s>)=0.25P(english|want)=0.0011P(food|english)=0.5P(</s>|food)=0.68
    下面这个表给出的是基于Bigram模子举行计数之效果 

     

    例如,个中第一行,第二列 表现给定前一个词是 “i” 时,当前词为“want”的情形一共泛起了827次。据此,我们便可以算得响应的频率漫衍表如下。 

     

    由于我们从表1中知道 “i” 一共泛起了2533次,而厥后泛起 “want” 的情形一共有827次,以是P(want|i)=827/25330.33 
    如今设s1=<s>iwantenglishfood</s> ,则可以算得 
    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


    应用N-Gram模子时的数据腻滑算法

    有研讨职员用150万词的练习语料来练习 trigram 模子,然后用同样泉源的测试语料来做验证,效果发明23%的 trigram 没有在练习语估中泛起过。这实在就意味着上一节我们所盘算的那些概率有空为 0,这就导致了数据希罕的可能性,我们的表3中也确切有些为0的情形。对说话而言,因为数据希罕的存在,极年夜似然法不是一种很好的参数预计措施。

    这时的解决措施,我们称之为“腻滑手艺”(Smoothing)或者 “减值” (Discounting)。其重要计谋是把在练习样本中泛起过的事务的概率恰当减小,然后把减小获得的概率密度分派给练习语估中没有泛起过的事务。现实中腻滑算法有许多种,例如: 
      ▸ Laplacian (add-one) smoothing 
      ▸ Add-k smoothing 
      ▸ Jelinek-Mercer interpolation 
      ▸ Katz backoff 
      ▸ Absolute discounting 
      ▸ Kneser-Ney

    对于这些算法的具体先容,我们将在后续的文章中联合一些实例再来举行评论辩论。


    A Final Word

    若是你能以前面那些繁冗、庞大的观点和公式中挺过来,恭喜你,你对N-Gram模子已经有所熟悉了。只管,我们还没来得及商量腻滑算法(但它即将泛起在我的下一篇博文里,若是你以为还未过瘾的话),可是实在你已经控制了一个相对powerful的对象。你可以能会问,在实践中N-Gram模子有哪些详细运用,作为本文的竣事,主页君便在此增补几个你曾见过的或者曾经好奇它是怎样实现的例子。

    Eg.1 
    搜刮引擎(Google或者Baidu)、或者输入法的料想或者提醒。你在用百度时,输入一个或几个词,搜刮框平日会以下拉菜单的情势给出几个像下图一样的备选,这些备选实在是在料想你想要搜刮的谁人词串。再者,当你用输入法输入一个汉字的时间,输入法平日可以接洽出一个完全的词,例如我输入一个“刘”字,平日输入法会提醒我是否要输入的是“刘备”。经由过程上面的先容,你应当可以或许很灵敏的觉察,这实在是以N-Gram模子为基本来实现的,若是你能有这种觉醒或者设法主意,那我不得不恭喜你,都学会抢答了!


     

    Eg.2 
    某某作家或者语料库气势派头的文本主动天生。这是一个相当有趣的话题。来看下面这段话(该例子取材自文献【1】):

    “You are uniformly charming!” cried he, with a smile of associating and now and then I bowed and they perceived a chaise and four to wish for.

    你应当还没有感受到它有什么异样吧。但事实上这并不是由人类写出的句子,而是盘算机凭据Jane Austen的语料库使用trigram模子主动天生的文段。(Jane Austen是英国有名女作家,代表作有《狂妄与私见》等)

    再来看两个例子,你是否能看出它们是根据哪位文豪(或者语料库)的气势派头天生的吗?

    • This shall forbid it should be branded, if renown made it empty.
    • They also point to ninety nine point six billion dollars from two hundred four oh three percent of the rates of interest stores as Mexico and Brazil on market conditions.

    谜底是第一个是莎士比亚,第二个是华尔街日报。最后一个问题留给读者思索,你以为上面两个文段所应用的n-gram模子中,n应当即是几多?


    推举浏览和参考文献:

    [1] Speech and Language Processing. Daniel Jurafsky & James H. Martin, 3rd. Chapter 4 
    [2] 本文中的一些例子和形貌来自 北京年夜学 常宝宝 以及 The University of Melbourne “Web Search and Text Analysis” 课程的幻灯片素材

    转载自: http://www.procedurego.com/article/16973.html

    展开全文
  • 自然语言处理NLP中的N-gram模型

    万次阅读 多人点赞 2019-11-11 11:18:22
    自然语言处理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

    展开全文
  • N-gram 特征提取

    千次阅读 2019-04-26 15:17:53
    N-gram 是一种基于统计语言模型的算法,又被称为一阶马尔科夫链。它的基本思想是将文本里面的内容按照字节进行大小为 N 的滑动窗口操作,形成了长度是 N 的字节片段序列。每一个字节片段称为 gram,对所有的 gram 的...

    N-gram 是一种基于统计语言模型的算法,又被称为一阶马尔科夫链。它的基本思想是将文本里面的内容按照字节进行大小为 N 的滑动窗口操作,形成了长度是 N 的字节片段序列。每一个字节片段称为 gram,对所有的 gram 的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键 gram 列表,也就是这个文本的向量特征空间。列表中的每一种 gram 就是一个特征向量维度。

    算法优点:

    1.语种无关性,对中 英 繁 都通用。
    2.不需要进行语言学上的处理。

    3.容错性强。

    N-gram 算法采用固定长度为 N 的滑动窗口进行切分,目前常用 N-gram 模型是二元的 Bi-gram 和三元的 Tri-gram 模型。对两种模型的切分方法进行比较,比如 “北京  欢迎  你的  到来”,Bi-gram 切分就是 “北京欢迎   欢迎你的   你的到来”,Tri-gram 切分就是 “北京欢迎你的   欢迎你的到来”。

    特征提取过程如下:

    1.首先对文档进行粗切分,得到语段序列。
    2.对语段序列进行 gram 切分,得到gram 频度列表。并选择频度大于设定阈值的 gram 片段作为特征向量。
    3.每个gram 片段就是一个维度,形成特征向量表。

    展开全文
  • N-Gram语言模型

    万次阅读 多人点赞 2016-04-29 11:40:33
    一、n-gram是什么wikipedia上有关n-gram的定义: n-gram是一种统计语言模型,用来根据前(n-1)个item来预测第n个item。在应用层面,这些item可以是音素(语音识别应用)、字符(输入法应用)、词(分词应用)或碱基...

    一、n-gram是什么

    wikipedia上有关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的理论依据

    n-gram语言模型的思想,可以追溯到信息论大师香农的研究工作,他提出一个问题:给定一串字母,如”for ex”,下一个最大可能性出现的字母是什么。从训练语料数据中,我们可以通过极大似然估计的方法,得到N个概率分布:是a的概率是0.4,是b的概率是0.0001,是c的概率是…,当然,别忘记约束条件:所有的N个概率分布的总和为1.
    n-gram模型概率公式推导。根据条件概率和乘法公式:
    这里写图片描述
    得到
    这里写图片描述
    拿一个应用来讲,假设T是由词序列A1,A2,A3,…An组成的,那么P(T)=P(A1A2A3…An)=P(A1)P(A2|A1)P(A3|A1A2)…P(An|A1A2…An-1)
    如果直接这么计算,是有很大困难的,需要引入马尔科夫假设,即:一个item的出现概率,只与其前m个items有关,当m=0时,就是unigram,m=1时,是bigram模型。
    因此,P(T)可以求得,例如,当利用bigram模型时,P(T)=P(A1)P(A2|A1)P(A3|A2)…P(An|An-1)
    而P(An|An-1)条件概率可以通过极大似然估计求得,等于Count(An-1,An)/Count(An-1)。

    三、n-gram的数据长什么样

    其实,说n-gram长什么样,是不严谨的。它只是一个语言模型,只要把需要的信息存储下来,至于什么格式都是依据应用来定。如,著名的google books Ngram Viewer,它的n-gram数据格式是这样的:

    circumvallate   1978   335    91
    circumvallate   1979   261    91

    代表了一个1-gram的数据片段,第一行的意思是,“circumvallate”这个单词在1978年出现335次,存在91本书中。这些元数据,除了频率335次是必须的,其他的元数据(例如,还有词性等)可以根据应用需求来定。下面是一个5-gram数据片段:

    analysis is often described as  1991  1   1   1

    当然,也可以是其他形式,例如,HanLP的n-gram模型是bigram:

    @北冰洋   2@卢森堡   1@周日    1@因特网   1@地 1@地域    1@塔斯社   9@尚义    12@巴 1@巴勒斯坦  1@拉法耶特  3@拍卖    1@昆明    1

    每一行代表,两个相邻单词共同出现时的频率(相对于背后的语料库)。

    四、n-gram有什么用

    4.1 文化研究

    n-gram模型看起来比较枯燥和冰冷,但实际上,google books ngram项目,催生了一门新学科(Culturomics)的成立,通过数字化的文本,来研究人类行为和文化趋势。可查看知乎上的详细介绍,。《可视化未来》这本书也有详细介绍。
    这里写图片描述
    还有TED上的视频《what_we_learned_from_5_million_books》,十分精彩。
    这里写图片描述

    4.2 分词算法

    4.3 语音识别

    4.4 输入法

    大家每天都在使用的东西,请看:输入“tashiyanjiushengwude”,可能的输出有:

    它实验救生无得
    他实验就生物的
    他是研究圣物的
    他是研究生物的

    究竟哪个是输入者最想表达的意思,这背后的技术就要用到n-gram语言模型了。item就是每一个拼音对应的可能的字。还记得智能ABC吗?据说是运用n-gram的鼻祖了。
    这里写图片描述

    不过搜狗输入法后来居上,它采用更先进的云计算技术(n-gram模型的数据量可是相当之大,后面会说到)
    这里写图片描述

    4.5 机器翻译

    五、n-gram的更多认识

    做概率统计的都知道,语料库的规模越大,做出的n-gram对统计语言模型才更有用,例如,google books ngram项目,单独对中文的n-gram,从1551年到2009年,总体规模如下:

    ....
    1999    1046431040  8988394 9256
    2000    1105382616  10068214    10504
    2001    1017707579  8508116 9426
    2002    1053775627  9676792 11116
    2003    1003400478  9095202 10624
    2004    1082612881  9079834 11200
    2005    1326794771  10754207    13749
    2006    1175160606  9381530 12030
    2007    826433846   6121305 7291
    2008    752279725   5463702 6436
    2009    442976761   2460245 2557
    year    n-gram count    book page count book volumecount 
        26859461025 252919372   302652
    

    总共才扫描了30万卷书,生成的n-gram(从unigram到5-gram)的个数就达到了268亿多个。英文的n-gram在4684多亿多:

    ....
    1999    9997156197  48914071    91983
    2000    11190986329 54799233    103405
    2001    11349375656 55886251    104147
    2002    12519922882 62335467    117207
    2003    13632028136 68561620    127066
    2004    14705541576 73346714    139616
    2005    14425183957 72756812    138132
    2006    15310495914 77883896    148342
    2007    16206118071 82969746    155472
    2008    19482936409 108811006   206272
    year    n-gram count    book page count book volumecount 
        468491999592    2441898561  4541627
    

    这个数量级的n-gram,无论是存储还是检索,对技术都是极大的挑战。
    以上是google books n-gram的相关数据,在前些年,google还提供了基于web的1个T的n-gram,规模如下:

    Number of tokens:    1,024,908,267,229
    Number of sentences:    95,119,665,584
    Number of unigrams:         13,588,391
    Number of bigrams:         314,843,401
    Number of trigrams:        977,069,902
    Number of fourgrams:     1,313,818,354
    Number of fivegrams:     1,176,470,663

    共950亿个句子,10000亿个token,还只是2006年一年的数据。
    除了google,微软通过它的BING搜索,也开放了PB级别(1PB = 1PeraByte = 1024 TB = 1024 * 1024 * 1024 MB)的n-gram,这种数量级别的,只能放云存储上了。

    参考资料:
    斯坦福大学自然语言处理公开课

    展开全文
  • N-Gram模型介绍

    千次阅读 2019-02-23 01:40:18
    1.N-Gram的原理 N-Gram是基于一个假设:第n个词出现与前n-1个词相关,而与其他任何词不相关。(这也是隐马尔可夫当中的假设。)整个句子出现的概率就等于各个词出现的概率乘积。各个词的概率可以通过语料中统计计算...
  • N-gram详解分析

    千次阅读 2017-10-04 15:02:29
    作者: 龙心尘 && 寒小阳 时间:2016年2月。 出处: http://blog.csdn.net/longxinchen_ml/article/details/50646528 http://blog.csdn.net/han_xiaoyang/article/details/50646667...1. 引言:朴素贝叶斯
  • N-gram算法

    千次阅读 2016-11-20 15:58:54
    n-gram模型是一种统计语言模型。在语音识别中,一个声学信号对应于一个语句,语音识别器需要找到其对应的可能性最大的语言文本。首先该模型基于这样一种假设,第N个词的出现只与前面N-1个词相关,而与其它任何词都不...
  • 特征工程之N-Gram(二)

    千次阅读 2018-08-12 18:50:14
    一、N-Gram模型 (1)什么是n-gram模型  N-Gram是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度是N的字节片段序列。  每一个字节片段称为gram,...
  • N-Gram 算法用来做相似度比较

    千次阅读 2010-10-19 17:02:00
    N-Gram 模型基于这样一种假设,第n个词的出现只与前面n-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。在拼写检查里即是一个字母的出现概率只和前n-1个字母的出现概率相关,并且是...
  • N-gram模型的优缺点

    千次阅读 2014-04-10 16:40:45
    不知不觉发现最近学了好多查询扩展方面的东东,对
  • n-gram代码实现源码

    千次阅读 2018-04-28 10:29:13
    for i range (len(input)-n+1):这个for循环的长度是len-n+1,举个例子:我爱自然语言处理,当n=2时,len=8;我爱/爱自/自然/然语/语言/言处/处理,总共8-2+1=7个划分结果,“ ”.join(input[i:i+n]这个是将input的...
  • 基于jieba中文分词进行N-Gram

    千次阅读 2018-02-06 14:01:20
    jieba提供很好的中文分词,但是并没有提供N-Gram;sklearn的CountVectorizer能提供很好的N-Gram分词,但却没有jieba那么对切词灵活,下面就介绍基于jieba分词进行N-Gram。#coding=utf-8 ''' Created on 2018-2-6''' ...
  • 自然语言处理中n-gram模型学习笔记

    万次阅读 2018-01-26 22:24:20
    语言模型  对于很多自然语言处理领域的问题,比如机器翻译,处理要确定预测结果中的字词集合以外,还有一个非常重要的方面就是要评估文本序列是否符合人类使用的习惯。也就是要判断文本是否通顺、自然、甚至在翻译...
  • 知道了FastText原理之后,我们...为了弥补这个不足,FastText增加了N-gram的特征。 何为N-gram特征 为了处理词顺序丢失的问题,FastText增加了N-gram的特征。具体做法是把N-gram当成一个词,也用embedding向量来表示...
  • python处理文本使用n-gram方法

    千次阅读 2018-12-04 11:20:53
    #tokenizer function, this will make 3 grams of each query def get_ngrams(query): tempQuery = str(query) ngrams = [] for i in range(0,len(tempQuery)-3): ngrams.append(tempQuery[i:i...
  • Skip-Gram:CBOW&Skip-Gram算法相关论文、原理配图、关键步骤详细攻略 目录 CBOW&Skip-Gram算法相关论文 CBOW&Skip-Gram算法原理配图 CBOW&Skip-Gram算法关键步骤 CBOW&Skip-...
  • 文本特征工程之N-Gram

    千次阅读 2018-01-06 11:59:49
    最近在做文本的特征工程构建,陆陆续续搜集到一些公认的对文本表征能力比较强的特征,比如频次法、tf-idf、互信息方法、N-Gram、Word2Vec等,文本特征包含以上这些但也不限于这些。频次法频次法,顾名思义,十分简单...
  • n-gram模型中的平滑方法

    千次阅读 2018-08-14 17:10:29
    当使用n-gram模型对测试语料中的句子进行评估时,如果句子中包含在训练集中未出现的n元语法,则计算出来句子出现的概率为0。例如上一篇博客语言模型和n元语法中的例子,此时用该模型来计算下面句子的概率: 因此...
  • 改良型BLEU(n-gram) 短译句的惩罚因子 总结 附录(源代码) 引子 最近在做一个深度学习的小项目: Caption generation model 其中在快速评估模型的时候使用到了Bleu这一个指标, 于是花了一点时间来研究了这...
  • N-Gram 分词算法 Python 实现

    千次阅读 2020-05-29 19:09:26
    N-Gram 算法是一种单词级别的窗口取词算法,N-Gram(有时也称为N元模型)是自然语言处理中一个非常重要的概念,通常在NLP中,人们基于一定的语料库,可以利用N-Gram来预计或者评估一个句子是否合理。另外一方面,N-...
1 2 3 4 5 ... 20
收藏数 19,211
精华内容 7,684
热门标签
关键字:

n-gram