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多实例魔改中 #1339

Closed
1 of 3 tasks
hankcs opened this issue Dec 5, 2019 · 10 comments
Closed
1 of 3 tasks

HanLP多实例魔改中 #1339

hankcs opened this issue Dec 5, 2019 · 10 comments
Labels

Comments

@hankcs
Copy link
Owner

hankcs commented Dec 5, 2019

由于早期设计局限,目前HanLP的CustomDictionaryCoreDictionaryCoreBiGramTableDictionary等都是静态资源类。而一些应用场景要求加载不同的词典,比如同一个JVM中不同用户实例,或者不同领域下加载不同的bigram模型。由于个人时间有限,这个功能让大家久等了。

现在,所有静态资源类正在逐步改造中。目前的进度如下:

  • CustomDictionary重构完毕

    • 如果你不需要多实例,无需任何改动,1.x保持前向兼容
    • 如果你需要多实例,可以为分词器segmentanalyzer创建一个新的DynamicCustomDictionary实例,并且调用该实例的insert方法。
      • segment.customDictionary = new DynamicCustomDictionary("词典1.txt", "词典2.txt")
      • 然后segment.customDictionary.insert
      • 参考demo
  • CoreDictionary重构中

  • CoreBiGramTableDictionary重构中

@hankcs
Copy link
Owner Author

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时代继承下来的高效率务实风范,同时冲刺前沿研究,做工业界和学术界的两栖战舰,请诸君继续多多指教,谢谢。

@hailiang-wang
Copy link
Contributor

感谢!这个功能很有必要。

这部分代码也开发结束了,在测试阶段?
经过查看还没有合并到 1.x 分支,请问是什么原因。

为了完成这个工作,接下来还需要做什么?

@hailiang-wang
Copy link
Contributor

另外,之前发布的版本中,维特比分词是支持自定义词典的路径,
#1197

而本任务的多实例支持独立的自定义词典,是针对于所有的分词器类型的,是这样的区别吧?

@hankcs
Copy link
Owner Author

hankcs commented Jul 1, 2020

感谢!这个功能很有必要。

这部分代码也开发结束了,在测试阶段?
经过查看还没有合并到 1.x 分支,请问是什么原因。

为了完成这个工作,接下来还需要做什么?

这部分代码经过测试没有问题。恰好赶在2.0发布前夕,所以终止了。没有合并的原因主要是,独立词典改变了之前的API设置,而需要此功能的用户占比较少。如果要合并这个补丁,我希望在不影响旧API的情况下,单独设立一个DynamicCustomDictioanry的类,保留CustomDictionary.insert接口。

@hankcs
Copy link
Owner Author

hankcs commented Jul 1, 2020

另外,之前发布的版本中,维特比分词是支持自定义词典的路径,
#1197

而本任务的多实例支持独立的自定义词典,是针对于所有的分词器类型的,是这样的区别吧?

是的,维特比分词与其他分词器拥有共同基类Segment,这项功能本来就应该做到基类里面去。

@hankcs
Copy link
Owner Author

hankcs commented Jan 31, 2021

我提交了完全兼容旧API的DynamicCustomDictionary到1.x分支中。今后CoreDictionary也应该按这个思路改造,但是实在没有时间。有需求的朋友,请自行参考上述补丁改造,欢迎提交补丁,毕竟这是一个开源项目。

@hxtkyne
Copy link

hxtkyne commented May 8, 2021

StandardTokenizer = JClass("com.hankcs.hanlp.tokenizer.StandardTokenizer")()
DynamicCustomDictionary = JClass("com.hankcs.hanlp.dictionary.DynamicCustomDictionary")
myDictionary = DynamicCustomDictionary("data/dictionary/custom/CustomDictionary.txt") # 生成一个实例
StandardTokenizer.SEGMENT.enableCustomDictionary(myDictionary)
StandardTokenizer.SEGMENT.customDictionary.insert("专有名词")
ret = StandardTokenizer.segment("一个心眼儿") # 按道理,这个是能够被区分为一个词的,因为在CustomDictionary.txt进行了配置,但是我做了下实验,分成了两个词
@hankcs 我用你给的demo方式进行动态配置,但是发现没有生效,你知道可能的问题是什么原因吗?感谢

@XhstormR
Copy link

XhstormR commented Feb 20, 2022

多实例功能挺有用的

@zzllkk2003
Copy link

@hankcs

我下了最新的1.x 分支里的代码。

把DemoCustomDictionary 的代码改成如下

String text = "攻城狮逆袭单身狗,迎娶白富美,走上人生巅峰"; // 怎么可能噗哈哈!

    // 系统默认的词典
    DynamicCustomDictionary dictionary = CustomDictionary.DEFAULT;
    // 每个分词器都有一份词典,默认公用 CustomDictionary.DEFAULT,你可以为任何分词器指定一份不同的词典
    DynamicCustomDictionary myDictionary = new DynamicCustomDictionary("/Users/kx/data-for-1.7.5/data/dictionary/custom/CustomDictionary2.txt");
    StandardTokenizer.SEGMENT.enableCustomDictionary(myDictionary);
    StandardTokenizer.SEGMENT.enableCustomDictionary(true);
    StandardTokenizer.SEGMENT.enableCustomDictionaryForcing(true);
    StandardTokenizer.SEGMENT.customDictionary.insert("插入到该分词器专用的词典中");
    System.out.println(StandardTokenizer.SEGMENT.seg(text));
    System.out.println(StandardTokenizer.segment(text));

--------CustomDictionary2 文件内容仅一行,开始------
攻城狮 kx
--------CustomDictionary2 文件内容仅一行,结束-------

期望运行出来的结果是
[攻城狮/kx, 逆袭/nz, 单身/n, 狗/n, ,/w, 迎娶/v, 白富美/nr, ,/w, 走上/v, 人生/n, 巅峰/n]

实际运行出来的是
[攻城/vi, 狮/ng, 逆袭/nz, 单身/n, 狗/n, ,/w, 迎娶/v, 白富美/nr, ,/w, 走上/v, 人生/n, 巅峰/n]

似乎多实例模式下,使用 DynamicCustomDictionary+ StandardTokenizer 并不起作用

@hxtkyne
Copy link

hxtkyne commented Mar 22, 2023 via email

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

5 participants