(2)中文分词——最大正向匹配算法及MMSEG分词算法
2016-03-18 22:36
1511 查看
中文分词基本算法主要分类:基于词典的方法、基于统计的方法、基于规则的方法
1、基于词典的方法(字符串匹配,机械分词方法)
定义:按照一定策略将待分析的汉字串与一个“大机器词典”中的词条进行匹配,若在词典中找到某个字符串,则匹配成功。
按照扫描方向的不同:正向匹配和逆向匹配
按照长度的不同:最大匹配和最小匹配
1.2基于统计的分词(无字典分词)
主要思想:上下文中,相邻的字同时出现的次数越多,就越可能构成一个词。因此字与字相邻出现的概率或频率能较好的反映词的可信度。
主要统计模型为:N元文法模型(N-gram)、隐马尔科夫模型(Hidden Markov Model, HMM)。
最大正向匹配算法:从左向右扫描寻找词的最大匹配。首先我们规定一个词的最大长度,每次扫描的时候寻找当前开始的这个长度的词来和字典中的词匹配,如果没有找到,就缩短长度继续寻找,直到找到或者成为单字。
一个简单的Java正向匹配算法示例
MMSEG分词算法
MMSEG分为“匹配算法(Matching algorithm)”和“消除歧义的规则(Ambiguity resolution rules)”这两部分。“匹配算法”是说如何根据词典里保存的词语,对要切分的语句进行匹配(正向?逆向?粒度?);“消除歧义的规则”是说当一句话可以这样分,也可以那样分的时候,用什么规则来判定使用哪种分法,比如“设施和服务”这个短语,可以分成“设施和服务”,也可以分成“设施和服 务”,选择哪个分词结果,就是“消除歧义的规则”的功能。
MMSEG的“匹配方法”有两种:
1.Simple方法,即简单的正向匹配,根据开头的字,列出所有可能的结果。比如“一个劲儿的说话”,可以得到
一个
一个劲
一个劲儿
一个劲儿的
这四个匹配结果(假设这四个词都包含在词典里)。
2.Complex方法,匹配出所有的“三个词的词组”,即从某一既定的字为起始位置,得到所有可能的“以三个词为一组”的所有组合。比如“研究生命起源”,可以得到
MMSEG的“消除歧义的规则”有四个:
1. 组合长度最大
2. 组合中平均词语长度最大
3. 词语长度的变化率最小
4. 计算组合中所有单字词词频的自然对数,然后将得到的值相加,取总和最大的词组
MMSEG的核心思想是抽取3个可能的词(存在多个组合),然后根据4个消除歧义规则确定到底选择那个组合。
下面分别举例说明
1.组合长度最大Maximum matching (最大匹配),有两种情况,分别对应于使用“simple”和“complex”的匹配方法。对“simple”匹配方法,选择长度最大的词,用在上文的例子中即选择“一个劲儿的”;对“complex”匹配方法,选择“词组长度最大的”那个词组,然后选择这个词组的第一个词,作为切分出的第一个词,
比如长春市长春药店,这个会有如下几种组合
第一种组合长度最长,所以就以第一种方式分词, 实际效果看起来也合理
2.组合中平均词语长度最大Largest average word length(最大平均词语长度)。经过规则1过滤后,如果剩余的词组超过1个,那就选择平均词语长度最大的那个(平均词长=词组总字数/词语数量)。
比如国际化,这个会有如下几种组合
显然规则1无法过滤,长度都是3 经过规则2,之后发现第一个组合平均长度为3/1=3,第二个是3/2=1.5,第三个3/3=1 第一个平均长度最大,所以胜出
这个规则和规则1看上去没啥区别,但因为有的时候句子不够被分成3个词的组合,有可能只够分2个词 上面就是个例子,国际化被分别分成了1个词的组合/2个词的组合/3个词的组合,优选词个数最少的组合
3.词语长度的变化率最小Smallest variance of word lengths(词语长度的最小变化率),由于词语长度的变化率可以由标准差反映,所以此处直接套用标准差公式即可。
比如北京大学生,这个会有如下几种集合
显然规则1无法过滤,长度都是5
在经过规则2之后剩下
因为上面2个组合的平均长度为5/2=2.5,其他为5/3=1.66
经过规则3之后剩下
北京大学生
这是我们想要的,因为第一条是变化是sqrt(((4-2.5)^2+(1-2.5)^2))/2)=1.5,后面是sqrt(((3-2.5)^2+(2-2.5)^2))/2)=0.5,第二条变化小,所以后面胜出
4.单字词词频自然对数累加计算Largest sum of degree of morphemic freedom of one-character words,这个规则的意思是“计算词组中的所有单字词词频的自然对数,然后将得到的值相加,取总和最大的词组”。
比如设施和服务,这个会有如下几种组合
经过规则1过滤得到
规则2和规则3都无法确定谁胜出,只能走最后一个规则:第一条中的务和第二条中的和,从直观看,显然是和的词频在日常场景下要高,这依赖一个词频字典 和的词频决定了最后的分词是设施和服务_
为什么要取自然对数之和而不是简单的求和? 比如某个组合有两个单字,词频为3和7,另一个为5和5,3+7=5+5,但ln3+ln7
1、基于词典的方法(字符串匹配,机械分词方法)
定义:按照一定策略将待分析的汉字串与一个“大机器词典”中的词条进行匹配,若在词典中找到某个字符串,则匹配成功。
按照扫描方向的不同:正向匹配和逆向匹配
按照长度的不同:最大匹配和最小匹配
1.2基于统计的分词(无字典分词)
主要思想:上下文中,相邻的字同时出现的次数越多,就越可能构成一个词。因此字与字相邻出现的概率或频率能较好的反映词的可信度。
主要统计模型为:N元文法模型(N-gram)、隐马尔科夫模型(Hidden Markov Model, HMM)。
最大正向匹配算法:从左向右扫描寻找词的最大匹配。首先我们规定一个词的最大长度,每次扫描的时候寻找当前开始的这个长度的词来和字典中的词匹配,如果没有找到,就缩短长度继续寻找,直到找到或者成为单字。
一个简单的Java正向匹配算法示例
import java.util.*; import java.io.*; public class MM { static int MaxLen=5; public static void main(String[] args){ String dic="计算语言学、课程、课时"; String str="计算语言学课程是三个课时"; String s=""; int begin=0,end; while(begin<str.length()){ end=begin+MaxLen; if(end>str.length())end=str.length(); while(begin<end&&!dic.contains(str.substring(begin,end))){ end--; } if(begin==end)end++; s=s+str.substring(begin,end)+"/"; System.out.println(s); begin=end; } System.out.println(s);} }
MMSEG分词算法
MMSEG分为“匹配算法(Matching algorithm)”和“消除歧义的规则(Ambiguity resolution rules)”这两部分。“匹配算法”是说如何根据词典里保存的词语,对要切分的语句进行匹配(正向?逆向?粒度?);“消除歧义的规则”是说当一句话可以这样分,也可以那样分的时候,用什么规则来判定使用哪种分法,比如“设施和服务”这个短语,可以分成“设施和服务”,也可以分成“设施和服 务”,选择哪个分词结果,就是“消除歧义的规则”的功能。
MMSEG的“匹配方法”有两种:
1.Simple方法,即简单的正向匹配,根据开头的字,列出所有可能的结果。比如“一个劲儿的说话”,可以得到
一个
一个劲
一个劲儿
一个劲儿的
这四个匹配结果(假设这四个词都包含在词典里)。
2.Complex方法,匹配出所有的“三个词的词组”,即从某一既定的字为起始位置,得到所有可能的“以三个词为一组”的所有组合。比如“研究生命起源”,可以得到
研_究_生 研_究_生命 研究生_命_起源 研究_生命_起源
MMSEG的“消除歧义的规则”有四个:
1. 组合长度最大
2. 组合中平均词语长度最大
3. 词语长度的变化率最小
4. 计算组合中所有单字词词频的自然对数,然后将得到的值相加,取总和最大的词组
MMSEG的核心思想是抽取3个可能的词(存在多个组合),然后根据4个消除歧义规则确定到底选择那个组合。
下面分别举例说明
1.组合长度最大Maximum matching (最大匹配),有两种情况,分别对应于使用“simple”和“complex”的匹配方法。对“simple”匹配方法,选择长度最大的词,用在上文的例子中即选择“一个劲儿的”;对“complex”匹配方法,选择“词组长度最大的”那个词组,然后选择这个词组的第一个词,作为切分出的第一个词,
比如长春市长春药店,这个会有如下几种组合
长春市_长春_药店_ 长春市_长_春药_ 长春_市长_春药_ 长春_市_长春_ 长_春_市长_
第一种组合长度最长,所以就以第一种方式分词, 实际效果看起来也合理
2.组合中平均词语长度最大Largest average word length(最大平均词语长度)。经过规则1过滤后,如果剩余的词组超过1个,那就选择平均词语长度最大的那个(平均词长=词组总字数/词语数量)。
比如国际化,这个会有如下几种组合
国际化_ 国际_化_ 国_际_化_
显然规则1无法过滤,长度都是3 经过规则2,之后发现第一个组合平均长度为3/1=3,第二个是3/2=1.5,第三个3/3=1 第一个平均长度最大,所以胜出
这个规则和规则1看上去没啥区别,但因为有的时候句子不够被分成3个词的组合,有可能只够分2个词 上面就是个例子,国际化被分别分成了1个词的组合/2个词的组合/3个词的组合,优选词个数最少的组合
3.词语长度的变化率最小Smallest variance of word lengths(词语长度的最小变化率),由于词语长度的变化率可以由标准差反映,所以此处直接套用标准差公式即可。
比如北京大学生,这个会有如下几种集合
北京大学_生_ 北京_大学生_ 北京_大学_生_ 北京_大_学生_ 北_京_大学生_
显然规则1无法过滤,长度都是5
在经过规则2之后剩下
北京大学_生_ 北京_大学生_
因为上面2个组合的平均长度为5/2=2.5,其他为5/3=1.66
经过规则3之后剩下
北京大学生
这是我们想要的,因为第一条是变化是sqrt(((4-2.5)^2+(1-2.5)^2))/2)=1.5,后面是sqrt(((3-2.5)^2+(2-2.5)^2))/2)=0.5,第二条变化小,所以后面胜出
4.单字词词频自然对数累加计算Largest sum of degree of morphemic freedom of one-character words,这个规则的意思是“计算词组中的所有单字词词频的自然对数,然后将得到的值相加,取总和最大的词组”。
比如设施和服务,这个会有如下几种组合
设施_和服_务_ 设施_和_服务_ 设_施_和服_
经过规则1过滤得到
设施_和服_务_ 设施_和_服务_
规则2和规则3都无法确定谁胜出,只能走最后一个规则:第一条中的务和第二条中的和,从直观看,显然是和的词频在日常场景下要高,这依赖一个词频字典 和的词频决定了最后的分词是设施和服务_
为什么要取自然对数之和而不是简单的求和? 比如某个组合有两个单字,词频为3和7,另一个为5和5,3+7=5+5,但ln3+ln7
相关文章推荐
- 算法导论:第15章 动态规划_5最优二叉搜索树
- PAT 乙级 1009.说反话
- Java 注解原理以及实例
- 深复制VS浅复制(MemberwiseClone方法介绍)
- (1)英文分词——波特词干提取算法
- Ubuntu12.04使用
- 第二次作业
- Linux网络流量监控与分析工具Ntopng
- UESTC758(贪心)
- The VMware Authorization Service is not running
- 2015春季练习——一道水题的思考
- couldn't connect to server 127.0.0.1 shell/mongo.js:79
- jad 反编译的使用方法
- NSURLConnection使用详解
- SQL Server 2012 自动增长列,值跳跃问题
- 果园里的树
- bzoj 2007: [Noi2010]海拔
- 界面制作小例
- ImageView里面的图片实现同时移动缩放旋转 photoView自定义
- TalkingData 接入Cocos2d-x项目,symbol(s) not found for architecture arm64问题