Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

hanlp 能否加入一个远程词典更新的功能 #563

Closed
1 task done
zhaoxuan opened this issue Jun 20, 2017 · 17 comments
Closed
1 task done

hanlp 能否加入一个远程词典更新的功能 #563

zhaoxuan opened this issue Jun 20, 2017 · 17 comments
Labels

Comments

@zhaoxuan
Copy link

zhaoxuan commented Jun 20, 2017

注意事项

请确认下列注意事项:

  • 我已仔细阅读下列文档,都没有找到答案:
  • 我已经通过Googleissue区检索功能搜索了我的问题,也没有找到答案。
  • 我明白开源社区是出于兴趣爱好聚集起来的自由社区,不承担任何责任或义务。我会礼貌发言,向每一个帮助我的人表示感谢。
  • 我在此括号内输入x打钩,代表上述事项确认完毕。

版本号

当前最新版本号是:
我使用的版本是:

我的问题

我再使用 elasticsearch-ik的时候,发现这个远程更新的功能非常不错,也很简单,就是通过远程的一个 txt 文件,判断 ETag 是否更新,然后重新 reload 词典,我自己在使用的项目里面已经参考 ik 的机制,写了一个自动更新的功能。

BTW: CustomDictionary 里面能不能加入一个 reload 的功能,我用远程更新的时候需要重新加载这个词典。我本地测试了一个直接把 CustomDictionary.BinTrie = null,运行过了一段时间,好像没有对象过多的内存泄露,但是没有详细测试过。

@hankcs
Copy link
Owner

hankcs commented Jun 20, 2017

感谢建议,要reload的话,重新new一个com.hankcs.hanlp.dictionary.CustomDictionary#trie和com.hankcs.hanlp.dictionary.CustomDictionary#dat即可。

reload还可以通过动态加入来实现,com.hankcs.hanlp.dictionary.CustomDictionary#add(java.lang.String),比全部重新加载快太多了。

@hankcs
Copy link
Owner

hankcs commented Jun 20, 2017

我新增了一个reload接口,欢迎测试。

@zhaoxuan
Copy link
Author

对,我目前就是通过 com.hankcs.hanlp.dictionary.CustomDictionary#trie 重新赋值来完成的 reload,而且我用循环跑了一下,基本没有看见内存泄露,如果 trie 对象没有被其对象引用应该不会出大问题。HotUpdate 可以参考 ik 在 elasticsearch 里面的方式,用一个静态文件服务器,通过 etag 检查远程文件有没有变化,有变化后,就 reload。

@hankcs
Copy link
Owner

hankcs commented Jun 20, 2017

  1. 感谢建议
  2. HanLP的定位是一个核心的算法库,用来支撑上层应用
  3. 文件服务器等外围设施属于应用层,所以不会在算法库中实现
  4. 算法库提供所有必须的接口,如果有什么接口没有的话,欢迎来提建议

@hankcs hankcs added the help help needed label Jun 20, 2017
@zhaoxuan
Copy link
Author

谢谢回复
我并不是建议 HanLP 加入文件服务器,我表达可能不太清楚,我只是说加入一个 remote load 词典的方案,方便在不用重启应用的情况下,做到词典的更新。目前 HanLP 都是通过本地文件在启动时候一次加载,当然远程文件服务必须是使用者自己解决。

@hankcs
Copy link
Owner

hankcs commented Jun 21, 2017

那么最新提交的这个接口应该就是你想要的:dca825b

@zhaoxuan
Copy link
Author

谢谢,我去试试

@zhaoxuan
Copy link
Author

还有一个问题,com.hankcs.hanlp.dictionary.CustomDictionary#trie 和 dat 的区别在哪里?

@hankcs
Copy link
Owner

hankcs commented Jun 21, 2017

trie存的是词典文件词条,dat是代码动态插入的词条。前者效率比后者高很多。对热更新来讲,不需要处理dat。

@zhaoxuan
Copy link
Author

image

这里直接删掉了 bin 的文件,loadMainDictionary 会重新去读这个文件

image

@hankcs
Copy link
Owner

hankcs commented Jun 21, 2017

对,先删缓存,会自动生成的。

@zhaoxuan
Copy link
Author

image
但是我要的效果好些没达到
开始 攻城狮 分词分不出来
添加以后可以分出来了
reload 之后应该还是分不出来才对
我看 CustomDictionary.add 最后是把词条写入到 trie 里面

@hankcs
Copy link
Owner

hankcs commented Jun 21, 2017

这里的热更新的意思是重新加载词典。动态加入的词条不属于任何词典。如果你要清空动态词条,CustomDictionary.trie = new BinTrie<CoreDictionary.Attribute>();即可。

@zhaoxuan
Copy link
Author

恩,好的,我现在就是这么处理的

@zhongwenhui
Copy link

你好,如果程序想要实现一直调用HanLP.segment("XXXX");不中断,这时又必须更新CustomDictionary.txt,如何让segment()在reload()时读取旧.bin,reload()后读取新的.bin?

@cclient
Copy link

cclient commented May 7, 2018

抄ik代码,写了个加载远程词的 demo https://github.com/cclient/hanlp-remote-dict

@hankcs
Copy link
Owner

hankcs commented Jan 1, 2020

感谢您对HanLP1.x的支持,我一直为没有时间回复所有issue感到抱歉,希望您提的问题已经解决。或者,您可以从《自然语言处理入门》中找到答案。

时光飞逝,HanLP1.x感谢您的一路相伴。我于东部标准时间2019年12月31日发布了HanLP1.x在上一个十年最后一个版本,代号为最后的武士。此后1.x分支将提供稳定性维护,但不是未来开发的焦点。

值此2020新年之际,我很高兴地宣布,HanLP2.0发布了。HanLP2.0的愿景是下一个十年的前沿NLP技术。为此,HanLP2.0采用TensorFlow2.0实现了最前沿的深度学习模型,通过精心设计的框架支撑下游NLP任务,在海量语料库上取得了最前沿的准确率。作为第一个alpha版本,HanLP 2.0.0a0支持分词、词性标注、命名实体识别、依存句法分析、语义依存分析以及文本分类。而且,这些功能并不仅限中文,而是面向全人类语种设计。HanLP2.0提供许多预训练模型,而终端用户仅需两行代码即可部署,深度学习落地不再困难。更多详情,欢迎观看HanLP2.0的介绍视频,或参与论坛讨论

展望未来,HanLP2.0将集成1.x时代继承下来的高效率务实风范,同时冲刺前沿研究,做工业界和学术界的两栖战舰,请诸君继续多多指教,谢谢。

@hankcs hankcs closed this as completed Jan 1, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants