关于双数组Trie

转载 2007年10月14日 23:35:00
原贴:http://firtex.org/firtex_forum/archiver/?tid-158.html

wanilyer
关于双数组Trie

请问Firtex中的双数组Trie树是怎么构造词典的,具体又是在哪个函数中构造的。

我找来找去也没有找到相关的代码。

ChineseAnalyzer.cpp 这个文件中的CTokens* CChineseAnalyzer::nextTokensInternal(CReader* reader,CTokens* pInput)
函数是用来查询词典中的词吗?

2007-4-19 05:28 PM wanilyer
也就是说       
tstring dict = GlobalConfig.General.Path + _T("//data//coredict.pdat");
if( Load(dict.c_str()) == false)
        throw CFileIOException("CChineseAnalyzer:load dictionary failed.");

怎么样可以构造出 coredict.pdat 这个文件并对这个文件进行修改,也就是删除词和增加词操作。

2007-4-19 05:31 PM admin
目前还没有发布词典构造的代码,不过双数组Trie树的构造算法是公开的,你可以参考一下libdatrie的代码

2007-4-19 05:42 PM wanilyer
谢谢管理员这么快的回复。

最近需要自己构建词典并能动态更新。
您能提给我这个算法的具体实现思路吗?感激不尽。
我今天在网上找了一天,很多涉及到 双数组Trie 的论文对这个的构造都是一笔带过。


另:libdatrie 这是个什么东西?

2007-4-19 05:58 PM admin
libdatrie是一个泰国人写的构建双数组TRIE树的开源代码。
中文的可能讲得不是很详细,可以搜一下双数组TRIE树方面的英文论文(double-array trie ).
这里给你提供一篇介绍双数组TRIE树实现的文章 ([url]http://linux.thai.net/~thep/datrie/datrie.html[/url])

双数组TRIE树的构建很慢,如果动态更新比较频繁,估计构建时间是个问题

2007-4-19 06:15 PM wanilyer
好的,非常谢谢您的帮助。
真高兴能进入这个论坛。

我们的词库比较小,可能不到100个词汇,是为特定领域而定做的。
词库是迭代更新的。所以必须自己构建和更新。而且词库的构建应该也会在后台处理。
真正与用户交互的还是查询。所以这方面问题不会很大。

希望有新的问题还能向您请教。

2007-4-20 08:12 AM yxg_80
libdatrie能直接用吗?下载下来里边只有一些文件,并不像是一个工程啊?

2007-4-20 11:47 AM yxg_80
d:/My Documents/Visual Studio Projects/libdatrie/datrie/trie.c(398) : fatal error C1010: 在查找预编译头指令时遇到意外的文件结尾
该如何解决?

2007-4-20 11:59 AM yxg_80
在vc6.0下,无法打开config.h,和找不到sb-trie.h应该怎么办啊?

2007-4-20 01:43 PM wanilyer
呵呵 我也碰到这样的问题,没办法,只有慢慢看源代码了。

ls老兄,关于GB2312字符集的序列码怎么样可以得到?

2007-4-20 02:08 PM yxg_80
ls老兄是什么意思?

2007-4-20 02:20 PM wanilyer
就是楼上老兄的意思

2007-4-20 02:24 PM yxg_80
哦,序列吗?你说的是firtex吗?firtex是在chineseAnalyzer中的load函数里读的,你可以自己看看,如果还不明白我可以把我理解的告诉你!

[[i] 本帖最后由 yxg_80 于 2007-4-23 10:38 AM 编辑 [/i]]

2007-4-20 02:28 PM wanilyer
我看了 不明白,我是说 那个firtex是怎么知道某个字符的序列码的。

我看了你的另外一个帖子的讨论结果
比如 “东”GB码是46763,这个我可以得到。
但是那个 m_charset[46763] = 230;这个是怎么来的

2007-4-20 02:33 PM yxg_80
是词典里的,是词典算法将 东 的  编号设为230的

2007-4-20 02:41 PM wanilyer
1、那就是说这个词典算法也可以由我自己来确定了吧!我想把东设为多少都行?

2、你知道他的词典算法吗?

2007-4-20 02:47 PM wanilyer
兄弟,你有QQ没有啊,加一个,有问题好一起讨论讨论啊。

2007-4-20 02:51 PM admin
只要能确保 词->词ID 的对应没有重复,你可以实现自己的Analyzer替代现在默认的Analyzer
相当于提供自己的分词算法

[quote]原帖由 [i]wanilyer[/i] 于 2007-4-20 02:41 PM 发表
1、那就是说这个词典算法也可以由我自己来确定了吧!我想把东设为多少都行?

2、你知道他的词典算法吗? [/quote]

2007-4-20 03:02 PM wanilyer
[quote]原帖由 [i]admin[/i] 于 2007-4-20 02:51 PM 发表
只要能确保 词->词ID 的对应没有重复,你可以实现自己的Analyzer替代现在默认的Analyzer
相当于提供自己的分词算法

[/quote]

谢谢,能透露一下Firtex中的 词->词ID 的算法吗?

2007-4-20 03:27 PM yxg_80
哈哈,估计在双数组trie得开源代码中有,不过我没有细看。
我的msn:[email]yxg_80@hotmail.com[/email]
我在上边体的问题,不是很难的,有知道的告诉我啊!

2007-4-20 03:39 PM wanilyer
帮忙找找看,我发现那个词->词ID的算法并没有公开。
那个词ID都是从文件中读出来来的,而这个文件又是提供给你的。
所以我觉得firtex并没有公开词->词ID算法,Trie树构造算法也没公开。

我机器上没有.net,所以看firtex代码比较郁闷,我现在都是用vc6在看代码,那个费劲啊。

2007-4-20 03:58 PM yxg_80
哈哈,词->词ID的算法是在 双数组trie(libdatrie)程序在生成词典的时候给出id的,firtex只是将词典中的东西读出来!

2007-4-20 04:01 PM admin
词->词ID有提供代码啊,就是CChineseAnalyzer的 nextTokensInternal()函数
暂时没有提供生成双数组TRIE树的代码,但这个算法是公开的
过段时间应该会提供:)

2007-4-20 04:07 PM wanilyer
[quote]原帖由 [i]yxg_80[/i] 于 2007-4-20 03:58 PM 发表
哈哈,词->词ID的算法是在 双数组trie(libdatrie)程序在生成词典的时候给出id的,firtex只是将词典中的东西读出来! [/quote]

双数组生成词典需要这个ID,这个ID应该不是在生成词典的时候给出的。

2007-4-20 04:09 PM wanilyer
[quote]原帖由 [i]admin[/i] 于 2007-4-20 04:01 PM 发表
词->词ID有提供代码啊,就是CChineseAnalyzer的 nextTokensInternal()函数
暂时没有提供生成双数组TRIE树的代码,但这个算法是公开的
过段时间应该会提供:) [/quote]

好,看来我得仔细看看了。没看明白。
生成双数组TRIE算法,我昨天看了您给我的论文,基本上弄懂了。

先把这个词->词ID算法给搞清楚。

2007-4-20 04:24 PM yxg_80
难道乎我理解错了:(

2007-4-20 04:30 PM wanilyer
俺也刚弄,看来需要管理员给我们解释一下了,词ID应该是 双数组Trie在生成数组对也就是 base和check数组,通俗的将就是词典的时候需要的。因为需要根据词的ID来计算check数组中的元素。所以词ID 肯定要在双数组Trie构造词典前确定下来,不知道对不对。

2007-4-20 04:45 PM wanilyer
[quote]原帖由 [i]admin[/i] 于 2007-4-20 04:01 PM 发表
词->词ID有提供代码啊,就是CChineseAnalyzer的 nextTokensInternal()函数
暂时没有提供生成双数组TRIE树的代码,但这个算法是公开的
过段时间应该会提供:) [/quote]

我刚大概看了一下CChineseAnalyzer的 nextTokensInternal()函数
我发现这个函数只是使用了 m_charset[code] 这个值,也就是说一个汉字所对应的GB码的序列码。

整个函数中没有对 m_charset[code] 执行赋值的操作,也就是说m_charset[code] 的值不是在这个函数中生成的。

在load函数中有这么一句
fread(m_charset,_CHARSET_SIZE,sizeof(int),fp);
这句的意思我想是从文件中初始化 m_charset。也就是词ID早就已经写好在文件中了。

2007-4-20 04:48 PM yxg_80
词ID早就已经写好在文件中了,对啊!在词典中

