Trie树(字典树)服务(已开源)

  瞿托尼

  

前言:在数据挖掘领域,。净基本上是空白,除了分词程序外,啥都没有,大量的招聘显示数据挖掘目前是Java、c++和Python的天下。作为微软阵营的一份子,我始终认为我们不该坐以待毙,与其坐着被人看笑话,还不如勇敢的站出来,创造一个崭新的。NET未来。(话说昨天的吐槽贴不知道大家玩的尽兴不尽兴,不是有人让我给点实战的玩意来证明。NET的牛X嘛,没问题啊,我如约而至。)

  

,

  

Trie树(字典树)对很多人显得有些陌生,用一句话来概括,它可以有效加速字符串匹配速度,并且应用极其广泛,如分词,搜索,脏字过滤等。曾经写过一篇介绍TrieTree的文章,不熟悉的同学可以看一下《Trie树介绍及其c#实现》。

  

TrieTree之所以快速,和它树形存储结构很有关系,由于所有的查找都是走结点的,所以速度会比普通字符串匹配快很多,传统匹配的问题在于即使匹配不成功,每次还是要去匹配前面这些字符,而且要与每一个字典项去匹配。

  

举个简单的例子,假设字典里面有两句整句,如“;这里是我们的地盘”,,“;这里是你们的”;,假设我现在要匹配
  “,这里是他们的”;,传统存储会把字典保存在List中,但这就意味着,“没有,这里是”,三个字每次都要匹配一遍,即使最终结果是没找到“;这里是他们的”;。但如果是TrieTree结构,我们只需要匹配一次“;这里是”,就能知道存不存在,随着字典中词数的增加,这种性能提升愈加明显。

  

这么好的东西怎么能没有一个通用的框架,于是我便考虑设计了TrieTree Service.TrieTree服务是一个基于Windows服务的服务,采用套接字与客户端进行通讯,通讯部分使用了江大鱼的SuperSocket。(这玩意确实好用,上手也很快,我大概用了2天就把通讯部分全搞定了。)之所以采用Windows服务,主要考虑了分布式部署,以及内存空间的需求。由于TrieTree服务采用内存作为缓存空间,所以对内存是有很大需求的,如果与其他应用共享空间,在32位系统上估计很快就3 g了,根本没法用,但做成Windows服务以后,3 gb至少是独享的。而且理论上我可以部署n个服务,加载不同的字典,比如服务1我加载盘古分词词典,服务2我加载MongoDB的字典,以此类推,客户端会根据需要去访问不同的服务,从而获得足够的数据支持。

  

癟rie树(字典树)服务(已开源)"

  

Trie树服务还有一个很明显的优势那就是字典资源的整合,以往如果我们要调用第三方字典库或者扩展字典库,可能必须重新写一个类来实现读,然后调用不同的接口来加载不同的字典库,现在有了Trie树服务,你就可以做到把几个库合并在一起,比如盘古分词的库可以和细胞词库混用,如果词重复,Trie树服务不会重复添加,而是在现有结点上把频率相加。例如,我本地的TrieTree服务就把盘古分词,IKAnalyzer词典,还有我自己的多个MongoDB的字典库一起加载起来运行,那效果绝对是只可意会不可言传啊,哈,哈。我看了下,内存占用也不高,只有400米左右。

  

Trie树服务支持POS(词性)枚举,说通俗点就是某个词的词性,如名词,动词,代词等。目前的POSType采用了盘古分词的类型,以后会考虑扩充,目前足够了。(话说清华和北大都有一套自己的POS分类,比盘古要详细,以后会考虑支持这两个标准,因为POS的细粒度决定了最终的分词结果)。

     【国旗】   公共enum POSType: int   {///& lt; summary>///形容词形语素///& lt;/summary>   D_A=0 x40000000,///& lt; summary>///区别词区别语素///& lt;/summary>   D_B=0 x20000000,///& lt; summary>///连词连语素///& lt;/summary>   D_C=0 x10000000,///& lt; summary>///副词副语素///& lt;/summary>   D_D=0 x08000000,///& lt; summary>///叹词叹语素///& lt;/summary>   D_E=0 x04000000,///& lt; summary>///方位词方位语素///& lt;/summary>   D_F=0 x02000000,///& lt; summary>///成语///& lt;/summary>   d1=0 x01000000,///& lt; summary>///习语///& lt;/summary>   D_L=0 x00800000,///& lt; summary>///数词数语素///& lt;/summary>   A_M=0 x00400000,///& lt; summary>///数量的词///& lt;/summary>   D_MQ=0 x00200000,///& lt; summary>///名词名语素///& lt;/summary>   D_N=0 x00100000,///& lt; summary>///拟声词///& lt;/summary>   D_O=0 x00080000,///& lt; summary>///介词///& lt;/summary>   D_P=0 x00040000,///& lt; summary>///量词量语素///& lt;/summary>   A_Q=0 x00020000,///& lt; summary>///代词代语素///& lt;/summary>   D_R=0 x00010000,///& lt; summary>///处所词///& lt;/summary>   D_S=0 x00008000,///& lt; summary>///时间词///& lt;/summary>   D_T=0 x00004000,///& lt; summary>///助词助语素///& lt;/summary>   D_U=0 x00002000,///& lt; summary>///动词动语素///& lt;/summary>   D_V=0 x00001000,///& lt; summary>///标点符号///& lt;/summary>   D_W=0 x00000800,///& lt; summary>///非语素字///& lt;/summary>   D_X=0 x00000400,///& lt; summary>///语气词语气语素///& lt;/summary>   D_Y=0 x00000200,///& lt; summary>///状态词///& lt;/summary>   D_Z=0 x00000100,///& lt; summary>///人的名///& lt;/summary>   A_NR=0 x00000080,///& lt; summary>///地名///& lt;/summary>   an=0 x00000040,///& lt; summary>///机构团体///& lt;/summary>   A_NT=0 x00000020,///& lt; summary>///外文字符///& lt;/summary>   A_NX=0 x00000010,///& lt; summary>///其他专名///& lt;/summary>   (描述(“其他专名“))   A_NZ=0 x00000008,///& lt; summary>///前接成分///& lt;/summary>   D_H=0 x00000004,///& lt; summary>///后接成分///& lt;/summary>   D_K=0 x00000002,///& lt; summary>///未知词性///& lt;/summary>   未知=0 x00000000,   }

Trie树(字典树)服务(已开源)