千家论坛_弱电智能化技术与工程讨论(建筑智能,家居智能,人工智能)

人工智能
收藏本版 (4) |订阅

人工智能 今日: 2828 |主题: 1070|排名: 24 

发新帖

如何使用Hanlp加载大字典...

[复制链接]
hadoop小学生 发布于: 2019-1-23 10:47 138 次浏览 0 位用户参与讨论
跳转到指定楼层

问题
因为需要加载一个 1G 的字典到Hanlp中,一开始使用了CustomDictionay.add() 方法来一条条的加载,果然到了中间,维护DoubleArraTre 的成本太高,添加一个节点,都会很长时间,本来时间长一点没有关系,只要训练出.bin 的文件,第二次加载就会很快,然而作为以空间换时间的DAT结构,内存消耗很大,预料之内的出现了
1   out of memory: heap size
的问题。后来尝试直接加载了1G 的字典,显然更不行。
思路
阅读了Hanlp的部分源码,也请教了原作者一部分问题,就打算从源码入手。初步想法大概是将原始字典 split 成多份,然后分别将多份的小字典 训练成 多个小的.bin 文件,再完整的加载到内存中,基于的原则则是:加载两个10M的字典的消耗比一个20M的要小。
然后又优化了一部分,现在加载一个大概1G的字典,占内存约3g+ ,已经可以使用了。
大概流程
1 修改 CustomDictionary.java 设置一个 hashmap 或者 一个 list 来存储所有的小Dat
2 将所有的dat加载完,这里就不再区分主副字典了。
3 修改Segment.java里面的combineByCustomDictionary 函数,源码中只有一个dat, 这里我们需要选择我们容器中其中某一个dat作为要匹配使用,之前使用的方案是,遍历所有的dat,知道有了匹配,但是这样缺陷很明显,解决不了多个字典匹配同一个词的字串的情况,这里我的考察方案是,字典中的同一个字开始的词条映射到同一个文件,这样不会出现字串问题了。
以上就是个大概的修改,可以参考。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆 千家通行证登陆

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆 千家通行证登陆

本版积分规则

千家智客微信号
千家智客微信
玩物说商城
玩物说商城