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

重新加载停用词(热更新) #1158

Closed
1 task done
Sean-SJ opened this issue Apr 23, 2019 · 1 comment
Closed
1 task done

重新加载停用词(热更新) #1158

Sean-SJ opened this issue Apr 23, 2019 · 1 comment

Comments

@Sean-SJ
Copy link

Sean-SJ commented Apr 23, 2019

注意事项

请确认下列注意事项:

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

版本号

当前最新版本号是:1.7.3
我使用的版本是:hanlp-1.7.2

我的问题

在变更自定义停用词典stopwords.txt文件后,在不重新启动程序的情况下,无法自动加载更新,亦无手动更新的操作。
即使手动删除stopwords.txt.bin缓存文件,
在之后的操作中(如:提取关键词HanLP.extractKeyword( )),也不会触发stopwords.txt的重新载入。

issue:1136 中了解到 自定义词典 有reload()的方法 可以手动 重新载入 自定义词典

复现问题

步骤

(不适用此issue)

触发代码

(不适用此issue)

期望输出

被追加到stopwords.txt文件中的词,不再出现在“提取关键词”的结果中

实际输出

与 “变更stopwords.txt文件”之前的结果一样

其他信息

目前为了实现“手动重新载入stopword”之目的,
查看了CoreStopWordDictionary类的静态代码块,仿照着

在需要 reload 停用词典 的地方,如下操作:

try
{
    // 反射:
    // 1. 获取到CoreStopWordDictionary中非public的dictionary成员变量
    // 2. 再变更其 可请问权限
    Field dictionaryField = CoreStopWordDictionary.class.getDeclaredField("dictionary");
    dictionaryFiled.setAccessible(true);

    // 3. 重新创建一个StopWordDictionary对象,调用其 save()方法,并替换旧的StopWordDictionary对象
    StopWordDictionary dictionary = new StopWordDictionary(HanLP.Config.CoreStopWordDictionaryPath);
    DataOutputStream out = new DataOutputStream(new BufferedOutputStream(IOUtil.newOutputStream(HanLP.Config.CoreStopWordDictionaryPath + Predefine.BIN_EXT)));
    dictionary.save(out);

    dictionaryFiled.set(dictionaryField, dictionary);
    out.close();
}
catch (Exception e)
{
    // 
}

显然,这样做十分不优雅。希望能在官方的版本能加入“手动重新载入 停用词典”的功能。

相关 issue: #28#32

动画演示:https://i.loli.net/2019/04/23/5cbf2741654a3.gif
说明:如图的Demo,循环地提取一段文本的关键词。(来源:百度百科的github词条)

初始:提取到“代码”一词;

将其添加到stopword.txt中,Ctrl+S保存,重启程序,未生效。
删除stopword.txt.bin之后,重启程序,已生效。(结论①:如同Readme.md所言,“如果你修改了任何词典,只有删除缓存才能生效”)

再 添加“概念”一词,不重启程序,输出仍有此词,
删除了 3个*.txt.bin文件(未重启程序),输出仍有此词。(结论②:stopword 不能热更新 加载)

StopWord.gif

hankcs added a commit that referenced this issue Apr 27, 2019
@hankcs hankcs closed this as completed in c74ef77 Apr 27, 2019
@hankcs
Copy link
Owner

hankcs commented Apr 27, 2019

感谢反馈,已经修复,请参考上面的commit。
如果还有问题,欢迎重开issue。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants