从规则到统计与统计语言模型

http://blog.csdn.net/u012637501

一、自然语言处理-从规则到统计

1.基于规则的自然语言处理

在20世纪60年代,摆在科学家面前的问题是怎样才能让机器理解自然语言。当时普遍的认识是首先要做好两件事,即分析语句(语法)和获取语义。由于西方的语言学家们已经对各种自然语言进行了非常形式化的总结,学习语法规则、词性和构词法对于学习西方语言尤为重要,并且当时语法规则又非常容易用计算机的算法来描述,所有当时的一些科学家就更坚定的认为基于规则才是自然语言处理最好的方法。然而,事实证明,单纯基于文法(语法)规则的分析器是处理不了稍微复杂的句子的,主要问题有二:

首先,要想通过文法(语法)规则覆盖(正确描述)哪怕20%的真实语句,文法规则的数量(这里还不包括词性标注的规则)至少是几万条;

其次,即使能够写出涵盖所有自然语言现象的语法规则集合,用计算机去解析它也是相当困难的,因为现实中自然语言的文法是比较复杂的上下文有关文法,而程序语言是我们认为设计的,为了便于计算机解码的上下文无关文法。

到了20世纪70年代,基于规则的语句分析暴露出了更大的问题:自然语言中词的多义性很难用规则来描述,而是严重依赖于上下文和常识,因此,基于规则的自然语言处理终究还是走到了尽头。

2.基于统计的自然语言处理

1970年佛里德里克.贾里尼克和他领导的IBM华生实验室将统计的方法应用到自然语言处理(语音识别),使得自然语言处理重新获得新生并取得了今天的非凡成就。通过采用基于统计的方法,IBM将当时的语音识别率从70%提升到90%,同时语音识别的规模从几百单词上升到几万单词,这样就使得语音识别从实验室走向应用成为可能。此时,作为卡内基-梅隆大学博士生的李开复是最早从基于规则自然语言处理方法转到基于统计方法的人之一。

上个世纪70年代,基于统计的方法的核心模型是通信系统加隐含马尔可夫模型。这个系统的输入和输出都是一维的符号序列,而且保持原有的次序。过去的25年里,随着计算机计算能力的提高和统计数据的不断增加,通过统计模型实现了处理复杂的语句。

二、统计语言模型

1.用数学的方法描述语言规律

自然语音是一种上下文相关的信息表达和传递的方法,若想让计算机处理自然语言,关键需要解决的问题是:为自然语音这种上下文相关的特性建立数学模型,也称统计语言模型。对于统计语言模型,贾里尼克是这样描述的:一个句子是否合理,就看看该句子在语料中出现的可能性大小如何,这个可能性通过概率来衡量。统计语言模型数学描述如下:

假定S表示某一个有意义的句子,由一连串特定顺序排列的词w1,w2,w3,....,wn组成,其中n是句子的长度。现在,我们向知道S在语料库文本中出现的可能,即数学上所说的S的概率P(S)。这里我们不可能将人类有史以来说过的话统计以下来算出S的出现的概率,而是通过一个模型来估算它(P(S)),由S=w1,w2,.....,wn,那么该语句S在语料文本中出现的概率为 P(S)=P(w1,w2,....,wn)。利用条件概率的公式,S这个序列出现的概率就等于每一个词出现的条件概率相乘,于是P(w1,w2,...,wn),即为

P(w1,w2,...,wn)=P(w1)*P(w2|w1)*P(w3|(w1,w2))*.......*P(wn|w1,w2,...,wn-1),其中P(w1)表示第一个词w1出现的概念;P(w2|w1)是在已知第一个词的前提下,第二个词出现的概率。

2.马尔可夫假设

(1)马尔可夫假设

由于上述数学模型非常难算,特别是到了最后一个词wn,条件概率P(wn|w1,w2,....,wn-1)的可能性太多,无法估算。为此,到了19世纪到20世纪初,俄罗斯有个数学家叫马尔可夫,他给出了偷懒但又比较有效的方法,即每当遇到这种情况时,就假设任意一个词wi出现的概率只同它前面的词wi-1有关,这种假设就是著名的马尔可夫假设。数学模型描述如下:

