如何使用Hanlp加载大字典

简介:   问题因为需要加载一个 近 1G 的字典到Hanlp中,一开始使用了CustomDictionay.add() 方法来一条条的加载,果然到了中间,维护DoubleArraTre 的成本太高,添加一个节点,都会很长时间,本来时间长一点没有关系,只要训练出.bin 的文件,第二次加载就会很快,然而作为以空间换时间的DAT结构,内存消耗很大,预料之内的出现了1   out of memory: heap size的问题。

415578359ed9c1ebe9ad30c3d7aaf12afb7764ee 

 

问题

因为需要加载一个 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,知道有了匹配,但是这样缺陷很明显,解决不了多个字典匹配同一个词的字串的情况,这里我的考察方案是,字典中的同一个字开始的词条映射到同一个文件,这样不会出现字串问题了。

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


 

相关文章
|
28天前
|
存储 开发者 Python
Python中的collections模块与UserDict:用户自定义字典详解
【4月更文挑战第2天】在Python中,`collections.UserDict`是用于创建自定义字典行为的基类,它提供了一个可扩展的接口。通过继承`UserDict`,可以轻松添加或修改字典功能,如在`__init__`和`__setitem__`等方法中插入自定义逻辑。使用`UserDict`有助于保持代码可读性和可维护性,而不是直接继承内置的`dict`。例如,可以创建一个`LoggingDict`类,在设置键值对时记录操作。这样,开发者可以根据具体需求定制字典行为,同时保持对字典内部管理的抽象。
|
6天前
|
运维 Shell Python
第九章 Python自定义模块及导入方法
第九章 Python自定义模块及导入方法
|
Python
python中动态导入文件的方法
python中动态导入文件的方法
218 0
python中动态导入文件的方法
|
8月前
|
Python
【从零学习python 】93.使用字典管理请求路径
【从零学习python 】93.使用字典管理请求路径
55 1
|
8月前
|
Linux Shell iOS开发
【100天精通python】Day16:python模块_模块的搜索目录和导入模块异常时的处理方法
【100天精通python】Day16:python模块_模块的搜索目录和导入模块异常时的处理方法
91 0
|
9月前
|
Python
Python:关于创建字典的4种方式
Python:关于创建字典的4种方式
294 0
|
10月前
|
存储 Python
Python基础 | 比系统自带dict()更方便的字典EasyDict
Python基础 | 比系统自带dict()更方便的字典EasyDict
65 0
|
10月前
|
Python
Python的内容拼接方式
Python的内容拼接方式
|
Python
Python 技术篇 - 查看python库都包含什么方法,查看python模块某个方法的具体用法源码,查看python模块所在的物理位置,查看python库都包含哪些属性
Python 技术篇 - 查看python库都包含什么方法,查看python模块某个方法的具体用法源码,查看python模块所在的物理位置,查看python库都包含哪些属性
780 0
Python 技术篇 - 查看python库都包含什么方法,查看python模块某个方法的具体用法源码,查看python模块所在的物理位置,查看python库都包含哪些属性
|
存储 Python
Python 技术篇-利用pickle库查看pkl文件实例演示。pkl是什么类型的文件?怎么来打开它?
Python 技术篇-利用pickle库查看pkl文件实例演示。pkl是什么类型的文件?怎么来打开它?
1245 0
Python 技术篇-利用pickle库查看pkl文件实例演示。pkl是什么类型的文件?怎么来打开它?

热门文章

最新文章