JavaScript must be enabled in order for you to view this page. However, it seems JavaScript is either disabled or not supported by your browser. To view this page, enable JavaScript by changing your browser options, then Try again! .

MMSeg0.3发布

by solo L2008-04-06T14:07:00Z,tag:Word Segmentation

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,以前的版本在这里

Copyright © SoloL.org 冀ICP备06003230号