使用Hanlp加载大字典

简介:

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

out of memory: heap size

的问题。 后来尝试直接加载了1G 的字典,显然更不行。

思路
阅读了Hanlp的 部分源码,也请教了原作者一部分问题, 就打算从源码入手。初步想法大概是将原始字典
split 成多份,然后分别将多份的小字典 训练成 多个小的.bin 文件,再完整的加载到内存中,基于的原则则是:加载两个10M的字典的消耗比一个20M的要小。
然后又优化了一部分,现在加载一个大概1G的字典,占内存约3g+ ,已经可以使用了。

大概流程
修改 CustomDictionary.java 设置一个 hashmap 或者 一个 list 来存储所有的小Dat
将所有的dat加载完,这里就不再区分主副字典了。
修改Segment.java里面的combineByCustomDictionary 函数,源码中只有一个dat, 这里我们需要选择我们容器中其中某一个dat作为要匹配使用,之前使用的方案是,遍历所有的dat,知道有了匹配,但是这样缺陷很明显,解决不了多个字典匹配同一个词的字串的情况,这里我的考察方案是,字典中的同一个字开始的词条映射到同一个文件,这样不会出现字串问题了。
上面是个大概的修改,可以参考。

文章来源于ShomyLiu的博客

相关文章
|
10月前
|
存储 资源调度 监控
RFID实现仓库托盘全流程高效管控
RFID托盘管理通过为每个托盘赋予唯一电子标签,实现全流程可视化追踪。利用无线射频技术,批量快速读取信息,提升出入库、盘点、回收等环节效率5-10倍,降低丢失损耗,减少人工错误,推动仓储物流向智能化、数字化转型。(238字)
|
vr&ar
Sora视频重建与创新路线问题之Perceiver AR因果性的遮挡机制如何实现
Sora视频重建与创新路线问题之Perceiver AR因果性的遮挡机制如何实现
231 2
|
存储 设计模式 负载均衡
深入理解微服务架构中的服务发现与注册中心
【7月更文挑战第12天】在微服务架构的海洋中,服务发现和注册中心扮演着灯塔的角色。本文将揭开服务发现的神秘面纱,探索注册中心的工作原理,并指导如何在复杂的微服务网络中实现高效通信。我们将从基础概念出发,逐步深入到实践应用,最终通过案例分析来巩固理论知识。
|
机器学习/深度学习 人工智能 算法
手把手教你快速实现SIFT特征匹配(含源码)
手把手教你快速实现SIFT特征匹配(含源码)
1232 0
|
Linux C语言 C++
【C进阶】——预处理详解(一)
【C进阶】——预处理详解(一)
406 1
|
测试技术 uml
【UML】------视图
【UML】------视图
387 0
【UML】------视图
|
安全 编译器 C++
【C++起飞之路】初级——命名空间、输入输出流
【C++起飞之路】初级——命名空间、输入输出流
389 0
|
Web App开发 前端开发 JavaScript
【前端工具】Chrome 扩展程序的开发与发布 -- 手把手教你开发扩展程序
关于 chrome 扩展的文章,很久之前也写过一篇。清除页面广告?身为前端,自己做一款简易的chrome扩展吧。 本篇文章重在分享一些制作扩展的过程中比较重要的知识及难点。   什么是 chrome 扩展程序 扩展程序是一些能够修改或增强 Chrome 浏览器功能的小程序。
2496 0
|
关系型数据库 MySQL PostgreSQL
PostgreSQL MySQL 兼容性之 - bit 函数和操作符
bit 函数和操作符 MySQL & Bitwise AND << Left shift >> Shift right BIT_COUNT Returns the number of set bits ^ Bitwise XOR | Bitw
4065 0