2007-4-20 04:53 PM wanilyer
[quote]原帖由 [i]yxg_80[/i] 于 2007-4-20 04:48 PM 发表
词ID早就已经写好在文件中了,对啊!在词典中 [/quote]

我现在就想知道这个词ID是怎么确定的,也就是说词典中的词ID是怎么来的。
人工一个一个写的?还是用算法?因为汉字的GB码好像不连续,如果用算法,我想应该会浪费一定的空间。

页: [1] 2
yxg_80
个人感觉应该是算法,就是admin推荐的那个,我今天下午一直在试,现在还没有运行下来,先不看midatrie了,这个使用c++写的,libdatrie-0.1.1使用c写的。

2007-4-20 05:25 PM wanilyer
[quote]原帖由 [i]yxg_80[/i] 于 2007-4-20 05:17 PM 发表
个人感觉应该是算法,就是admin推荐的那个,我今天下午一直在试,现在还没有运行下来,先不看midatrie了,这个使用c++写的,libdatrie-0.1.1使用c写的。 [/quote]

admin推荐的哪个?

2007-4-20 05:25 PM yxg_80
ibdatrie

查看完整版本: 关于双数组Trie
 

Trie树进阶:Double-Array Trie原理及状态转移过程详解

Trie树本身就是一个很迷人的数据结构,何况是其改进的方案。在本博客中我会从DAT(Double-Array Tire)的原理开始,并结合其源代码对DAT的状态转移过程进行解析。如果因此你能从我的博客...
  • u013761665
  • u013761665
  • 2015年10月22日 15:54
  • 8430

double-array-trie双数组trie树原理解析和数据构建过程

本文主要是对double-array实际实现时的一些概念和逻辑进行自己的解释, 有误请指点. coolkissmile@gmail.com trie树的作用 常用的高效查询检索数据结构 doubl...
  • kissmile
  • kissmile
  • 2015年08月11日 11:47
  • 4700

[转]Trie树优化算法:Double Array Trie 双数组Trie

Trie逻辑结构      Trie是一种常见的数据结够,可以实现前缀匹配(hash是不行的),而且对于词典搜索来说也是O(1)的时间复杂度,虽然比不上Hash,但是空间会省不少。       比如下...
  • heiyeshuwu
  • heiyeshuwu
  • 2015年01月08日 16:33
  • 3984

基于双数组树Trie的词典查询算法

  • 2011年04月27日 14:54
  • 797KB
  • 下载

DoubleArrayTrie(双数组Trie树)

  • 2015年10月22日 09:57
  • 2.13MB
  • 下载

双数组Trie优化算法及其应用研究

  • 2012年05月05日 18:14
  • 305KB
  • 下载

双数组字典树Double Array Trie(上)

本文转载自:http://www.cnblogs.com/zhangchaoyang 作者:Orisun 如有侵权,请联系本人,一定修改至您满意为止。 Trie树主要应用在信息检索领...
  • u013300579
  • u013300579
  • 2017年12月22日 09:33
  • 42

双数组trie

1.概念:双数组的本质实际上就是一个有限状态的自动机。它能根据输入的字符转移到下一状态,最终到达终止状态。 2.用处:能够用o(n)的时间复杂度进行字符串识别,缺点是占用较多的内存,存储数组是一...
  • nkliming
  • nkliming
  • 2013年12月15日 23:19
  • 809

读 双数组Trie树算法优化

以前,做过一个翻译的程序,处理的只是英文字符,当时做的,构造了一个26叉树(26个英文字母,每一个字母对应一个树结果),当时也不知道这对应的数据结构术语是什么? 后来一个巧合的机会知道了Trie树数据...
  • hero_fantao
  • hero_fantao
  • 2012年05月17日 13:52
  • 888

基于双数组trie树的中文分词程序

由于前面写的朴素bayes分类器,针对英文文本进行统计分析的,现在要想用于中文文本,则需要对中文文本进行分词。找了好几个分词系统,比如张华平老师的ICTCLAS、吕震宇老师用c#改写的ICTCLAS版...
  • zhoubl668
  • zhoubl668
  • 2011年11月10日 21:33
  • 4119
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于双数组Trie
举报原因:
原因补充:

(最多只允许输入30个字)