机器学习中自然语言处理之总结

  出于文本归类和数据处理之需求,这段时间研究了下文本处理类的机器学习方面的东西。也快过年放假了,在此做一个总结和感受吧。
附注:本文的项目地址

一、分词

  正如绝大多数的科学研究一样,机器学习的算法绝大多数都是西方早在几年、十几年和几十年发布出来,然后再经过西方工程化之后,国内再慢慢跟上路来。在中文和英文处理的最大问题在于中文需要分词。当然可以将单个的汉字作为算法的处理单元,但是由于汉语的词汇比起单词含有多得多的信息,所以分词算是汉语处理的第一步。
  目前汉语分词算法实现的比较好的有:

中科院张华平博士的ICTCLAS分词

  这个算是国内公认做的最好的分词实现了,在各项评测中指标都比较高,缺点是软件是闭源的,而且挂这个license需要不断更新,比较麻烦。这个还有个人做了个python的调用接口,居然是个老外,想想也比较奇葩,但更多的是羞愧。

结巴分词:

  口号是做最好的 Python 中文分词组件,调用接口可谓是最全面的,各种语言都可以用。由于是开源的,效果也还不错,Python/C都支持,所以在程序中经常用。

其它:

  我个人也根据HMM原理和深度学习实现了两个分词程序,当然效果肯定没有上面那么成熟,但作为HMM和深度学习练练手还是可以的。此外觉得在汉语的时候,中英文和数字的混排中,设想在第一步处理时候将其独立开来,然后再用纯粹的中文分词处理,当然比较懒,没有去做。
  a. HMM分词
  b. 深度学习分词

  个人感觉,中文分词目前已经到了90%以上的分词精度,已经十分满足工程应用了。但是语言是动态不断变化的,而且网络用语越来越多,变化也越来越快,分词程序如果能够快速跟踪这些变化,还是十分有现实价值的。此外,汉语分词的主观性特别的强,尺度和每个人的心里把握都有差异,所以有些分词系统也会提供一个参数,控制分词的颗粒度。

二、情感分析和归类

  这里这样列,但是实际上文本归类和情感分析是一个问题,无非就是2类和多类的关系。文本归类分为长文本归类和段文本归类:长文本比如一篇文章、一个博文之类的;短文本比如Twitter和微博之类的。短文本的归类比长文本的归类难得多,长文本字词丰富,一般采用多项式模型(词频统计);而短文本一般采用伯努利模型(词出现与否)效果会好一些。在实现测试的过程中,以下几种算法效果较好:

贝叶斯网络

  算是最简单的学习算法了,具有理论基础清晰、实现简单、计算量小、效果较好的有点。具有多项式模型和伯努利模型两种实现方式。在实践中,某东语聊好评差评两分类能达到90%的分类精度、sogou分类语聊10分类也能达到70%多的分类精度。
  a. Python实现
  b. C/C++实现
  注意,当时Python实现速度比较的慢,但是用C/C++实现后,计算资源和速度都至少有十多倍的提升!!!

最大熵模型

  这个吴军博士在《数学之美》中有介绍。用几句话来概括就是:如果有先验约束知识,就满足这些约束,否则就不做任何假设,因为不做任何假设是最可靠的,而等概率分布时候的熵最大,称之为最大熵模型。举个例子:如果没有任何条件限制,我问投一个骰子1向上的概率是多大,答案是1/6,然后我告诉你投一次出现3和4的概率之和是1/2,然后你肯定推算出这种约束下1向上的概率是1/8。正是秉着这样的观念,文献说最大熵模型在单一模型算法中效果差不多是最好的。
  最大熵模型提出的比较早了,但是利用起来还不是很悠久,就是传统的GIS迭代求解效率太低,而后面改进使得求解速度大大加快的时候,在实际中才慢慢被利用。代码中是参照nltk的Python实现进行C/C++的移植的。
  a. GIS和L-BFGS实现

LDA(Latent Dirichlet Allocation)

  也是一个比较流行的分类算法,这种算法和上面不同的是,不知道预先的类别种类和数目,有点类似聚类的意思。该算法在Twitter和微博主题分类和主题发现中被广泛使用,同时在广告推荐和信息投放中也被大量应用。还有就是这个算法跟别的算法不同的是,涉及到的数学和统计的知识比较的多,要看明白还是需要些功夫的。
  推荐的文章:
  a. Peacock:大规模主题模型及其在腾讯业务中的应用
  b. 本人测试发现效果不是特别的理想,包括一个改进的L-LDA,后面再看吧。

三、命名实体识别

  命名实体识别(NER)的话,虽然在自然语言处理上一般是列为单独的任务,但个人感觉更是一个同分词关系十分密切的问题,所以在人民日报的标注语料中,都是先分完词,然后将实体标注作为词性标注的一类来进行。机器学习上,NER有字典法、HMM法,但是最常用的是CRF法,而机器学习需要标注语料用于训练,中文目前个人只找到人民日报199801的两万多行训练语料(数量少、偏向书面和官方语),所以做特定行业的语料还需搜集和标注。
  CRF主要是对每一个词的周围开一个窗口,然后根据窗口词的信息给中心词打一个TAG,人家实验当周围词提供的信息越多,对最终的标记结果也就越准确。见条件随机场(CRF)识别命名实体
  CRF有透明的开源实现,个人用的是crfsuite。在实际中,需要分词效果和人民日报标注语料一致,才会有稍好的实验效果。
  a. 本人验证测试

四、深度学习

  深度学习在这些年真是越来越火了,随着在图像和语音识别上取得骄人的成绩后,Deep Learning也在尝试席卷NLP这最后一块阵地。自然语言不同于图像和语音部分,属于比较高层次的信号,难度较大,所以很多专家不看好深度学习在自然语言上的处理。但是随着RNN的不断研究和改进,在分词、情感识别、分类、标注、NER方面也有了不小的成就。简单而言,目前我们不能给予深度学习从根本上解决自然语言的各种问题,但是给予以往自然语言的研究成果(比如特征提取等),再加上深度学习的强大建模能力,是会将自然语言处理提上一个新的高度的。
  目前实验的功能:
  a. 深度学习分词
  b. 自然语言生成
  第一块的分词结果已经在ReadMe列出来了,还是有些效果的;对于自然语言生成,是用一个语聊去训练它,然后它就会根据语料的“口吻”创作出句子来(我还没大规模训练调试,效果不好)。我猜Bosonnlp作诗应该是这个原理。
  其实深度学习可以产生很多好玩的东西,比如大作-1大作-2

五、总结

  无论是不是个坑,深度学习都是当前机器学习的热点和主流。让我的最大感受就是:传统的机器学习都是科学家们精妙的设计出各种数学模型和求解算法,而深度学习就是粗鲁地用大数据和巨大计算量拼出一个毕竟训练结果的模型而没有任何理论去支持它。这又让我想起了:

我们(在考虑图灵测试中的机器时)也应当允许这样一种可能,那就是一些工程师可能会建造一台机器,它能够完成任务(通过图灵测试),但其工作的原理却未必能够被其创造者所完全理解,这是因为他们采用了一种试验的方式(来建造这台机器)。

  PS:搞深度学习的话,先换台好点显卡的电脑吧,最好是Nvidia支持CUBA的,集成显卡就不要尝试了,即使是再好的CPU也算不过GPU的!目前很多开源的深度学习库都支持GPU计算的,所以你看看Nvidia的Titan和Tesla价格就知道这东西有多重要了。