关于双数组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
 

数组

-
  • 1970年01月01日 08:00

php扩展trie_filter 过滤关键词

在项目中需要对用户传递过来的文字进行过滤敏感词,用到这个,今天有时间研究了一下,故写了这篇博客。 关键词过滤扩展,用于检查一段文本中是否出现敏感词,基于Double-Array Trie 树实现 ...
  • json_ligege
  • json_ligege
  • 2017-06-14 17:44:17
  • 721

libdatrie支持中文

下载地址 http://download.csdn.net/detail/mingspy/5737467 实现方法 libdatrie不支持中文,这让人用起来很是不爽。我做了如下更改,使其支持中...
  • mingspy
  • mingspy
  • 2013-07-11 15:41:01
  • 3489

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

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

支持中文的libdatrie

  • 2013年07月11日 15:31
  • 615KB
  • 下载

libdatrie的DA内存图解

资料 DAT的详细介绍及代码见 http://linux.thai.net/~thep/datrie/datrie.html 1. Trie到DA的映射图 2. tr...
  • mingspy
  • mingspy
  • 2013-07-10 16:17:35
  • 1827

datrie中文支持不够?

要找一个trie的python包,希望性能不错,支持中文。pytrie是python实现,而且是基于hash数据结构的,先pass,找了下,发现datrie , 看起来是不错, C实现的 double...
  • largetalk
  • largetalk
  • 2013-07-01 23:51:24
  • 4848

双数组后缀树 Double-Array Trie(DAT)

LINK:http://blog.csdn.net/zzran/article/details/8462002 自己对树是情有独钟,故在元旦放假的时候,翻译了an efficient imp...
  • Aiphis
  • Aiphis
  • 2015-11-01 09:02:00
  • 1032

DAtrie

先罗列下参考的 http://ju.outofmemory.cn/entry/109689 http://www.cnblogs.com/zhangchaoyang/articles/450...
  • adofsauron
  • adofsauron
  • 2016-04-24 12:07:46
  • 445

datrie树修改

待随后补充
  • adofsauron
  • adofsauron
  • 2016-05-11 19:22:14
  • 495
收藏助手
不良信息举报
您举报文章:关于双数组Trie
举报原因:
原因补充:

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