P(w1,w2,...,wn)=P(w1)*P(w2|w1)*P(w3|w2)*...P(wi|wi-1)....*P(wn|wn-1)

(2)统计语言模型的二元模型(Bigram Mode)

统计语言模型的二元模型,就是指任意一个词wi出现的概率只同它前面的词wi-1有关。

P(w1,w2,...,wn)=P(w1)*P(w2|w1)*P(w3|w2)*...P(wi|wi-1)....*P(wn|wn-1),其中对于条件概率P(wi|wi-1)的估算,根据条件概率的定义为P(wi|wi-1)=P(wi-1,wi)/P(wi-1)=#(wi-1,wi)/#(wi-1)。

注释:P(wi-1,wi)为联合概率;P(wi-1)为边缘概率。对于一个大规模语料库而言,#(wi-1,wi)为wi-1,wi这对词在统计的文本中前后相邻出现了次数,#(wi-1)为本身在同样语料库文本中出现的次数(#为语料库的大小)。

(3)N元模型

统计语言模型的N元模型,可表述为一个词由前面N-1个词决定,数学模型描述如下:

P(w1,w2,...,wn)=P(w1)*P(w2|w1)*P(w3|(w1,w2))*.......*P(wn|w1,w2,...,wn-1)

这种假设也被称为N-1阶马尔可夫假设,对应的语言模型称为N元模型。当N=2的二元模型即为二元模型,N=1的一元模型实际上是一个上下文无关的模型。而实际应用中最多的是N=3的三元模型,更高阶却很少使用。因为,N元模型的大小(也可称空间复杂度)几乎是N的指针函数,即O(|V|^N),其中|V|是一种语言词典的词汇量,一般在几万到几十万个。而使用N元模型的速度(时间复杂度)也几乎是一个指针函数,即O(|V|^N-1)。依次,当N不是很大时(如N从1到2,在从2到3时),模型的效果上升显著。但当模型从3到4时,效果的提升就不是很显著了,而且资源的耗费增加却非常快。

3.统计语言模型的训练

(1)模型的训练

使用语言模型需要知道模型中所有的条件概率,我们称之为模型的参数。通过对语料的统计,得到这些参数的过程称作模型的训练。

如二元模型:

P(w1,w2,...,wn)=P(w1)*P(w2|w1)*P(w3|w2)*...P(wi|wi-1)....*P(wn|wn-1),其中P(w1)、P(w2|w1)、P(w3|w2)、P(wi|wi-1)、P(wn|wn-1)等条件概率即为模型的参数。

(2)影响训练结果因素

