MMSeg0.3发布
MMSeg-v0.1发布已经一年有余,要了解相关信息的朋友们可以看这里,需要下载的朋友们可以看这里。
我要在这里感谢曾经帮助和鼓励过我的朋友们!谢谢大家。
今天早上看到一位朋友的邮件,他试图对“「在這些企業中中國企業有十個」”这句话进行分词时遇到如下的异常,(注该朋友对词典进行了简繁转换)
org.solol.mmseg.core.AlgorithmException: There is an ambiguity! at org.solol.mmseg.internal.AbstractAlgorithm.getCJKWord (AbstractAlgorithm.java:142) at org.solol.mmseg.internal.AbstractAlgorithm.next (AbstractAlgorithm.java:65) at org.solol.mmseg.core.MMSeg.segment(MMSeg.java:36) at org.solol.mmseg.core.MMSeg.main(MMSeg.java:130)
这不是一个bug,而是MMSeg在遇到二义性时抛出的一个异常。原来的打算是客户程序通过捕获这个异常来进行二义性处理,现在看来这很不自然,因此我做了一些改进。
以前
我使用上面朋友的例子来说明一下二义性的由来,不过我不使用繁体,而是使用这个“「在这些企业中中国企业有十个」”,这不会妨碍我们讨论问题。
如果你对MMSeg缺乏了解可能需要去阅读算法原文,也可以先看看MMSeg分词算法简述
MMseg-v0.2在处理“「在这些企业中中国企业有十个」”这个句子时首先会产生3个chunk,分别是
| 编号 | chunk | 长度 |
| 1 | 「_在_这 | 3 |
| 2 | 「_在_这些 | 4 |
| 3 | 「_在这_些 | 4 |
使用规则1过滤后得到2个chunk,分别是
| 编号 | chunk | 长度 |
| 2 | 「_在_这些 | 4 |
| 3 | 「_在这_些 | 4 |
使用规则2、规则3、规则4的方式和MMSeg分词算法简述中划分研究生命起源的例子中的处理方法完全一样,不在赘述。
四个规则使用完毕后,我们会发现仍然剩余2个chunk,分别是
| 编号 | chunk | 长度 |
| 2 | 「_在_这些 | 4 |
| 3 | 「_在这_些 | 4 |
这也就是我所说的二义性,MMSeg对于这种二义性是无能为力的,因此在MMSeg-v0.2以前会抛出一个异常,告诉客户端程序这有一个二义性。
现在
先前的二义性的处理不是很自然,下面我添加了另外的一种方式用来处理二义性。
我为MMSeg提供了一个抽象IAmbiguityHandler来处理二义性,定义如下
/**
* 2008-4-6
*/
package org.solol.mmseg.core;
/**
* @author Solo L
*
*/
public interface IAmbiguityHandler {
/**
*
* @return IChunk Can not be null.
*/
IChunk process(IChunk[] chunkList);
}
同时我提供了一个默认的实现,该实现只是简单取第一个chunk,定义如下
/**
* 2008-4-6
*/
package org.solol.mmseg.internal;
import org.solol.mmseg.core.IAmbiguityHandler;
import org.solol.mmseg.core.IChunk;
/**
* @author Solo L
*
*/
public class DefaultAmbiguityHandler implements IAmbiguityHandler {
public IChunk process(IChunk[] chunkList) {
return chunkList[0];
}
}
MMSeg-v0.3会使用默认的二义性处理器,除非你在创建算法时指定自定义的二义性处理器,方法如下
IAlgorithm algorithm = factory.createAlgorithm(type);
//Set your AmbiguityHandler here.
//algorithm.setAmbiguityHandler(ambiguityHandler);
实现自定义二义性处理器你只需要实现IAmbiguityHandler接口。
也就是说,在MMSeg-v0.3中你可以使用默认的处理器或自定义的处理器来处理二义性。
使用MMSeg-v0.3处理“「在这些企业中中国企业有十个」”的结果是:
Complex->「_在_这些_企业_中_中国_企业_有_十个_」_
不会在抛出异常了。
你可以从这里下载MMSeg-v0.3,以前的版本在这里。

