使用Hanlp加载大字典

原创 2015年11月17日 23:54:25

 问题


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

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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

基于hanLP的中文分词详解-MapReduce实现&自定义词典文件

用mapreduce实现中文分词

fudanNLP(fnlp)添加自定义字典

fnlp目前找到的接口方便的开源的NLP开源工具 StanfordNLP Hanlp FudanNLP NLTK LTP 由于StanfordNLP中文包配置较困难,使用fnlp做分词加语...

HanLP里使用DAT存取字典的方法

CoreBiGramTableDictionary.java和CoreDictionary.java结构思路 词典里文件的格式:wordA@wordB     frequency CoreBi...

Hanlp配置与使用

Hanlp配置与使用由于要写NLP大作业在知乎上看见了Hanlp这个汉语言处理包。https://github.com/hankcs/HanLP配置说明对我来说写的略微简单,在这里记录一下配置的过程。...

Java中文分词hanlp使用

HanLP介绍:http://hanlp.linrunsoft.com/ github地址:https://github.com/hankcs/HanLP 说明:使用hanlp实现分词、智能推荐、...

汉语言处理包Hanlp的使用

本来想通过python调用Java实现Hanlp的使用,参考文章:http://t.cn/RUrIF7z ##########python可以用easy_install安装一些软件#########...

菜鸟如何使用Hanlp

boss给了个做分词的任务,最开始想用的是结巴分词and正则表达式。后来发现结果并不好,需要一遍一遍筛选【第一个标准筛选出80%的数据,然后制定第二个标准,继续筛选,然后制定第三个标准筛选,等等等等】...

使用HanLP配置文件经常消失

把备份hanlp.properties文件放在bin文件下即可

Lucene分词原理与方式

-------------------------------------------------------- lucene的分词_分词器的原理讲解 --------------------...

自定义Lucene分词器示例

集团的内部通讯工具搜同事时,需要根据姓名后缀进行搜索。譬如“徐欢春”,我们要能根据“欢春”搜出这个人;“黄继刚”,要根据“继刚”为关键字搜出“黄继刚”。这是个很人性化的用户体验,当我们有同事的名字是三...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用Hanlp加载大字典
举报原因:
原因补充:

(最多只允许输入30个字)