NewSMTH

zhjin (sweptAway): 在开发中文分词器的时候, 一个高效的词典结构尤其重要。 词典
的一种常见高效的实现方式就是使用 Trie 结构, 但是传统的 Trie
结构的实现方式复杂, 也比较浪费内存。 双数组 是目前 Trie 结构
中的一种高效的实现方式, 检索速度快, 也比较节约内存。 这里简
要介绍两个比较实用的双数组实现
1. Darts (http://chasen.org/~taku/software/darts/)
Darts(Double-ARray Trie System) 是日本的 Taku kudo (也是 CRF++
的作者) 实现的一个双数组, 接口简单,只提供了一个约 500 行代码
的头文件 darts.h, 实现的逻辑也相对简单, 如果了解双数组的原理
的话,要读懂代码并不难。目前两个著名的开源日文分词系统 Mecab,
Chasen 都使用 Darts 构建词典, 检索速度快, 但是有点浪费内存。
Darts 的接口文档是日文的, 我把它的主要接口翻译成了中文,
可以参看我博客上的如下链接
http://zhjin.spaces.live.com/blog/cns!2FEA4AA78B600980!692.entry?&_c02_vws=1
2. Darts-clone (http://code.google.com/p/darts-clone/)
另外一个日本人 Susumu Yata 开发的一个双数组实现, 接口完全兼容
Darts, 因此叫做 Darts-clone, 实现算法可以参看论文
Yata, S.; Oono, M.; Morita, K.; Fuketa, M.; Sumitomo, T. & Aoe, J.
A compact static double-array keeping character codes.
Information Processing and Management, Vol. 43, No. 1, pp. 237-247, 2007.
从论文的署名顺利来看, 该作者应该是双数组的发明者 Junichi Aoe
的学生。 在 Darts 中, 双数组的每个节点要由 base 和 check 两个
32bit 整数来表示, Susumu Yata 的论文中给出了只用一个 32bit 整
数来同时表示 base 和 check
的简单方法, 同时又对只有单个分支的节点进行压缩,因此Darts-clone
相比于 Darts大大节约了内存。 另外, Darts-clone 在实现的时候把双
数组中的加法操作巧妙替换为位运算, 因此检索速度上也要比 Darts 稍
快一些。
有兴趣的读者可以参看 http://code.google.com/p/darts-clone/w/list
中给出的 Darts & Darts-clone 的性能对比。作者给了 Darts-clone 的两个
实现
Darts clone 0.32f 内存消耗为 Darts 的 1/2, 速度比 Darts 快
Darts clone 0.32e 内存消耗为 Darts 的 1/4, 速度比 Darts 慢
当然以上为粗略结果, 性能表现在不同数据集上略有差异��boycat (记得请冬子打球|我是乡下人,小地方来的): 赞~~~
【 在 zhjin (sweptAway) 的大作中提到: 】
: 在开发中文分词器的时候, 一个高效的词典结构尤其重要。 词典
: 的一种常见高效的实现方式就是使用 Trie 结构, 但是传统的 Trie
: 结构的实现方式复杂, 也比较浪费内存。 双数组 是目前 Trie 结构
: ...................jiju (Super.Jiju): zan
【 在 zhjin (sweptAway) 的大作中提到: 】
: 在开发中文分词器的时候, 一个高效的词典结构尤其重要。 词典
: 的一种常见高效的实现方式就是使用 Trie 结构, 但是传统的 Trie
: 结构的实现方式复杂, 也比较浪费内存。 双数组 是目前 Trie 结构

双数组 实现 Trie相关推荐

  1. 数据结构-----基于双数组的Trie树

    Trie树简介 Trie树也称字典树,在字符串的查找中优势比较明显,适用于在海量数据中查找某个数据.因为Trie树的查找时间和数据总量没有关系,只和要查找的数据长度有关.比如搜索引擎中热度词语的统计. ...

  2. 双数组Trie树(DoubleArrayTrie)Java实现

    http://www.hankcs.com/program/java/%E5%8F%8C%E6%95%B0%E7%BB%84trie%E6%A0%91doublearraytriejava%E5%AE ...

  3. Ansj分词双数组Trie树实现与arrays.dic词典格式

    http://www.hankcs.com/nlp/ansj-word-pairs-array-tire-tree-achieved-with-arrays-dic-dictionary-format ...

  4. 双数组trie树的基本构造及简单优化

    一 基本构造 Trie树是搜索树的一种,来自英文单词"Retrieval"的简写,可以建立有效的数据检索组织结构,是中文匹配分词算法中词典的一种常见实现.它本质上是一个确定的有限状 ...

  5. 用Python实现字典树(Trie)与双数组字典树(DATrie)

    1. 字典树(Trie) 假如我们把字典中的词以记录的形式(无序)存入数据库中.现给定一串字符,要查找该字符串是否为字典中的词.因为数据库中的记录是无序的,所以,最朴素的方法就逐记录匹配.此方法简单, ...

  6. 双数组Trie的一种实现

    An Implementation of Double-Array Trie 双数组Trie的一种实现 原文:http://linux.thai.net/~thep/datrie/datrie.htm ...

  7. python Trie树和双数组TRIE树的实现. 拥有3个功能:插入,删除,给前缀智能找到所有能匹配的单词...

    #coding=utf-8 #字典嵌套牛逼,别人写的,这样每一层非常多的东西,搜索就快了,树高26.所以整体搜索一个不关多大的单词表 #还是O(1). ''' Python 字典 setdefault ...

  8. 关于双数组Trie查询词典构造总结

    原贴:http://www.firtex.org/firtex_forum/archiver/?tid-241.html FirteX开发论坛 » FirteX开发者专区 » 关于双数组Trie查询词 ...

  9. 双数组trie树详解

    目录 双数组trie树的构建 构建base array 构建check array 双数组trie树的查询 双数组trie树的构建 NLP中trie树常用于做快速查询,但普通的trie树由于要保存大量 ...

最新文章

  1. 用Construct 2制作入门小游戏~
  2. CSS Sprites (转)
  3. opensuse download
  4. sql 查询慢的48个原因分析
  5. python各版本区别_关于python中不同版本的print区别
  6. MBA已经全面***“中国式教育”!
  7. heap c语言数组实现,垃圾回收算法实现之 - 分代回收(完整可运行C语言代码)...
  8. 伪静态 apache重写
  9. 第五章 列表、元组和字符串[DDT书本学习 小甲鱼]【8】
  10. JAVA根据时间增加1天
  11. ElasticSearch的REST APIs 之 索引的状态管理
  12. 阿里云视频直播视频存储回调功能的处理方法
  13. 企业信息管理系统(4)_用户查询
  14. 考研数据结构历年真题(选择题)整理
  15. 光伏产业 | 我国光伏银浆正逐步国产化替代,已打破国际垄断局面
  16. android 定时器封装
  17. AutoCAD 2013 .net插件创建向导现在支持Map 3D,Civil 3D,AutoCAD Architecture 和AutoCAD MEP...
  18. Linux中pidgin下运行QQ和MOC以及人人
  19. 【Python】京东抢购脚本
  20. Opencv最强案例——使用摄像头、OpenCV和Python扫描条形码和二维码。

热门文章

  1. VTK:可视化算法之TensorEllipsoids
  2. VTK:模型之SmoothDiscreteMarchingCubes
  3. VTK:图片之ImageGradientMagnitude
  4. VTK:几何对象之CellTypeSource
  5. OpenCV运行分类深度学习网络的实例(附完整代码)
  6. OpenCV向Facemark API添加新算法
  7. Qt Creator测验Testing
  8. OpenGL混合功能实例
  9. C++若不想使用编译器自动生成的函数,就该明确拒绝
  10. C和C++线性表的顺序存储结构