自然语言处理的相关基础知识(一)

自然语言处理的相关基础知识

  • 什么是语言模型
    • 语言模型的发展
    • 语言模型的评价指标:困惑度(Perplexity)

什么是语言模型

概念: 语言模型是计算一个句子是句子的概率的模型。(即这句话是不是按照人的说话方式说出来,别人是否能听懂)
栗子:(假设大多数人认为某某老师讲课很厉害)
某某老师的课讲的真好! 0.8 (既合乎语义也合乎语法
某某老师的课讲的真的很一般! 0.01 (合乎语法但是与语义不符
课的某某老师很真好的! 0.000001 (不合乎语法,也就没有在乎是否合乎语义了
在输入法中,当输入一句话的拼音后,会把最可能是一句话的句子推荐在第一位。有助于用户选择,有利于用户体验 。

语言模型的发展

基于专家语法规则的语言模型
语言学家企图总结出一套通用的语法规则,比如动词后面跟副词,形容词后面跟名词等等。
但是总结出一套通用的语法规则太难了,因为语言是千变万化的,总是有反例提出来推翻语言法则;其次,随着社会的发展,不断有新词出现,并且在打破这种规则,比如奥利给等等。
统计语言模型
就是通过概率计算来构建语言模型
s = [ c 1 , c 2 , ⋯   , c n ] s=[c_{1},c_{2},\cdots,c_{n}] s=[c1,c2,,cn]是一句话, c i c_{i} ci表示句子中第 i i i个词。
P ( s ) = P ( c 1 , c 2 , ⋯   , c n ) = P ( c 1 ) P ( c 2 ∣ c 1 ) P ( c 3 ∣ c 1 c 2 ) … P ( c n ∣ c 1 c 2 … c n − 1 ) P(s)=P(c_{1},c_{2},\cdots,c_{n})=P(c_{1})P(c_{2}|c_{1})P(c_{3}|c_{1}c_{2})\dots P(c_{n}|c_{1}c_{2}\dots c_{n-1}) P(s)=P(c1,c2,,cn)=P(c1)P(c2c1)P(c3c1c2)P(cnc1c2cn1)
把一句话的概率用句子中词的概率相乘,且其中每个词都是在该词前面的词出现的条件下的概率。即把句子的概率转化成求词的概率和词的条件概率,接下来让我们来看一下,如何求词的概率和词的条件概率。

用语料的频率代替概率(用这个词在预料中出现的频率来作为这个词的概率。)
P ( c i ) = c o u n t ( c i ) N P(c_{i})=\dfrac{count(c_{i})}{N} P(ci)=Ncount(ci)
c o u n t ( c i ) count(c_{i}) count(ci)表示该词在语料中出现的次数.
那么已知词 c i − 1 c_{i-1} ci1求之后出现词 c i c_{i} ci的概率怎么求呢?
条件概率公式为 P ( A ∣ B ) = P ( A B ) P ( B ) P(A|B)=\dfrac{P(AB)}{P(B)} P(AB)=P(B)P(AB),则
P ( c i ∣ c i − 1 ) = P ( c i − 1 , c i ) P ( c i − 1 ) P(c_{i}|c_{i-1})=\dfrac{P(c_{i-1},c_{i})}{P(c_{i-1})} P(cici1)=P(ci1)P(ci1,ci)
又因为 P ( c i − 1 ) = c o u n t ( c i − 1 ) N P(c_{i-1})=\dfrac{count(c_{i-1})}{N} P(ci1)=Ncount(ci1) P ( c i − 1 , c i ) = c o u n t ( c i − 1 , c i ) N 1 P(c_{i-1},c_{i})=\dfrac{count(c_{i-1},c_{i})}{N_{1}} P(ci1,ci)=N1count(ci1,ci).
其中 N 1 = N − 1 N_{1}=N-1 N1=N1,因为是前后两个词为一组,则 ( c 1 , c 2 ) (c_{1},c_{2}) (c1,c2), ( c 2 , c 3 ) (c_{2},c_{3}) (c2,c3), ( c 3 , c 4 ) (c_{3},c_{4}) (c3,c4) … \dots ( c n − 1 , c n ) (c_{n-1},c_{n}) (cn1,cn),一共 N − 1 N-1 N1个。
所以 P ( c i ∣ c i − 1 ) = c o u n t ( c i − 1 , c i ) N 1 N c o u n t ( c i − 1 ) P(c_{i}|c_{i-1})=\dfrac{count(c_{i-1},c_{i})}{N_{1}} \dfrac{N}{count(c_{i-1})} P(cici1)=N1count(ci1,ci)count(ci1)N,
因为 N 1 = N − 1 N_{1}=N-1 N1=N1 N N N几乎相等,约掉后为:
P ( c i ∣ c i − 1 ) = c o u n t ( c i − 1 , c i ) c o u n t ( c i − 1 ) ∈ [ 0 , 1 ] P(c_{i}|c_{i-1})=\dfrac{count(c_{i-1},c_{i})}{count(c_{i-1})}\in[0,1] P(cici1)=count(ci1)count(ci1,ci)[0,1]
但是这样构造的语言模型存在这一定的问题,它会因为一些词没有在语料中出现过,就判定这句话的概率为0;也会因为短语(即该词出现的条件)太长导致这句话的概率为0。比如说“弟弟的媳妇很漂亮”这句话的概率很高,但是"姑姑的儿子的表姐的妈妈的弟弟的媳妇很漂亮“这句话的概率就很低,因为弟弟前面出现了很多形容词,那在语料中这些词后面出现弟弟的概率很小,甚至为0,所以导致这句话的概率很低或为0,但是这句话是合乎语义也合乎语法的,该语言模型判断的有些问题。

改进

  1. 统计语言模型中的平滑操作(解决词的概率为0问题)
    有一些词或者词组在语料中没有出现过,但是这不能代表它不可能存在。平滑操作就是给那些没有出现过的词或者词组也给一个很小的概率。
    最常用的平滑操作为加1平滑(Laplace Smoothing):每个词在原来出现次数的基础上加1,即公式变为:
    P ( c i ) = c o u n t ( c i ) + 1 N + n P(c_{i})=\dfrac{count(c_{i})+1}{N+n} P(ci)=N+ncount(ci)+1
    因为给每个词都加了1,则总的词的数量也增加了( n n n是去重后的词的个数)则没出现过的词的词频也不会是为0,则句子的概率也不会为0.
  2. 马尔科夫假设(主要解决了短语太长的问题)
    该假设为下一个词的出现仅依赖于前面的一个词或几个词
    即原来的式子 P ( s ) = P ( c 1 , c 2 , ⋯   , c n ) = P ( c 1 ) P ( c 2 ∣ c 1 ) P ( c 3 ∣ c 1 c 2 ) … P ( c n ∣ c 1 c 2 … c n − 1 ) P(s)=P(c_{1},c_{2},\cdots,c_{n})=P(c_{1})P(c_{2}|c_{1})P(c_{3}|c_{1}c_{2})\dots P(c_{n}|c_{1}c_{2}\dots c_{n-1}) P(s)=P(c1,c2,,cn)=P(c1)P(c2c1)P(c3c1c2)P(cnc1c2cn1)变为以下式子:
    unigram: P ( s ) = P ( c 1 ) P ( c 2 ) P ( c 3 ) ⋯ P ( c n ) P(s)=P(c_{1})P(c_{2})P(c_{3})\cdots P(c_{n}) P(s)=P(c1)P(c2)P(c3)P(cn)假设每一个词只与它本身有关
    bigram: P ( s ) = P ( c 1 ) P ( c 2 ∣ c 1 ) P ( c 3 ∣ c 2 ) ⋯ P ( c n ∣ c n − 1 ) P(s)=P(c_{1})P(c_{2}|c_{1})P(c_{3}|c_{2})\cdots P(c_{n}|c_{n-1}) P(s)=P(c1)P(c2c1)P(c3c2)P(cncn1)假设每一个词只与它前一个词有关
    trigram: P ( s ) = P ( c 1 ) P ( c 2 ∣ c 1 ) P ( c 3 ∣ c 1 c 2 ) ⋯ P ( c n ∣ c n − 2 c n − 1 ) P(s)=P(c_{1})P(c_{2}|c_{1})P(c_{3}|c_{1}c_{2})\cdots P(c_{n}|c_{n-2}c_{n-1}) P(s)=P(c1)P(c2c1)P(c3c1c2)P(cncn2cn1)假设每一个词只与它前两个词有关
    k-gram: P ( s ) = P ( c 1 ) P ( c 2 ∣ c 1 ) P ( c 3 ∣ c 1 c 2 ) ⋯ P ( c n ∣ c n − k + 1 ⋯ c n − 1 ) P(s)=P(c_{1})P(c_{2}|c_{1})P(c_{3}|c_{1}c_{2})\cdots P(c_{n}|c_{n-k+1}\cdots c_{n-1}) P(s)=P(c1)P(c2c1)P(c3c1c2)P(cncnk+1cn1)假设每一个词只与它前k个词有关

语言模型的评价指标:困惑度(Perplexity)

P P ( s ) = P ( c 1 , c 2 , ⋯   , c n ) − 1 n PP(s)=P(c_{1},c_{2},\cdots,c_{n})^{-\frac{1}{n}} PP(s)=P(c1,c2,,cn)n1
持续更新!

你可能感兴趣的:(自然语言处理,算法,人工智能,大数据,深度学习)