写在最前面:笔者也是NLP小白,哪里写得不当欢迎指出,但是不喜勿喷哈哈~
一、WHAT
- 自然语言处理
- NLP 与 AI 的关系
- NLP 与 IDE 的关系
- 中文分词
1.自然语言处理
即 NLP(Natural Language Processing)
2.NLP 与 AI 的关系:
知识的钥匙是什么?是语言。AI的终极目标又是什么?是知识。对于下一代智能系统所需的知识,AI必须进行两个重要的步骤才能得到,那就是“听”和“读”,然而这两个关键的步骤所涉及的关键技术就是——NLP。
3.NLP 与 IDE 的关系:
刚接触自然语言处理的时候,我第一时间从脑里冒出来的两个问题就是:
自然语言处理中“自然语言”到底是什么东西?
所谓的自然语言就是指一种自然地随文化演化的语言。比如我们日常在使用的中文、英文等等,人类进行交流的时候用来传递信息的工具。而我们的主角NLP的一个重要目标就是让计算机理解我们人类传递信息时使用的自然语言。-
和我们的IDE工具在理解我们从键盘输入的C语言、JAVA等高级程序语言的过程是否相同?
其实一般的高级程序语言在设计之初就会有其固定的语法、所使用的关键字,IDE只要记住了一定的关键字、约定的规则等,按照一定的流程,就可以理解并编译我们的高级程序语言。
而NL呢?处理NL的复杂性跟高级程序语言是完全不是在同一个等级的,NL中有各种各样的语种,有中文、英文,NL也会有很强的语义性,即不同环境说出同样的话可能有完全不同的含义,也就是存在二义性。
4.NLP 在中文领域的重头戏-中文分词
这里首先通过一个例子,在中文分词器上演示:
从上述简单例子,要理解一个句子首先就是要将句子分成一个个独立的词汇,看似简单的东西,要让计算机理解起来,是经过了几年、几十年的研究、完善才有的成果,其中奥妙无限。
二、HOW
NLP通常包括以下几个关键的问题:
- 选择什么样的分类算法高效?
- 采用什么样的语言模型适合?
- 常见的语言模型有哪些?
- 隐含马尔可夫模型?
- 相关领域?
1.选择什么样的分类算法高效?
其实第一个问题是几乎所有机器学习领域的都需要考虑的标准问题,各种针对不同数据类型、数据分布的算法和技巧,这里不再赘述。
2.采用什么样的语言模型适合?
1、为了让计算机处理自然语言,其实经历过很多个阶段,与现在所不同的是,以前为了让计算机处理我们的自然语言,很多时候是常用基于规则的处理,就中文来说,如我们从小时候就接触的中文语法:主谓宾等。
2、然而采用基于规则的方式并不能使NLP在该领域有所建树,后来慢慢就出现了基于统计的方式,而采用这种方式,一个关键的问题就是为自然语言这种上下文相关的特性建立特定的数学模型。也就是常说的统计语言模型。
3、其实我觉得为何如今大多使用基于统计的模型,我觉得是天时地利人和的,为什么这样说呢,随着技术水平的飞速发展,基础计算能力已经跟以前的是完全的不同等级了,意味着我们在建立、训练模型的时候,是能够在及其丰富的语料环境下的。
3.常见的语言模型有哪些?
不同语言模型最根本的区别,就是对文本提取特征的不同。
1.Bag-of-words:在这种模型中是将最原始的特征集,分割成许多单词,形成一个词集合,往往一个单词/分词就是一个特征。往往一个数据集就会有上万个特征;有一些简单的指标可以帮助筛选掉一些对分类没帮助的词语,例如“停止词”(Stop Word,汉语中常见的停止词有:“是”、“得”等),计算互信息熵等等,但不管怎么训练,特征维度都很大,每个特征的信息量太小;因此在使用这种模型的时候往往非常依赖适用场景。
2.统计特征:包括Term frequency(TF,词频) , Inverse document frequency(IDF,逆文本频率指数), 以及合并起来的TF-IDF。这种语言模型主要是用词汇的统计特征来作为特征集,每个特征都能够说得出物理意义。这种模型大多用于度量网页和查询的相关性,通过对每个特征进行TF-IDF(TF1IDF1+TF2IDF2+...)计算,得到相关性,在搜索领域有着广泛的应用。
3.NGram:一种考虑了词汇顺序的模型,就是N阶Markov链,每个样本转移成了转移概率矩阵。也能取得不错的效果,在汉语中的使用场景是:拼音、笔划在进行转换成句子时,计算出最有可能是目标(最大概率)的句子,从而实现无需用户手动选择单个汉字就可以形成一个句子。
4.隐含马尔可夫模型:
在说到NLP时,不自觉就会想到“隐含马尔可夫模型”
隐含马尔可夫模型(HMM) 在最开始的时候在通信领域应用得很广泛,后来由于其特性,被逐步应用、推广到语言处理中,在NLP 及 通信领域中起着越来越重要的角色。
如何训练HMM?
在吴军博士的《数学之美》中提到关于HMM的三个基本问题:
1、给定一个模型,如何计算某个特定的输出序列的概率;
其实这个问题就直接的方式就是使用Forward-Backward算法:
Forward-Backward 就不在这里详细阐述,其实整个算法的工作流程就是分成两部分,从最左边开始,从左到右计算消息,并依次传递到右边;然后再通过得到的递推式从后面往前面递推。
2、给定一个模型和某个特定的输出序列,如何找到最可能产生这个输出的状态序列;
这个问题可以使用维特比算法解决(动图):
其实就是在每个状态(zhong 对应“中”、“种”等不同状态)按照不同的值展开,形成的篱笆网络中得到的有向网状图中得到找出一条最短路径。
该算法可以分成三步走:
A、如果目标路径P必经过某一点,如x23,则起点S到x23的路径必定在P上。
B、P必定经过i时刻的某一个状态i(此时i=2,x21、x22...x2N中某一个状态x2j),则起点S到i时刻的某一状态的最短路径也必定在P上。即d(S,X3k)= d(S,X2j)+ d(X2j,X3k)
C、第三步则是结合前两步,从i时刻到i+1时刻只需要考虑S到i时刻所有状态中(xij)的最短路径+xij到xi+1,k的距离。
3、给定足够量的观测数据,如何估计隐含马尔可夫模型的参数。
这里所说的参数 包括
1.转移概率 P(St|St-1):从前一个状态St-1到当前状态St的概率;
2.生成概率 P(Ot|St):每一个状态St产生相应的输出符号Ot的概率。
要得到这两个参数的方法分成两种:有监督的训练方法 和 无监督的训练方法
1.有监督的训练方法:最直接的方式就是通过人工标注的方式,即可以直接得到对应的分子分母,但是这样子是成本极高的,应用场景并不多;
2.无监督的训练方法:这种就是通过得到o1,o2...等这些信号的量,推算出上述两个参数,主要使用了 鲍姆-韦尔奇算法(Baum-Welch Algorithm)。
HMM经典的例子
掷骰子:这里引用知乎上有人举过的例子,“掷骰子”
5.相关领域:
就上文所说,NLP涉及的领域越来越广泛,越来越重要。
- 机器翻译(Machine translation)
- 文本朗读(Text to speech)
- 中文自动分词(Chinese word segmentation)
- 自动摘要(Automatic summarization)
三、WHY
笔者坚信NLP必然会壮大,从而极快地推动AI发展速度。为什么?
随着AI时代的到来必然少不了NLP这把利剑,作为人类与AI的沟通桥梁,如家用机器人要在能够很好地理解人们说的话并执行相应的指令,而不再是以往几个单调的指令(“sit、open、sing...”)...等等很多场景,我个人拙见觉得基本都离不开NLP。然而这个也需要 CS 与 NS 领域的越来越紧密结合,NLP的场景也会不断增多。
NLP 使用场景:
除了几个很常见的领域如机器翻译等,这里举一个企业应用中可能会用到的(当然很多都是笔者自己yy的o ):
1.舆情分析
在很多APP中都有一个入口是 “用户反馈”,在这里一般是用户使用哪个业务功能出现问题来反馈,对应着某一个特定的模块。假如将这些数据收集起来,达到一定数据量的时候,训练出一个专属我们自己APP的模型,下次有用户反馈的时候可以提取出反馈文本中的特征,将问题分类,快速定位并通知负责该模块的同学。也可以在用户画像上增加该特征;
1、Android在灰度阶段也可以有针对性地投放到对应的用户群,灰度的效果肯定会得到很好的提升。
2、舆情分析确实是比较值得分析的一块,如果一个人一上午通过人力去查看舆情的原因,可能原因还没查出来,一上午就过了,很浪费时间,如果有这样一个模型能够快速定位、分类出问题势必可以节省很多人力物力。
2.用户关系分析
可以在微博上抓取用户发的文本信息中有关自己应用或者竞争对手的文本,我觉得应该可以分析到很多有趣的资料。比如竞对产品的用户满意度、用户对对手有什么满意的和不满的地方等等,相当的接地气哈哈~
四、END?
NLP深不见底,小弟无法作出小结~
万言千语,终于写好啦~以上很多是由于笔者水平有限,然后自己yy出来的~所以请各位大(da)神(lao)多多指教,不喜勿喷呀哇哈哈~