语料库的数据量。当语音模型训练的语料库规模很小时,很导致一些词的条件概率出现很大的偏差(如P(wi|wi-1)=P(wi-1,wi)/P(wi-1)=#(wi-1,wi)/#(wi-1)=0/1),从而出现零概率问题。所以,模型的训练,语料库数据量规模越大越好。

(3)语料库的选取

模型训练中最关键的就是训练数据,即语料库。首先,语料库的数据量要足够大;其次,训练语料和模型应用的领域尽量不要脱节。比如建立一个语言模型,如果应用是网页搜索,它的训了数据就应该是杂乱的网页数据和用户输入的搜索串,而不是传统的、规范的新闻稿,即使前者夹杂着噪音和错误。

当然在训练数据和应用数据一致并且训练量足够大的情况下,训练语料的噪音高低也会对模型的效果产生一定的影响,因此,在训练之前有时需要对训练数据进行预处理。在成本不高的情况下,过滤训练数据还是有必要的。

时间: 2024-10-18 16:56:43

从规则到统计与统计语言模型的相关文章

Spark Streaming从Kafka中获取数据,并进行实时单词统计,统计URL出现的次数

1.创建Maven项目 创建的过程参考:http://blog.csdn.net/tototuzuoquan/article/details/74571374 2.启动Kafka A:安装kafka集群:http://blog.csdn.net/tototuzuoquan/article/details/73430874 B:创建topic等:http://blog.csdn.net/tototuzuoquan/article/details/73430874 3.编写Pom文件 <?xml v

在tlog里统计注册统计相关功能

#!/usr/bin/env python #_*_ encoding: utf-8 _*_ ''' 注册统计相关功能 ''' __author__ = 'augustyang' import os,sys,time,datetime ###当前时间的几个小时内的 #now_times =time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) #当前时间 #last_times=((datetime.datetime.now(

C# 根据天、周、月汇总统计生成统计报表

先看核心代码: public List<DataEntity> SearchShopSalesReport(DateTimeOffset? dateFrom, DateTimeOffset? dateTo,string groupBy) { var query = data.DataEntity //这里data为DbContext .AsEnumerable(); if (dateFrom.HasValue) query = query.Where(x => x.Date >=

[聊一聊系列]聊一聊前端速度统计(性能统计)那些事儿

欢迎大家收看聊一聊系列,这一套系列文章,可以帮助前端工程师们了解前端的方方面面(不仅仅是代码): https://segmentfault.com/blog/frontenddriver 上一篇文章我们讨论了,如何进行前端日志打点统计: https://segmentfault.com/a/1190000005861012 这一篇我们来看看如何进行速度统计 网站的速度影响了用户访问网站最初的体验.试想,如果一个用户,在等待了若干秒后,还是停留在白屏的状态,那么他的选择将是离开这个网站.性能统计有

SD从零开始67-70 后勤信息系统中的标准分析, 信息结构, 信息的更新规则, 建立统计数据

SD从零开始67 后勤信息系统中的标准分析 标准分析中的报表Reporting in Standard Analyses 标准分析为高质量的表达和分析LIS中的数据基础提供了大量的功能: 当你决定了一个要分析的对象(例如,采购组,供应商,物料组等:)并设置了选择时,就为一个标准分析建立了数据基础: 然后该数据被组织并能够显示在一张初始的列表以及多种下钻列表中:每个分析都能够被存档: 你能够从列表的不同下钻层次使用应用中的标准事务来显示完整的主记录或凭证信息: 大量的功能能够用于从业务观点个别地检

Shell 中常见的日志统计方法

前面我发布过"Hadoop兮,杀鸡别用牛刀,python+shell实现一般日志文件的查询.统计", 需要结合python, 可能还是有一定的门槛, 现将shell部分剥离出来. 举例一些最基本的日志统计方法. (1)查看文件 more crawler.log 查看crawler.log日志 tail -n 100 crawler.log 查看crawler.log的最后100行 (2)匹配统计 cat *.log | grep "ERROR" |wc -l 统计在

openwrt linux 基于iptables的流量统计

简介 目前openwrt系统中流量统计做的最好的应该是"石像鬼"固件了,用以做流量统计的工具也有很多如:tomato,luci-app-statistics等. 本文想给大家介绍一种基于iptables规则的流量统计方法.该方法的基本原理是利用iptables自带的对规则链的流量统计功能,通过制定不同的规则并挂在不同的表和链上来实现对特定流量统计. 本方法的好处如下: 1.灵活统计多种流量. 2.流量统计准确. 3.便于扩张. iptables简介 iptables表说明 mangle

SQL Server 统计信息(Statistics)-概念,原理,应用,维护

前言:统计信息作为sql server优化器生成执行计划的重要参考,需要数据库开发人员,数据库管理员对其有一定的理解,从而合理高效的应用,管理. 第一部分 概念 统计信息(statistics):描述某个(些)栏位,索引的数据分布情况.优化器用其评估生成高效执行计划. 密度(density):一个比率值,显示在一个(组)列中有多少唯一值.(实际应用中值越小越好) Density = 1 / Number of distinct values for column(s) 直方图(histogram

Web Worker——js的多线程,实现统计博客园总阅读量

前言 众所周知,js是单线程的,从上往下,从左往右依次执行,当我们有耗时的任务需要处理时,便会阻塞线程造成页面卡顿等问题.web worker的目的,就是为JavaScript创造多线程环境,允许主线程将一些任务分配给子线程.在主线程运行的同时,子线程在后台运行,两者互不干扰.等到子线程完成计算任务,再把结果返回给主线程.因此,每一个子线程就好像一个“工人”(worker),默默地完成自己的工作.更多worker的介绍请戳:JavaScript标准参考教程 本文通过web worker 统计博客