主,我将我的模型、我的参数、我的数据、我的代码全都交托在你的圣手中, 求你看顾,程序无bug,调参试就中。你的话是我属灵的生命,就象二阶函数在感知器中那样不可分。保守我都远离罪恶,让一切魔鬼都被SVD分解。以贝叶斯的名,阿门!
——西瓜大丸子汤
*******************************************************************************************************
part 1 分词
终于到了与NLP相关的部分啦!
PO主每天工作的一部分就是处理数以万计的文本条目,把它们分为若干大小分类,监控其中各类信息的变化趋势并分析背后的原因、对核心指标造成的影响。托朴素贝叶斯算法的福,我那翔一般的代码也运行得相当不错,分类比我这个活人分得还准确,python直接帮我把分析结果写入excel中,报表几秒钟之内就完成了一半。倒是我分析原因什么的要花十几分钟。那噶。。哈子卡西( >﹏<。)~
朴素贝叶斯算法不仅强大,而且还超级简单!只要学过概率论都能看懂,即使没学过概率论看书上讲解也能看懂没问题的,简直就是神的恩赐!
但是,世事常不能尽如人意。就连改变一个朋友都很难,更不用说改变一个国家了。紫拉,如果你变了,我一定会毫不犹豫地砍了你
这不坑爹点来了:在书上给英文分词是一件简单到一笔带过的事。因为英文的词之间……它是有空格的!
但是我们做自然语言处理的时候分析的都是中文!中文的词之间是没有空格的!
指望python自动给中文分词是不行哒!
看来,我们要真正用这个算法去做一些事情,还需要先掌握中文分词技术的说。。
其实目前已经有一些不错的python中文分词包了,比如结巴、mmseg、snownlp等等,即装即用,那么,还需要我们自己去学分词算法吗?
唔。。就以snownlp为例吧:
不得不说,这个基于字标注的生成式模型效果还真不错,居然能把‘紫拉’分在一起。但是如果工作需要你把‘不能’、‘很难’、‘不用说’、‘变了’等词分在一起,怎么办?
中文是如此暧昧而美丽的语言,中文的词不仅在形式上没有边界,在内容上的边界也经常模糊不清。即使在母语为汉语的人中间,中文词语的平均认同率也只有0.76左右。因此,随着文本内容、研究目的的不同,对分词算法的要求也有很大差异。别人的算法未必适合我们的需求,昨天的模型也未必适合今天的需求。那么,当需求有所改变时,该怎样修改算法、训练模型,使它更加贴合我们的语料库?我想对于nlper来说,死板的工具我们可以选择拿来主义,但分词算法这样的核心技术一定要掌握在自己手里。
目前的分词算法主要有以下几类:
1)基于词典的方法(字符串匹配,机械分词方法)
按照一定策略将待分析的汉字串与一个“大机器词典”中的词条进行匹配,若在词典中找到某个字符串,则匹配成功。
优点:易于实现
缺点:容易出现歧义,无法识别新词实践证明,这种基于手工规则的分词系统在评测中不敌基于统计学习的分词系统。
2)基于统计的方法
主要思想:上下文中,相邻的字同时出现的次数越多,就越可能构成一个词。因此字与字相邻出现的概率或频率能较好的反映词的可信度。
模型:n-gram、HMM
优点:自动识别新词、自动消除歧义
缺点:速度较慢
3)基于规则的方法(基于语义)
通过模拟人对句子的理解,达到识别词的效果,基本思想是语义分析,句法分析,利用句法信息和语义信息对文本进行分词。
模型:专家系统、神经网络
优点:自动推理、自动识别新词
缺点:需要大量语言信息进行训练、不成熟
4)基于字标注的方法以往的分词方法,一般都依赖于一个事先编制的词表(词典)。自动分词过程就是通过词表和相关信息来做出词语切分的决策。与此相反,基于字标注的分词方法实际上是构词方法。即把分词过程视为字在字串中的位置标注问题。
优点:精确度高、自动识别新词、复杂度低
缺点:尚不明显
基于字标注的方法看起来是不错的选择。下一篇就来实现基于字标注的中文分词算法吧!
p.s.因为书中对于朴素贝叶斯算法的解释已经很详尽,没有可以再补充的地方,所以这一章的读书笔记全部是关于中文分词的。这也是我当初学习这一章时遇到的问题,如果对nlp不感兴趣的话,可以直接跳到part4,届时会有一个有趣的应用案例。