ITPub博客

首页 > 人工智能 > 自然语言 > 如何使用Hanlp加载大字典

如何使用Hanlp加载大字典

自然语言 作者:adnb34g 时间:2019-01-23 09:52:12 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 ,知道有了匹配,但是这样缺陷很明显,解决不了多个字典匹配同一个词的字串的情况,这里我的考察方案是,字典中的同一个字开始的词条映射到同一个文件,这样不会出现字串问题了。

以上就 是个大概的修改,可以参考。


 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31524777/viewspace-2564514/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
八年IT互联从业经历,专注网络营销、大数据、人工智能等领域的知识分享

注册时间:2018-03-09

  • 博文量
    172
  • 访问量
    115342