Demo for NLP
This is demo for NLP using python but Java
分词原理
主要参照:http://blog.csdn.net/yelbosh/article/details/45896051
现有的分词算法可分为三大类
- 基于字符串匹配的分词方法
- 基于统计的分词方法
- 基于理解的分词方法
基于字符串匹配的分词方法
- 这种方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功 (识别出一个词)。按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。
- 常用的几种机械分词方法如下:
- 最少切分(使每一句中切出的词数最小)。
- 正向最大匹配法(由左到右的方向);
- 逆向最大匹配法(由右到左的方向);
基于统计的分词方法
- 从形式上看,词是稳定的字的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。因此字与字相邻共现的频率或概率能够较好的反映成词的可信度。可以对语料中相邻共现的各个字的组合的频度进行统计,计算它们的互现信息。
- 定义两个字的互现信息,计算两个汉字X、Y的相邻共现概率。互现信息体现了汉字之间结合关系的紧密程度。当紧密程度高于某一个阈值时,便可认为此字组可能构成了一个词。
- 这种方法只需对语料中的字组频度进行统计,不需要切分词典,因而又叫做无词典分词法或统计取词方法。
- 但这种方法也有一定的局限性,会经常抽出一些共现频度高、但并不是词的常用字组,例如“这一”、“之一”、“有的”、“我的”、“许多 的”等,并且对常用词的识别精度差,时空开销大。
- 实际应用的统计分词系统都要使用一部基本的分词词典(常用词词典)进行串匹配分词,同时使用统计方法识别 一些新的词,即将串频统计和串匹配结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。
基于理解的分词方法
- 这种分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。
- 其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。
- 它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义 进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。
- 由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。
基于字符串匹配的分词方法
- 基于字符串匹配的分词方法,这种方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行匹配,若在词典中找到某个字 符串,则匹配成功(识别出一个词)。
常用的方法:最小匹配算法(Minimum Matching),正向(逆向)最大匹配法(Maximum Matching),逐字匹配算法,神经网络法、联想一回溯法,基于N-最短路径分词算法,以及可以相互组合,例如,可以将正向最大匹配方法和逆向最大匹配方法结合起来构成双向匹配法等。目前机械式分词占主流地位的是正向最大匹配法和逆向最大匹配法。
最小匹配算法
在所有的分词算法中,最早研究的是最小匹配算法(Minimum Matching),该算法从待比较字符串左边开始比较,先取前两个字符组成的字段与词典中的词进行比较,如果词典中有该词,则分出此词,继续从第三个字 符开始取两个字符组成的字段进行比较,如果没有匹配到,则取前3个字符串组成的字段进行比较,依次类推,直到取的字符串的长度等于预先设定的阈值,如果还 没有匹配成功,则从待处理字串的第二个字符开始比较,如此循环。
例子
“如果还没有匹配成功”,取出左边两个字组成的字段与词典进行比较,分出“如果”;再从“还”开始,取“还没”,字典中没有此词,继续取“还没有”,依次取到字段“还没有匹配”(假设阈值为 5),然后从“没”开始,取“没有”,如此循环直到字符串末尾为止。这种方法的优点是速度快,但是准确率却不是很高,比如待处理字符串为“中华人民共和 国”,此匹配算法分出的结果为:中华、人民、共和国,因此该方法基本上已经不被采用 。
最大匹配算法
基于字符串的最大匹配,这种方法现在仍比较常用。最大匹配(Maximum Matching)分为正向和逆向两种最大匹配
正向匹配
基本思想是:假设词典中最大词条所含的汉字个数为n个,取待处理字符串的前n个字作为匹配字 段,查找分词词典。若词典中含有该词,则匹配成功,分出该词,然后从被比较字符串的n+1处开始再取n个字组成的字段重新在词典中匹配;如果没有匹配成功,则将这n个字组成的字段的最后一位剔除,用剩下的n一1个字组成的字段在词典中进行匹配,如此进行下去,直到切分成功为止。
例子
待处理字符串为“汉字多为表意文字”,取字符串“汉语多为表”(假设比较的步长为5,本文步长step都取5)与词典进行比较,没有与之对应的词,去 除“表”字,用字段“汉语多为”进行匹配,直至匹配到“汉语”为至,再取字符串“多为表意”,循环到切分出“文字”一词。目前,正向最大匹配方法作为一种 基本的方法已被肯定下来,但是由于错误比较大,一般不单独使用。如字符串“处理机器发生的故障”,在正向最大匹配方法中会出现歧义切分,该字符串被分为: 处理机、发生、故障,但是使用逆向匹配就能得到有效的切分。
逆向最大匹配RMM(Reverse Directional Maximum Matching Method)
原理和过程与正向最大匹配相似,区别在于前者从文章或者句子(字串)的末尾开始切分,若不成功则减去最前面的一个字。
例子
比如对于字符串 “处理机器发生的故障”,第一步,从字串的右边取长度以步长为单位的字段“发生的故障”在词典中进行匹配,匹配不成功,再取字段“生的故障”进行匹配,依次匹配,直到分出“故障”一词,最终使用RMM方法切分的结果为:故障、发生、机器、处理。该方法要求配备逆序词典。
比较
- 一般来说根据汉语词汇构成的特点,从理论上说明了逆向匹配的精确度高于正向匹配,汉语语句的特点一般中心语偏后。
- 有研究数据,单纯使用正向最大匹配的错误率为1/169 ,单纯使用逆向最大匹配的错误率为1/245。
- 实际应用中可以从下面几方面改进,同时采取几种分词算法,来提高正确率;改进扫描方式,称为特征扫描或标志切分,优先在待分析字符串中识别和切分出一些带有明显特征的词,以这些词作为断点,可将原字符串分为较小的串再来进机械分词,从而减少匹配的错误率等。
分词工具
本文主要介绍python的中文分词工具,java版本的请自行百度
配置python环境
- 需要配置python2.7和pip,请看文档中配置python和pip的部分。
jieba
本文仅介绍分词部分,其他功能请参照jieba官方网站
安装jieba
- 敲
cmd
进入命令行 - 执行
pip install jieba
安装jieba包
- 敲
导入jieba包
1import jiebajieba支持三种分词模型:
- 精确模式,试图将句子最精确地切开,适合文本分析;
- 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
- 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
jieba的分词提供两个方法:
- jieba.cut接受三个输入参数:需要分词的字符串(String);cut_all参数(True or False)来控制是否采用全模式;HMM参数(True or False)控制是否使用HMM模型(HMM为处理未登录词的模型)。其输出为一个生成器generator。
- jieba.cut_for_search接受两个输入参数:需要分词的字符串(String);HMM参数(True or False)。其输出为一个生成器generator。
- 或者用jieba.lcut 以及 jieba.lcut_for_search返回一个list。
代码示例:
|
|
LTP
本文仅介绍分词,其他功能请参照官方文档
安装LTP的python版本pyltp
- 敲
cmd
进入命令行 - 执行
pip install pyltp
安装LTP的python包
- 敲
导入pyltp
1import pyltp代码示例:
12345segmentor = pyltp.Segmentor()segmentor.load("/path/to/your/cws/model")words = segmentor.segment("元芳你怎么看")print "|".join(words)segmentor.release()