LibMMSeg 中文分词软件包

我要开发同款
匿名用户2009年05月31日
39阅读
开发技术C/C++
所属分类程序开发、中文分词库
授权协议GPL

作品详情

LibMMSeg简介

LibMMSeg是Coreseek.com为Sphinx全文搜索引擎设计的中文分词软件包,其在GPL协议下发行的中文分词法,采用Chih-HaoTsai的MMSEG算法。

MMSEG:AWordIdentificationSystemforMandarinChineseTextBasedonTwoVariantsoftheMaximumMatchingAlgorithm

Published:1996-04-29Updated:1998-03-06Documentupdated:2000-03-12License:FreefornoncommercialuseCopyright  1996-2006Chih-HaoTsai(Email:hao520atyahoo.com)

您可以在Chih-HaoTsai'sTechnologyPage找到算法的原文。

LibMMSeg采用C++开发,同时支持Linux平台和Windows平台,切分速度大约在300K/s(PM-1.2G),截至当前版本(0.7.1)LibMMSeg没有为速度仔细优化过,进一步的提升切分速度应仍有空间。

下载

下载MMSeg0.7.3

修订记录

0.7.3-2008.05.27修正Makefile无法安装csr_typedefs.h的问题-2008.05.27修正x64系统上编译无法作为动态库的一部分编译的问题

0.7.2-2008.05.19修正指定的目录中无词典不提示错误的问题-2008.05.19新增Ruby的调用API

0.7.1-2008.04.23修正了在类似“english中文english"的句子,切分不正确的问题

0.7-第一次发行

安装

Window平台

打开源码包中src\win32子目录下的对应的工程文件,目前LibMMSeg内置了VS2003和VS2005的工程文件。

Linux平台

在源码包根目录下执行:

./configure&&make&&makeinstall

使用

词典的构造

mmseg-uunigram.txt

该命令执行后,将会产生一个名为unigram.txt.uni的文件,将该文件改名为uni.lib,完成词典的构造。需要注意的是,unigram.txt必须为UTF-8编码。

词典文件格式:

....河187x:187造假者1x:1台北队1x:1湖边1......

其中,每条记录分两行。其中,第一行为词项,其格式为:[词条]\t[词频率]。需要注意的是,对于单个字后面跟这个字作单字成词的频率,这个频率需要在大量的预先切分好的语料库中进行统计,用户增加或删除词时,一般不需要修改这个数值;对于非单字词,词频率处必须为1。第二行为占位项,是由于LibMMSeg库的代码是从Coreseek其他的分词算法库(N-gram模型)中改造而来的,在原来的应用中,第二行为该词在各种词性下的分布频率。LibMMSeg的用户只需要简单的在第二行处填"x:1"即可。

用户可以通过修改词典文件增加自己的自定义词,以提高分词法在某一具体领域的切分精度,系统默认的词典文件在data/unigram.txt中。

分词

mmseg-dtobe_segment.txt

其中,命令使用‘-d’开关指定词库文件所在的位置,参数dict_dir为词库文件(uni.lib)所在的目录;tobe_segment.txt为待切分的文本文件,必须为UTF-8编码。如果一切正确,mmseg会将切分结果以及所花费的时间显示到标准输出上。

对特殊短语的支持

由于LibMMSeg是为Sphinx全文搜索引擎设计的,因此其内置了部分搜索引擎切分算法的特性,主要表现在对特殊短语的支持上。

在搜索引擎中,需要处理C++时,如果分词器中没有词组C++,则将被切分为C/x+/x+/x,在进一步的检索中,可能每个词会由于出现的过于频繁而被过滤掉,导致搜索的结果与C++相关度不高不说,也严重影响的全文搜索的速度。在LibMMSeg中,内置对特殊短语的支持。

其输入文件格式如下

//testcommit.net=>dotnetc#=>csharpc++=>cplusplus

