中文不像英文有着天然的空格作为分割符,这样就导致怎么切分中文语句变成了一个难题。不过有一个相对取巧的办法。能够在不考虑言语含义的情况下进行切词。那便是N-Gram。

N-Gram是一种根据核算言语模型的算法。其基本思维是将文本里边的内容依照字节巨细为N的滑动窗口进行切分。形成了长度为N的字节片段序列。

想要研讨N-Gram模型。就要先想了解核算言语模型。核算言语模型是NLP的基础模型。其解决问题的数学思维十分值得学习。

核算言语模型

核算言语模型是由单词组成的序列。S=(w1,w2,w3,…wn)S=(w_1,w_2,w_3,…w_n)。然后关于每一句话SS鉴定一个概率P(S)=P(w1,w2,w3,…wn)P(S)=P(w_1,w_2,w_3,…w_n),如果概率越高。则阐明这句话越契合语法。越像人话。

由于P(S)=P(w1,w2,w3,…,wn)P(S)=P(w_1,w_2,w_3,…,w_n)是不能直接核算的。咱们需求转化一种表达形式,运用条件概率将核算公式改写成:

P(w1,w2,w3,…,wn)=P(w1)P(w2∣w1)P(w3∣w1,w2)…P(wn∣w1,…,wn−1)P(w_1,w_2,w_3,…,w_n)=P(w_1) \times P(w_2|w_1)\times P(w_3|w_1,w_2)…P(w_n|w_1,…,w_n-1)

能够了解为将w1w_1wnw_n一起产生的联合概率,替换成w1w_1产生的概率,加上w1w_1产生情况下w2w_2产生的概率,并以此累加得到的概率。这样就离可核算、可泛化愈加接近了一步。

由于一个完整的语句作为核算单位。其可核算的样本数据是十分有限的。所以得到的核算成果缺乏普遍性。如果呈现一个不曾在样本数据里边呈现的语句的时分,就无法判别其概率了。

只完成条件概率的改写是不够的。像P(wn∣w1,…,wn−1)P(w_n|w_1,…,w_n-1)这样的概率核算。在实际运用中含义不大。一起也不简略运算。

实际情况是,在一句话里边一个词是否或许呈现。依赖的是他领近的几个词。距离很远的词已经不起什么效果了。

推导出这里。就需求引出马可夫假定,来进一步简化核算公式。

马可夫假定。虽然名字很抽象。但是概念很简略。便是每一个词呈现的概率只和它前面的少数几个词有关系。比如说: 一阶马可夫假定,就只考虑前面一个词。

那么具体挑选前面多少个词。咱们能够设置成参数m。根据MM取值的不同,能够将核算公式改写成不同的形式。

当m为1的时分。是一个一元模型。Uni-Gram model:

P(w1,w2,w3,…,wn)=∏i=1nP(wi)P(w_1,w_2,w_3,…,w_n)= \displaystyle\prod_{i=1}^n P(w_i)

当m=2的时分,是一个二元模型,Bi-Gram model:

P(w1,w2,w3,…,wn)=∏i=1nP(wi∣wi−1)P(w_1,w_2,w_3,…,w_n)= \displaystyle\prod_{i=1}^n P(w_i|w_{i-1})

当m=3的时分,是一个三元模型,Tri-Gram model:

P(w1,w2,w3,…,wn)=∏i=1nP(wi∣wi−2,wi−1)P(w_1,w_2,w_3,…,w_n)= \displaystyle\prod_{i=1}^n P(w_i|w_{i-2},w_{i-1})

很简略的发现,当m=N的时分,咱们就得到了N-Gram model,这个推导就阐明晰什么是N-Gram模型。

N-Gram在中文分词中的运用

这时,咱们或许会有一个疑问。N-Gram和中文分词有什么联络?

当一段文本数据词典切分存在多种或许的成果的时分。那么怎么挑选出最优的切分途径。就能够运用N-Gram模型运用核算信息找出一条概率最大的途径。得到终究的分词成果。

以“南京市长江大桥”为例。将其切分为一个有向无环图(DAG)。

