MMSeg.Net版本
我刚刚发布了MMSeg0.3,一位热心的朋友Xiao YF就为我们提供了.Net版本。
他使用了Java Language Conversion Assistant(Java语言转换助手),详细的信息可以去 这里。
我邀请他介绍一下转换的过程,很快就收到了回复,整理如下:
-------------------------------------------------------------------
关于转换的详细介绍,网上有很多,诸如命名空间的对应等,感兴趣的朋友们可以检索一下。
我这里只简单说一下我的转换。
通过菜单File->Open->Convert…打开转换向导,剩下的步骤就简单了。选择类库转换,选择源代码位置,OK!如图
转换并不是完全对等的,由于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)。
-------------------------------------------------------------------

