自然语言处理

作者: 王阿根 | 来源:发表于2019-01-22 16:44 被阅读1次

    自然语言历史

    什么是自然语言处理?人工智能领域中帮助计算机理解,处理以及运用人类自然语言的分支学科。

    自然语言的理解?什么是自然语言的理解,就是给出一句话,机器从这句话中分析出有用的信息,比如:判断一个词是动词还是名词,称为词性标注,又或者分识别辨命名实体,比如说公司需要给其他几个公司发送同样模板的邮件,那么我们提取这几个公司的公司名称(命名实体),套用一个模板即可。还有情绪分析,电商,股市等都会用到,判断用户对商品或某只股票的态度是正面的还是负面的等等。

    自然语言生成?举例:机器翻译、语音识别、问答系统。

    自然语言处理的主要困难--消除歧义。我们人类本身所见过的语料库很多,我们可以根据语境、上下文来区分语义,但是计算机却不能,下面来举例计算机在做语言处理时都会遇到什么问题:

    即使语言处理比较困难,但是自然语言处理还是应用到很多方面,比如:信息提取、语音识别、文档摘要、聊天机器人、垃圾邮件过滤、机器翻译等等。

    语言模型

    假设我们拥有一个语料库用V表示: V= {我,中国人.....},有了词就可以通过当前的语料库生成一些句子了,句子用V^*来表示:V^*: 我<S>、 我是<S>、我是中<S>、 我是中国<S>,其中<S>代表结束符,表示该句子结束,那么我们用概率建立一个概率模型,在同一个语料库中,每个句子出现都给它一个概率,所有句子的概率加起来等于1:\sum_{x\in V^* } p(x) = 1, p(x) \geq 0 \forall x\in V^*,其中x为 V^*里面的其中一个句子。

    那么一个句子出现的概率是怎么算出来的呢,接下来我们来研究一下:首先统计一下在当前语料库中一共包含多少个句子,假定为N个;然后统计某句话在这个语料库中出现的次数,假设句子为:x_{1} ,x_{2} ...x_{n} ,那么某一句在语料库中出现的次数为c(x_{1} ,x_{2} ...x_{n} ),那么这个句子出现的概率就是:p(x_{1}...x_{n} ) = \frac{c(x_{1} ...x_{n} )}{N} ,但是有个问题,后面的词出现受前面的词影响,这样怎么办呢?

    可以通过马尔可夫过程来计算:

    X:在概率中一般代表随机变量,x:代表取值

    给定一个离散型随机变量序列X_{1} ,X_{2} ...X_{n}  \in V,建模: P(X_{1} =  x_{1}...X_{n} =  x_{n}),根据链式法则:P(X_{1} =  x_{1}...X_{n} =  x_{n}) = P(X_{1} =  x_{1})\prod\nolimits_{i=2}^n P(X_{i} =  x_{i}| X_{1} =  x_{1}....X_{i-1} =  x_{i-1})

    能看懂吗?就是P(X_{i} =  x_{i}) 的概率受X_{i} 前面i-1 X_{1} =  x_{1}....X_{i-1} =  x_{i-1}的影响。

    一阶马尔科夫过程:P(X_{i} =  x_{i}| X_{1} =  x_{1}....X_{i-1} =  x_{i-1})= P(X_{i} =  x_{i}| X_{i-1} =  x_{i-1})

    一阶马尔可夫情形下,X1到Xn的展开:

    P(X_{1} =  x_{1}...X_{n} =  x_{n}) = P(X_{1} =  x_{1})\prod\nolimits_{i=2}^n P(X_{i} =  x_{i}| X_{i-1} =  x_{i-1})

    二阶马尔科夫过程:

    P(X_{i} =  x_{i}| X_{1} =  x_{1}....X_{i-1} =  x_{i-1})= P(X_{i} =  x_{i}| X_{i-1} =  x_{i-1},X_{i-2} =  x_{i-2})

    二阶马尔可夫情形下,X1到Xn的展开:

    P(X_{1} =  x_{1}...X_{n} =  x_{n}) = P(X_{1} =  x_{1})P(X_{2} =  x_{2},X_{1} =  x_{1})\prod\nolimits_{i=3}^n P(X_{i} =  x_{i}| X_{i-1} =  x_{i-1},X_{i-2} =  x_{i-2})

    可变长序列:

    对于自然语言来说,随机过程序列的长度n也是一个随机变量,因此我们引入State来表示句子的开始和结束:**代表开始,<S>代表结束

    三元语言模型(trigram)

    我有一个词汇表V, 对每一个三元组u,v,w我们有一个参数q(w|u,v),这里的w\in V \cup {<S>},u,v\in V\cup {*}。对于任何一个句子x_{1} ,x_{2} ...x_{n} ,其中x_{i} \in V,i=1...(n-1), x_{n} =<S>句子的概率由如下三元语言模型描述:P(x_{1} ,x_{2}...,x_{n})= \prod_{i=1}^n q(x_{i}|x_{i-1},x_{i-2})

    举例:句子是:**我是中国人<S>

    模型:p(我是中国人<S>) = q(我|*,*)q(是|我,*)q(中|我,是)q(国|中,是)q(人|中,国)q(<S>|国,人)

    那么等号右侧的概率怎么计算呢?在概率论中使用极大似估计:q(w|u,v) = \frac{Count(w,u,v)}{Count(u,v)} ,例如:q(人|中,国) = \frac{Count(中,国,人)}{Count(中,国)}  

    N = |V|,代表词汇表的数量,那么三元模型参数数量为N^3

    有了模型以后和参数,怎么评价模型的好坏?那么就引入了“迷惑度(Preplexity)”

    迷惑度Preplexity:

    测试集中有m 个句子:s_{1} ,s_{2} ,...s_{m} ,计算log的概率:log\prod_{i=1}^mp(s_{i} ) =\sum_{i=1}^mlog(p(s_{i} ) ,为什么使用log,一是因为(p(s_{i})的概率非常小,一般为10的-n次方。二是(p(s_{i})的求和为log的乘积。

    Preplexity = 2^-l (2 的 -l次方) 其中l = \frac{1}{M} \sum\nolimits_{i=1}^mlog((p(s_{i})  ,M是测试集总词量,迷惑度越小越好,句子的概率越大,语言模型越好。

    稀疏性问题:

    大规模数据统计方法与有限的训练语料库之间必然产生数据稀疏问题,什么意思呢?比如有一句话:“《记忆碎片》”是一部完美倒置的电影,非其故事结构... ... 其中《记忆碎片》一词有大概率是在语料库中没有的,那么建模是依据p(w|u,v) 三元组,如果这个词不在语料库中,那么p(w|u,v) =0,由于语言模型的概率是0,那么代表整个句子出现的概率是0,这就是稀疏性问题。那么该怎么解决呢?有两种办法:线性插值平滑、拉普拉斯平滑

    线性插值平滑:(使用三元组进行举例)

    在进行三元组建模时,不仅仅使用三元组模型,也加入其它模型,即当高元n-gram模型没有足够数据时,使用低元n-gram模型进行概率估计:\hat{q} (w|u,v)=\lambda _{3} q(w|u,v)+\lambda _{2} q(w|u)+\lambda _{1} q(w),其中\lambda _{1}, \lambda _{2},\lambda _{3}在机器学习中称为超参hyperparameter,\sum_{i}\lambda _{i} = 1 ,那么怎么对\lambda _{1}, \lambda _{2},\lambda _{3}进行估计呢?

    从训练集中分出部分数据作为hold-out数据,我们称之为validation训练集,去学习\lambda _{1}, \lambda _{2},\lambda _{3}。使L(\lambda _{1}, \lambda _{2},\lambda _{3}) = c'(w,u,v)log(\hat{q} (w|u,v))最大,其中c'(w,u,v):trigram(w,u,v)在holg-out数据集中出现的次数。

    拉普拉斯平滑:(使用二元组进行举例)

    有些bigram从来不会在训练集中出现,那怎么办呢,那就找训练的时候把已经出现的bigram概率分一点出来,给没出现过的bigram,所以就有了:q(w|u)= \frac{c(w,u)+1}{c(w)+L}\approx \frac{1}{L}  ,其中L是所有bigram个数,对于三元组也是一样的道理:q(w|u,v)= \frac{c(w,u,v)+1}{c(u,v)+L}\approx \frac{1}{L}

    隐马尔可夫模型

    解决序列到序列的问题

    我们把序列到序列的问题抽象出来:

    输入:x_{1} ,x_{2}....x_{n}

    输出:y_{1} ,y_{2}....y_{n}

    对于任何机器学习模型都有两种方式:判别式模型、生成式模型

    判别式模型Discriminative Model:

    从训练数据中学习p(y_{1},y_{2}, ...y_{n}|x_{1},x_{2}, ...x_{n}),测试集上输出argmaxargmax_{y} p(y|x)

    生成式模型Generative Model:

    从训练集中学习p(y,x),测试集上,输出argmax_{y} p(y|x) = argmax_{y} p(x|y) p(y)

    下面我们主要学习生成式模型,隐马尔可夫模型HMM(Hidden Markov Model):

    输入句子:x_{1} ,x_{2}....x_{n}  ,x_{i} \in V

    输出标注序列:y_{1} ,y_{2}....y_{n+1},  y_{i} \in S,i =1...n,y_{n+1} =<S>

    Brigram HMM:p(x_{1} ,x_{2}....x_{n} ,y_{1} ,y_{2}....y_{n+1}   )=\prod_{i=1}^n=q(y_{i}|y_{i-1})\prod_{i=1}^n e(x_{i}|y_{i})

    模型参数:q(s|u), s\in S\cup {<S>}, u\in S\cup {*} ,e(x|s), s\in S,x\in V。x为当前词汇,S为state。q(y_{i}|y_{i-1})的名词叫做transitionprobility,e(x_{i}|y_{i}) 的名词叫做emissionProbility。

    举例:

    输入句子:我/是/中国人

    输出标注序列:N/V/N/<S>

    Bigram HMM:p(x_{1} ,x_{2}....x_{n} ,y_{1} ,y_{2}....y_{n+1}   )=q(N|*)q(V|N)q(N|V)q(<S>|N)e(我|N)e(是|V)e(中国人|N)

    那么有了模型怎么进行参数估计呢?还是极大似然估计:q(u|v) = \frac{c(u,v)}{c(v)} e(x|s) = \frac{c(x,s)}{c(s)} ,那么又来了稀疏性问题,怎么办呢?还拿上面的例子举例:“《记忆碎片》”是一部完美倒置的电影,非其故事结构... ... 其中《记忆碎片》一词有大概率是在语料库中没有的,解决办法:1.将词汇分成两份,高频词= 词频>=5,低频次=所有其他词;2.将所有低频词映射到一个固定集合。

    那么有了模型有了参数,用极大似然估计进行参数估计,那么还要解决一个问题,需要在test中预测,我们称之为解码问题,也就是给定输入x_{1} ,x_{2}....x_{n},求输出预测序列y_{1} ,y_{2}....y_{n+1} ,那其实就是去试所有的y,使p(x_{1} ,x_{2}....x_{n} ,y_{1} ,y_{2}....y_{n+1}   )最大就是了。argargmax_{ y_{1},y_{2} ,....y_{n+1}  } p(x_{1} ,x_{2}....x_{n} ,y_{1} ,y_{2}....y_{n+1}   )

    Viterbi算法:

    ` n为句子长度;

    `S_{k} ,k=0...n为k处所有可能标注的集合{N,V},S_{0}={*},S_{n+1}={<S>},S_{k}=S,k\in {1....n},对刚才的例子S={N,V};

    `  定义r(y_{0} ,y_{1}....y_{k} ) =\prod_{i=1}^k q(y_{i} |y_{i-1})\prod_{i=1}^k e(x_{i} |y_{i}),r为截止到当前第i个State的时候之前的语言模型概率的计算;

    ·  定义动态规划表:\pi (k,u) = max_{<y_{0}, y_{1...,y_{k}}>:y_{k}=u}  r(y_{0}, y_{1},...,y_{k}),k表示当前state的位置,u代表当前state值,那么\pi (k,u) 的意思就是在k-1的位置内跳到u状态时概率最大;

    ·  定义backPointer:bp(k,u) = argmax_{w\in S_{k-1}(\pi (k-1, w)q(u|w)e(x_{k}|u ) } 记录k-1个状态里面,是哪一个到当前第k个位置第u个position,概率最大,然后把值记录下来

    Viterbi算法演示

    输入:句子x_{1} ,x_{2}....x_{n} ,参数q(s|u),e(x|s)

    初始化:\pi (0,*) = 1

    定义:S_{0} = *, S_{k} = S,  k=1...n

    算法:

        最后返回标注序列y_{1},...,y_{n}

    相关文章

      网友评论

        本文标题:自然语言处理

        本文链接:https://www.haomeiwen.com/subject/xxvcjqtx.html