在图论中,如果一个有向图从恣意顶点动身经过若干条边回到该点。那么这个图是一个有向无环图。简称DAG。

如下图所示:

自然语言处理01-N-Gram切词方法

或许的切分途径有:

  • 南京/市/长江/大桥
  • 南京/市/长江大桥
  • 南京/市长/江/大桥
  • 南京市/长江/大桥
  • 南京市/长江大桥
  • 南京市长/江/大桥

假定SS是一段文。WWSS上所有或许的切分途径。咱们只要能求解出条件概率P(W∣S)P(W|S)的最大值。咱们就能够得到咱们想要的切分途径。

P(W∣S)P(W|S)这样的核算公式是无法直接求解的,所以咱们需求运用贝叶斯公式将其改写。

贝叶斯公式:

P(W∣S)=P(W)P(S∣W)P(S)P(W|S)=\frac{P(W) \times P(S|W)}{P(S)}

简略的推导过程如下:

P(W∣S)=P(W,S)P(S)=P(W)P(S∣W)P(S)P(W|S) = \frac {P(W,S)}{P(S)} = \frac{P(W)\times P(S|W)}{P(S)}

能够了解为W,S一起产生的概率除以S产生的概率,便是S情况下W产生的概率,一起W,S一起产生的概率。也能够了解为W产生的概率乘以W产生情况下S产生的概率。

由于P(S)为归一化因子,而P(S|W)恒等于1。因而咱们只需求求解P(W)的最大值就好了。这便是咱们上面说到的N-Gram模型。

除此之外。咱们还能够学习N-Gram模型的思维。将中文语句依照N-Gram的切分。

比如:

我爱自然言语处理
当N=1的时分,[我,爱,自,然,语,言,处,理]
当N=2的时分,[我爱,爱自,自然,然语,言语,言处,处理]
当N=3的时分,[我爱自,爱自然,自然语,然言语,言语处,言处理]

其实代码也很简略。下面是一个Python代码实现N-Gram切分函数的划分:

def cut_by_ngram(sentence, min_n, max_n):
    rst = []
    # 遍历切分长度的规划
    for length in range(min_n, min(len(word), max_n) + 1):
        # 依照此刻切分长度进行切分
        for idx in range(0, len(word) - length + 1):
          rst.append(word[idx: idx + length])
    return rst

经过这个比如不难发现,在N不同的取值规划里,是能够切分出语义正确的词汇,当然这里边也包含了大量的语义过错的噪声词。

但在一些特别的事务场景里,这样的成果是十分有价值的,如:新词发现、文本发掘等,下面我结合实际的作业场景,简略为大家阐明一下。

假定有这样一个需求:从小说里发掘出主角的人名。简略的运用分词词典是不或许完成任务的,原因之前的章节介绍过了,这些人名大多都是未登录词。

此刻的一种解决办法便是能够运用N-Gram,将二元、三元、四元词都切出来(由于中文名基本都在这样规划内),此刻主角的名字必定会在这些词里边。

接下来,就要看咱们怎么把它找出来了,这里运用了一个取巧的办法,由于中文人名的姓氏基本都在百家姓里,而百家姓的数据又极端简略从网上取得,这样咱们就能够极大的缩小发掘的规划了。

然后咱们再运用TF-IDF的思维,在这个有限的规划里发掘关键词,而此刻得到的TOP1关键词就大概率是主角的人名了。当然实际效果和运用的语料库规划有关,需求人工恰当增加一些黑名单过滤噪声词和增加一些不常见的姓氏词补充召回。

TF-IDF是一种用于信息检索与文本发掘的常用加权技术

总结

N-Gram模型是十分重要的NLP基础模型,很多NLP的任务都是建立在N-Gram模型的基础之上,掌握N-Gram模型关于了解其它很多NLP模型有很大的帮助。

一起N-Gram模型所涉及到的知识点,如:贝叶斯、DAG、马尔可夫等,关于了解一些杂乱的机器学习模型也是有很大的帮助效果。

在一些特别的中文分词场景里,N-Gram切词法,也会产生奇效,乃至得到比深度学习模型更好的成果。

参考文献

  • /book/684473…