N-Gram(有时也称为N元模子)是天然说话处置惩罚中一个很是主要的观点,平日在NLP中,人们基于必定的语料库,可以使用N-Gram来估计或者评估一个句子是否合理。别的一方面,N-Gram的别的一个感化是用来评估两个字符串之间的差别水平。这是隐约匹配中常用的一种手腕。本文将今后最先,进而向读者展现N-Gram在天然说话处置惩罚中的种种powerful的运用。
接待存眷白马负金羁的博客 http://blog.csdn.net/baimafujinji,为包管公式、图表得以准确显示,强烈建议你从该地址上检察原版博文。本博客重要存眷偏向包罗:数字图像处置惩罚、算法设计与剖析、数据构造、机械进修、数据发掘、统计剖析要领、天然说话处置惩罚。
在天然说话处置惩罚时,最常用也最基本的一个操作是就是“模式匹配”,或者称为“字符串查找”。而模式匹配(字符串查找)又分为准确匹配和隐约匹配两种。
所谓准确匹配,各人应当并不生疏,好比我们要统计一篇文章中要害词 “information” 泛起的次数,这是所应用的要领就是准确的模式匹配。这方面的算法也比力多,并且应当是盘算机相干专业必修的基本课中都市涉及到的内容,例如KMP算法、BM算法和BMH算法等等。
别的一种匹配就是所谓的隐约匹配,它的运用也到处可见。例如,一样平常的文字处置惩罚软件(例如,Microsoft Word等)都市供给拼写检讨功效。当你输入一个毛病的单词,例如 “ informtaion” 时,体系会提醒你是否要输入的词实在是 “information” 。将一个可能错拼单词映射到一个推举的准确拼写上所才有的手艺就是隐约匹配。
隐约匹配的要害在于怎样权衡两个长得很像的单词(或字符串)之间的“差别”。这种差别平日又称为“距离”。这方面的详细算法有许多,例如基于编纂距离的观点,人们设计出了 Smith-Waterman 算法和Needleman-Wunsch 算法,个中后者照旧汗青上最早的运用动态计划头脑设计的算法之一。如今Smith-Waterman 算法和Needleman-Wunsch 算法在生物信息学范畴也有主要运用,研讨职员经常用它们来盘算两个DNA序列片断之间的“差别”(或称“距离”)。甚至于在LeetCode上也有一道“No.72 Edit Distance”,其实质就是在考核上述两种算法的实现。可见相干问题离我们并不遥远。
事实上,笔者在新出书的《算法之美——隐匿在数据构造背后的道理》一书中已经具体先容了包罗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举行分段,可得如下效果(我们用下画线标出了个中的公共子串)。
在《算法之美——隐匿在数据构造背后的道理》一书中,我们给出了在C++下实现的盘算两个字符串间N-Gram距离的函数,鉴于全书代码已经在本博客中公布,这里不再反复列出。事实上,许多说话的函数库或者对象箱中都已经供给了封装好的盘算 N-Gram 距离的函数,下面这个例子演示了在Java中应用N-Gram 距离的要领。
针对这个例子,这里须要解释的是:
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的这个运用,我们从几个例子最先。
起首,从统计的角度来看,天然说话中的一个句子 s 可以由任何词串组成,不外概率 P(s) 有年夜有小。例如:
显然,对于中文而言 s1 是一个通顺而有意义的句子,而 s2 则不是,以是对于中文来说, P(s1)>P(s2) 。但差别说话来说,这两个概率值的巨细可能会反转。
其次,别的一个例子是,若是我们给出了某个句子的一个节选,我们实在可以可以或许推测后续的词应当是什么,例如
显然,若是我们知道这个句子片断更多前面的内容的情形下,我们会获得一个越发精确的谜底。这就告知我们,前面的(汗青)信息越多,对后面未知信息的束缚就越强。
若是我们有一个由 m 个词构成的序列(或者说一个句子),我们愿望算得概率 P(w1,w2,⋯,wm) ,凭据链式规矩,可得
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 取得较小值的情形
当 n=1 , 一个一元模子(unigram model)即为
P(w1,w2,⋯,wm)=∏i=1mP(wi)
当 n=2 , 一个二元模子(bigram model)即为
P(w1,w2,⋯,wm)=∏i=1mP(wi|wi−1)
当 n=3 , 一个三元模子(trigram model)即为
P(w1,w2,⋯,wm)=∏i=1mP(wi|wi−2wi−1)
接下来的思绪就比力明白了,可以使用最年夜似然法来求出一组参数,使得练习样本的概率取得最年夜值。
来看一个详细的例子,假设我们如今有一个语料库如下,个中 <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]的例子,假设如今有一个语料库,我们统计了下面一些词泛起的数目
有研讨职员用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
对于这些算法的具体先容,我们将在后续的文章中联合一些实例再来举行评论辩论。
若是你能以前面那些繁冗、庞大的观点和公式中挺过来,恭喜你,你对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是英国有名女作家,代表作有《狂妄与私见》等)
再来看两个例子,你是否能看出它们是根据哪位文豪(或者语料库)的气势派头天生的吗?
谜底是第一个是莎士比亚,第二个是华尔街日报。最后一个问题留给读者思索,你以为上面两个文段所应用的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