其中左侧是待支持的特殊短语,右侧是左侧的特殊短语需要被转换为的短语。这一转换在分词前进行。

可以在行的开头加入'//'作为注释符号,发现符号'//'后,整行将被忽略。

特殊短语词库构造命令:

mmseg-bexceptions.txt

其中,开关'-b'指示mmseg是要构造特殊短语词库;exceptions.txt是用户编辑的特殊短语转换规则。

该命令执行后,将在当前目录下产生一个名为"synonyms.dat"的文件,将该文件放在"uni.lib"同一目录下,分词系统将自动启动特殊短语转换功能。

注意:

1、在启用了该功能后,如果分词系统发现了一个特殊短语,将直接输出其在右侧对应的替换的值;

2、右侧被替换的值,请保证不会被分词器进行切分。(eg.C++=>C#这个转换的意义不大,并且可能导致C++这个短语永远无法被检索到!)

 

附录:

MMSeg算法说明

首先来理解一下chunk,它是MMSeg分词算法中一个关键的概念。Chunk中包含依据上下文分出的一组词和相关的属性,包括长度(Length)、平均长度(AverageLength)、标准差的平方(Variance)和自由语素度(DegreeOfMorphemicFreedom)。下面列出了这4个属性:

属性含义长度(Length)chuck中各个词的长度之和平均长度(AverageLength)长度(Length)/词数标准差的平方(Variance)同数学中的定义自由语素度(DegreeOfMorphemicFreedom)各单字词词频的对数之和 

Chunk中的4个属性只有在需要该属性的值时才进行计算,而且只计算一次。

其次来理解一下规则(Rule),它是MMSeg分词算法中的又一个关键的概念。实际上我们可以将规则理解为一个过滤器(Filter),过滤掉不符合要求的chunk。MMSeg分词算法中涉及了4个规则:

规则1:取最大匹配的chunk(Rule1:Maximummatching)规则2:取平均词长最大的chunk(Rule2:Largestaveragewordlength)规则3:取词长标准差最小的chunk(Rule3:Smallestvarianceofwordlengths)规则4:取单字词自由语素度之和最大的chunk(Rule4:Largestsumofdegreeofmorphemicfreedomofone-characterwords)

这4个规则符合汉语成词的基本习惯。

再来理解一下匹配方式复杂最大匹配(Complexmaximummatching):

复杂最大匹配先使用规则1来过滤chunks,如果过滤后的结果多于或等于2,则使用规则2继续过滤,否则终止过滤过程。如果使用规则2得到的过滤结果多于或等于2,则使用规则3继续过滤,否则终止过滤过程。如果使用规则3得到的过滤结果多于或等于2,则使用规则4继续过滤,否则终止过滤过程。如果使用规则4得到的过滤结果多于或等于2,则抛出一个表示歧义的异常,否则终止过滤过程。

最后通过一个例句--“研究生命起源来简述”一下复杂最大匹配的分词过程。MMSeg分词算法会得到7个chunk,分别为:

编号chunk长度0研_究_生31研_究_生命42研究_生_命43研究_生命_起54研究_生命_起源65研究生_命_起56研究生_命_起源6

使用规则1过滤后得到2个chunk,如下:

编号chunk长度4研究_生命_起源66研究生_命_起源6

计算平均长度后为:

编号chunk长度平均长度4研究_生命_起源626研究生_命_起源62

使用规则2过滤后得到2个chunk,如下:

编号chunk长度平均长度4研究_生命_起源626研究生_命_起源62

计算标准差的平方后为:

编号chunk长度平均长度标准差的平方4研究_生命_起源6206研究生_命_起源624/9

使用规则3过滤后得到1个chunk,如下:

编号chunk长度平均长度标准差的平方4研究_生命_起源620

匹配过程终止。最终取“研究”成词,以相同的方法继续处理“生命起源”。

分词效果:

研究_生命_起源_研究生_教育_

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论