论坛首页 综合技术论坛

正向最大匹配改进算法

浏览 17752 次
该帖已经被评为良好帖
作者 正文
   发表时间:2009-06-02  
我写的一个跟现在这个差不多 我发现我们都被满屏的if else困扰啊

ps:银河英雄传好看么...我就只知道杨威利这个角色
0 请登录后投票
   发表时间:2009-06-02  
jenlp520 写道
我写的一个跟现在这个差不多 我发现我们都被满屏的if else困扰啊

ps:银河英雄传好看么...我就只知道杨威利这个角色

等我抽出时间重构一下。
PS:银英很好看,老动画
0 请登录后投票
   发表时间:2009-06-04   最后修改:2009-06-04
现在我很郁闷啊 用之前的做法 2000个关键字消耗内存在15-18M左右 这个大小很恐怖啊

我估计是每个节点一个hashmap太占内存了 然后自己改了下map把原来DEFAULT_INITIAL_CAPACITY = 16改成了
DEFAULT_INITIAL_CAPACITY = 5结果在测试2000个关键字还是用了15M内存左右
后来我又试试不在每个节点里面放一个hashmap而是用个全局的...结果还是用了15M左右

难道一定要用双数组trie才能把内存降下来么...

ps:请原谅我没学过数据结构...看双数组trie看了半天还是弄清楚怎么去创建数组
ps:附上我没看懂的双数组trie文档
  • 49.rar (28.3 KB)
  • 下载次数: 61
0 请登录后投票
   发表时间:2009-06-04  
中文分词,效果最好的是隐马尔科夫模型。
0 请登录后投票
   发表时间:2009-06-05  
Programmer2.x 写道
中文分词,效果最好的是隐马尔科夫模型。


楼上这个回答文不对题!隐码模型跟楼主说的字串匹配没直接关系。

在中文分词中,隐码模型适合做语法分析,但不见的是效果最好的分词方式。用过中科院的分词器你就知道了。


另外,楼主的想法很好。
给楼主一个提示,
1.在路径上标注匹配的最长词语(这个楼主已经实现)
2.在词典的分支上注明是否还有后续的叶节点(这样可以最快的终止匹配失败)
有了上面的数据结构,不需要使用固定深度递归来试探,能有效的提高效率,而且不会漏掉比递归深度还长的词汇
0 请登录后投票
   发表时间:2009-06-05  
jenlp520 写道
现在我很郁闷啊 用之前的做法 2000个关键字消耗内存在15-18M左右 这个大小很恐怖啊

我估计是每个节点一个hashmap太占内存了 然后自己改了下map把原来DEFAULT_INITIAL_CAPACITY = 16改成了
DEFAULT_INITIAL_CAPACITY = 5结果在测试2000个关键字还是用了15M内存左右
后来我又试试不在每个节点里面放一个hashmap而是用个全局的...结果还是用了15M左右

难道一定要用双数组trie才能把内存降下来么...

ps:请原谅我没学过数据结构...看双数组trie看了半天还是弄清楚怎么去创建数组
ps:附上我没看懂的双数组trie文档


提示你,
1.不要简单的使用String来记录词典的词,那样太占内存
2.有效的设置hashmap的参数loadFactor,建议是0.8(DEFAULT_INITIAL_CAPACITY 只是默认的容量,当不够是,HashMap照样翻倍增加,你的设计基本是没有用的,关键是loadFactor这个参数);
3.尝试动态的结合map和数组。
0 请登录后投票
   发表时间:2009-06-05   最后修改:2009-06-05
linliangyi2007 写道
jenlp520 写道
现在我很郁闷啊 用之前的做法 2000个关键字消耗内存在15-18M左右 这个大小很恐怖啊

我估计是每个节点一个hashmap太占内存了 然后自己改了下map把原来DEFAULT_INITIAL_CAPACITY = 16改成了
DEFAULT_INITIAL_CAPACITY = 5结果在测试2000个关键字还是用了15M内存左右
后来我又试试不在每个节点里面放一个hashmap而是用个全局的...结果还是用了15M左右

难道一定要用双数组trie才能把内存降下来么...

ps:请原谅我没学过数据结构...看双数组trie看了半天还是弄清楚怎么去创建数组
ps:附上我没看懂的双数组trie文档


提示你,
1.不要简单的使用String来记录词典的词,那样太占内存
2.有效的设置hashmap的参数loadFactor,建议是0.8(DEFAULT_INITIAL_CAPACITY 只是默认的容量,当不够是,HashMap照样翻倍增加,你的设计基本是没有用的,关键是loadFactor这个参数);
3.尝试动态的结合map和数组。



感谢你的建议..
我字典的词是转成char[]后保存的每个char的
我改DEFAULT_INITIAL_CAPACITY的原因是 我认为大部分节点下的分支不会超过10个 所以我认为Map内的Entry数组不需要默认的16这么大

引用
3.尝试动态的结合map和数组。

这个能否举个例 我现在对用数组实现多分支trie树很困扰
0 请登录后投票
   发表时间:2009-06-06   最后修改:2009-06-06
jenlp520 写道

感谢你的建议..
我字典的词是转成char[]后保存的每个char的
我改DEFAULT_INITIAL_CAPACITY的原因是 我认为大部分节点下的分支不会超过10个 所以我认为Map内的Entry数组不需要默认的16这么大


对于Map的空间使用时需要一定的容易的,在默认情况下,HashMap的冗余参数是0.75,也就是说,当你的Map的空间为10时,实际上只能放入7个元素,当第八个元素放入时,Map的空间就要翻倍为20了。因此,设置合理的冗余参数,能有效的抑制多余的空间损耗。当然,负面影响是,Map的命中效率会有所下降

引用
3.尝试动态的结合map和数组。
这个能否举个例 我现在对用数组实现多分支trie树很困扰


判断一个树节点的子节点,但子节点小于一定数量时,可以简单的使用数组存储,查找时直接遍历数组;但子节点大于一定数量时,改为HashMap存储,提高搜索效率
0 请登录后投票
   发表时间:2009-06-06  
jenlp520 写道


ps:请原谅我没学过数据结构...看双数组trie看了半天还是弄清楚怎么去创建数组
ps:附上我没看懂的双数组trie文档


双数组trie树在存储空间上确实做到了最小,不过在其树结构有变化时,比如增加与删除节点,其解决冲突的时间复杂度很高在比较大的字典中,并不适合
0 请登录后投票
   发表时间:2009-06-06   最后修改:2009-06-06
ansjsun 写道


哦是tire树啊...
楼主弄过双数组tire树么???我一直困惑内个呢.你这么分出来效率咋样啊!!


查询时间复杂度o(1),不过这个分词来说实在太过简单了,做文字过滤倒还有那么一丁点参考价值,具体正在完善中(请别期待,我很懒。。。)

PS:linliangyi2007兄这么晚还在线
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics