关于双数组Trie

原贴: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
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值