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! .

MMSeg.Net版本

by solo L2008-04-15T21:37:00Z,tag:Word Segmentation

我刚刚发布了MMSeg0.3,一位热心的朋友Xiao YF就为我们提供了.Net版本。

他使用了Java Language Conversion Assistant(Java语言转换助手),详细的信息可以去 这里

我邀请他介绍一下转换的过程,很快就收到了回复,整理如下:

-------------------------------------------------------------------

关于转换的详细介绍,网上有很多,诸如命名空间的对应等,感兴趣的朋友们可以检索一下。

我这里只简单说一下我的转换。

通过菜单File->Open->Convert…打开转换向导,剩下的步骤就简单了。选择类库转换,选择源代码位置,OK!如图

Java Language Conversion Assistant

转换并不是完全对等的,由于Java与C#的区别,一些类并没有对应,比如CharSequence类在C#中就没有。一些类被转成功能相近的类,如TreeMap被转成SortList等。

转换程序会最后生成一个报告,并在转换后的源代码中可能发生问题的地方,添加//UPDATE_TODO之类的注释。一般情况下,略微修改即可。

函数转换后并没有很好的符合.net的命名规范,如next()函数,在.net中一般会命名为Next()。

转换的程序一般会添加一个名为SupportClass.cs的文件。文件内容视转换的程序的不同而不同。以转换后的MMSeg为例,其中添加了判断字符编码的函数。

转换编码问题:转换程序对中文处理不好。如果转换的文件中含有中文,而且文件编码不是Ansi的话,转换会出现乱码。如果是这样,转换前可以先转成Ansi(如,用notepad打开后,另存为,选择编码或用UltraEdit中的编码转换)。

对于MMSeg的转换不是很复杂,代码本身比较清晰,稍微修改就可以编译了。

测试程序移出来后的测试结果表明,转换后的代码是正确的。

测试结果中的测试有两个值得注意:

第一个,判断字符集

public void testLSDMFOCWRule2()
{
    // LSDMFOCWRule -> Rule4
    System.String content =
      "LatinLetter资源描述框架是一个用于表达关于万维网上的资源的信息的语言。";
    IWord word = algorithm.next(content.ToCharArray());
    while(word!=null)
    {
        Console.Write(word.Value);
        Console.Write("_");
        word = algorithm.next(content.ToCharArray());
    }
}

测试内容是MMSeg Java版中采用的。结果为

LatinLetter_资源_描述_框架_是_一个_用于_表达_关于_万_维_网上_的_资源_的_信息_的_语言_。_

第二个,测试结果显示失败的,MMRuleTest中的

public void testInvoke3()
{
    IWord word1 = new Word("研究",
      org.solol.mmseg.core.IWord_Fields.CJK_WORD);
    IWord word2 = new Word("生命",
      org.solol.mmseg.core.IWord_Fields.CJK_WORD);
    IWord word3 = new Word("起源",
      org.solol.mmseg.core.IWord_Fields.CJK_WORD);
    IWord word4 = new Word("研究生",
      org.solol.mmseg.core.IWord_Fields.CJK_WORD);
    IWord word5 = new Word("命",
      org.solol.mmseg.core.IWord_Fields.CJK_WORD);

    IChunk chunk1 = new Chunk(new IWord[]{word1, word2, word3});
    IChunk chunk2 = new Chunk(new IWord[]{word4, word5, word3});

    IChunk[] chunk = rule.invoke(new IChunk[]{chunk1, chunk2});

    NUnit.Framework.Assert.IsTrue(2 == chunk.Length);
    NUnit.Framework.Assert.AreEqual(chunk1, chunk[0]);
    NUnit.Framework.Assert.AreEqual(chunk2, chunk[1]);
}

分词的结果是chunk1对应chunk[1],chunk2对应chunk[0],因为MMRule选取的是最大长度,这两个Chunk的长度相等。那么结果的不同,表明Java中的Sort和.Net中的Sort的行为不尽相同。此处不再深究。

测试用例的运行结果,如下:

测试用例

附代码,修改了判断字符编码类型的Bug,在UnicodeSetSupport类中添加了==,!=的重载,否则在对象的比较中恒为false(引用型比较)。

另,转换后的代码中的UnicodeSetSupport类改为Enum(枚举)或常量类或许更好一些。重载只是比较偷懒的做法:-)

源代码下载 mmseg-v0.1.net.zip

想和Xiao YF讨论可以给他发邮件(xiaoyifang198302 at gmail.com)。

-------------------------------------------------------------------

Copyright © SoloL.org 冀ICP备06003230号