最近在做分词,在网上发现了MMSEG,论文简单入理。在code.google.com上搜到了java的实现版本,非常感谢chenlb开源自己的代码。
在学习mmseg4j对字典的结构比较困惑,做了些调研,写下自己的感受。
mmseg4j采用 key-tree的形式存储字典数据结构,这有点类似中科院的ictclas4j的字典结构,ictclas4j的字典结构含有6768个字块(好像是这么多,可能有误),每一个子块是由含有以该字开头的词组成。结构图如下所示:
[img]http://dl.iteye.com/upload/attachment/0066/4764/e3fc5fee-3687-3416-b914-7208941e4abf.jpg[/img]
mmseg4j原始字典有两个,一个是chars.dct,另一个是words.dct。mmseg4j先加载chars.dct,这个比较简单,直接就是字 和 在语料库中的频率。频率是在CharNode这个类中。在加载words.dct的时候,实际上是对第一步加载chars.dct的填充,填充 CharNode 的 KeyTree字段。
KeyTree类中含有一个 TreeNode 字段,该字段也是一个类,其总定义了
该定义是一个递归的数据结构结构。
程序首先是通过下面的语句
找到dic 中的 CharNode,dic即为加载chars.dct后的dct。 其后开始逐渐的对CharNode填充,最后填充成这样的一种形式:所有同一个字开始的词语被放入到同一个CharNode中,而该规则是递归的,所有第二个词一样的也被列在同一个hashmap中,之后是第三个...依次类推下去。
这样构成了一个Character-CharNode的树状词典结构,在进行最大模式匹配时提升很大的效率。
以上的叙述有些粗浅。
在学习mmseg4j对字典的结构比较困惑,做了些调研,写下自己的感受。
mmseg4j采用 key-tree的形式存储字典数据结构,这有点类似中科院的ictclas4j的字典结构,ictclas4j的字典结构含有6768个字块(好像是这么多,可能有误),每一个子块是由含有以该字开头的词组成。结构图如下所示:
[img]http://dl.iteye.com/upload/attachment/0066/4764/e3fc5fee-3687-3416-b914-7208941e4abf.jpg[/img]
mmseg4j原始字典有两个,一个是chars.dct,另一个是words.dct。mmseg4j先加载chars.dct,这个比较简单,直接就是字 和 在语料库中的频率。频率是在CharNode这个类中。在加载words.dct的时候,实际上是对第一步加载chars.dct的填充,填充 CharNode 的 KeyTree字段。
KeyTree类中含有一个 TreeNode 字段,该字段也是一个类,其总定义了
char key;
Map<Character, TreeNode> subNodes;
boolean alsoLeaf;
该定义是一个递归的数据结构结构。
程序首先是通过下面的语句
CharNode cn = dic.get(line.charAt(0));
找到dic 中的 CharNode,dic即为加载chars.dct后的dct。 其后开始逐渐的对CharNode填充,最后填充成这样的一种形式:所有同一个字开始的词语被放入到同一个CharNode中,而该规则是递归的,所有第二个词一样的也被列在同一个hashmap中,之后是第三个...依次类推下去。
这样构成了一个Character-CharNode的树状词典结构,在进行最大模式匹配时提升很大的效率。
以上的叙述有些粗浅。