论坛
门户
内部优惠
喜欢
话题
VIP会员
搜索
新浪微博
登录
注册
100%
100%
首页
>
网络技术
>
网络技术
>
如何使用Hanlp加载大字典
回复
« 返回列表
hadoop小学生
精灵王
注册日期
2018-09-13
发帖数
160
QQ
3234520070
火币
360枚
粉丝
0
关注
0
加关注
写私信
打招呼
阅读:
3328
回复:
0
如何使用Hanlp加载大字典
楼主
#
更多
只看楼主
倒序阅读
发布于:2019-01-23 10:26
保存
100%
100%
[]
1
图片:封面图.jpg
问题
因为需要加载一个
近
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
,知道有了匹配,但是这样缺陷很明显,解决不了多个字典匹配同一个词的字串的情况,这里我的考察方案是,字典中的同一个字开始的词条映射到同一个文件,这样不会出现字串问题了。
以上就
是个大概的修改,可以参考。
---------------------
喜欢
0
评分
0
最新喜欢:
DKHadoop用着还不错!
回复
100%
发帖
回复
« 返回列表
普通帖
您需要登录后才可以回帖,
登录
或者
注册
100%
返回顶部
关闭
最新喜欢