Skip to content

1.7.2 版本中 CustomDictionary.insert 对 NLPTokenizer 无效? #1143

@wenfeixiang1991

Description

@wenfeixiang1991

注意事项

请确认下列注意事项:

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

版本号

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

我的问题

  非常感谢这个项目,对NLP的理解深入了很多,我之前用的版本是1.6.4,基本只用了我认为最核心稳定的以统计模型(StandardTokenizer「ViterbiSegment」)为主,规则(CustomDictionary)为辅的中文分词服务。
  这样虽然高效、稳定,但随着遇到问题复杂性的提高,我逐渐发现已不能满足我nlp任务上一些需求,比如对未 insert 到 CustomDictionary 的「机构名」、「人名」识别较差,再比如没能好好利用到 parseDependency。
  在看到HanLP 公开了在线演示的1亿级语料训练的分词模型后,非常兴奋想要好好的利用起来。虽然我已经看过好几遍首页及wiki、FAQ、以及相关 issues,但可能由于基础较差,对 HanLP 的诸多「特性」理解不深,不知道该如何用好,总感觉各个功能间总是“鱼与熊掌不可兼得”。
  于是想在这里集中整理一下我的问题:

  1. 版本1.7.2 与 版本1.6.4,它们的默认 HanLP.segment(StandardTokenizer) 效果是一样的吗?它们都是基于98年人民日报标注语料的统计模型分词吗?
  2. HanLP.segment 分词结果中的“词性”(包括人名和地名)是怎么来?都是根据 CoreDictionary 和 CustomDictionary 中确定来的吗?所以这里并不涉及到 HMM、CRF 对吗?所以虽然一个词可能会有多个词性,但在 HanLP.segment 结果中每个词一定是一个固定的词性?
  3. 版本1.7.2 利用亿级语料训练的分词模型只是应用到了 NLPTokenizer 上吗?parseDependency 也是基于这个语料吗?还是说 parseDependency 是基于 NLPTokenizer 的结果?
  4. “自定义词典在所有分词器中都有效”,但我发现 1.7.2 版本中利用 CustomDictionary.insert 后并未生效,但修改 dictionary/custom/机构名词典.txt 后确实会生效,相关代码在下面。
  5. 相同的句子在在线演示上与1.7.2版本的 NLPTokenizer 结果不同,相关代码在下面。

复现问题

步骤

  1. 首先……
  2. 然后……
  3. 接着……

触发代码

    public void testIssue1234() throws Exception
    {
        # 问题 4
        NLPTokenizer.ANALYZER.enableCustomDictionary(true);
        CustomDictionary.insert("钟正", "nr 1");
        CustomDictionary.insert("财新智库莫尼塔研究", "ntc 1");
        System.out.println(HanLP.segment("财新智库莫尼塔研究董事长、首席经济学家钟正生表示"));
        System.out.println(NLPTokenizer.analyze("财新智库莫尼塔研究董事长、首席经济学家钟正生表示"));

        # 问题 5
        NLPTokenizer.ANALYZER.enableCustomDictionary(false);
        // 注意观察下面两个“希望”的词性、两个“晚霞”的词性
        System.out.println(NLPTokenizer.analyze("支援臺灣正體香港繁體:微软公司於1975年3月1日由比爾·蓋茲和保羅·艾倫創立。"));

    }

期望输出

# 问题 4
# 此部分我理解 “钟/n, 正生/v” 的切分方式
[财新智库莫尼塔研究/ntc, 董事长/nnt, 、/w, 首席/n, 经济学家/nnt, 钟/n, 正生/v, 表示/v]
# 此部分应该是“财新智库莫尼塔研究/ntc” 和 “[钟/n, 正生/v]/nr”
财新智库莫尼塔研究/ntc 董事长/nnt 、/w 首席/n 经济学家/n [钟/n, 正生/v]/nr 表示/v

# 问题 5
# “比爾·蓋茲” 应该是 nr
支援/v [臺灣/ns 正體/n 香港/ns 繁體/n]/nt :/w [微软/nt 公司/n]/nt 於/p 1975年/t 3月/t 1日/t 由/p 比爾·蓋茲/nr 和/c 保羅·艾倫/nr 創立/v 。/w

实际输出

# 问题 4
# 此部分没问题
[财新智库莫尼塔研究/ntc, 董事长/nnt, 、/w, 首席/n, 经济学家/nnt, 钟/n, 正生/v, 表示/v]
# 此部分 CustomDictionary.insert 后对 NLPTokenizer 未生效, 而且为什么“董事长”词性是 n 而不是 nnt?而且为什么不是“[钟/n, 正生/v]/nr”
[财新/j 智库/n 莫尼塔/n 研究/vn 董事长/n]/nt 、/w 首席/n 经济学家/n 钟正生/nr 表示/v

# 问题 5
# 注意 “比爾·蓋茲/nz”
支援/v [臺灣/ns 正體/n 香港/ns 繁體/n]/nt :/w [微软/nt 公司/n]/nt 於/p 1975年/t 3月/t 1日/t 由/p 比爾·蓋茲/nz 和/c 保羅·艾倫/nr 創立/v 。/w

而在线演示中是正确的 nr

其他信息

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions