命名实体识别

本章将讲解HanLP中的命名实体识别功能。目前,命名实体识别是作为分词的一个后续过程而存在的。

中国人名识别

可以自动识别中国人名,标注为nr:

String[] testCase = new String[]{
    "签约仪式前,秦光荣、李纪恒、仇和等一同会见了参加签约的企业家。",
    "王国强、高峰、汪洋、张朝阳光着头、韩寒、小四",
    "张浩和胡健康复员回家了",
    "王总和小丽结婚了",
    "编剧邵钧林和稽道青说",
    "这里有关天培的有关事迹",
    "龚学平等领导,邓颖超生前",
    };
Segment segment = HanLP.newSegment().enableNameRecognize(true);
for (String sentence : testCase)
{
    List<Term> termList = segment.seg(sentence);
    System.out.println(termList);
}
  • 目前分词器基本上都默认开启了中国人名识别,比如HanLP.segment()接口中使用的分词器等等,用户不必手动开启;上面的代码只是为了强调。
  • 有一定的误命中率,比如误命中 关键年 ,则可以通过在 data/dictionary/person/nr.txt 加入一条 关键年 A 1 来排除关键年作为人名的可能性,也可以将 关键年 作为新词登记到自定义词典中。
  • 如果你通过上述办法解决了问题,欢迎向我提交pull request,词典也是宝贵的财富。
  • 算法详解 《实战HMM-Viterbi角色标注中国人名识别》

音译人名识别

可以自动识别音译人名,标注为nrf:

String[] testCase = new String[]{
            "一桶冰水当头倒下,微软的比尔盖茨、Facebook的扎克伯格跟桑德博格、亚马逊的贝索斯、苹果的库克全都不惜湿身入镜,这些硅谷的科技人,飞蛾扑火似地牺牲演出,其实全为了慈善。",
            "世界上最长的姓名是简森·乔伊·亚历山大·比基·卡利斯勒·达夫·埃利奥特·福克斯·伊维鲁莫·马尔尼·梅尔斯·帕特森·汤普森·华莱士·普雷斯顿。",
    };
Segment segment = HanLP.newSegment().enableTranslatedNameRecognize(true);
for (String sentence : testCase)
{
    List<Term> termList = segment.seg(sentence);
    System.out.println(termList);
}

日本人名识别

可以自动识别日本人名,标注为nrj:

String[] testCase = new String[]{
    "北川景子参演了林诣彬导演的《速度与激情3》",
    "林志玲亮相网友:确定不是波多野结衣?",
};
Segment segment = HanLP.newSegment().enableJapaneseNameRecognize(true);
for (String sentence : testCase)
{
    List<Term> termList = segment.seg(sentence);
    System.out.println(termList);
}

地名识别

可以自动识别地名,标注为ns:

String[] testCase = new String[]{
    "武胜县新学乡政府大楼门前锣鼓喧天",
    "蓝翔给宁夏固原市彭阳县红河镇黑牛沟村捐赠了挖掘机",
};
Segment segment = HanLP.newSegment().enablePlaceRecognize(true);
for (String sentence : testCase)
{
    List<Term> termList = segment.seg(sentence);
    System.out.println(termList);
}
  • 目前标准分词器都默认关闭了地名识别,用户需要手动开启;这是因为消耗性能,其实多数地名都收录在核心词典和用户自定义词典中。
  • 在生产环境中,能靠词典解决的问题就靠词典解决,这是最高效稳定的方法。
  • 算法详解 《实战HMM-Viterbi角色标注地名识别》

机构名识别

可以自动识别机构名,标注为nt:

String[] testCase = new String[]{
        "我在上海林原科技有限公司兼职工作,",
        "同时在上海外国语大学日本文化经济学院学习经济与外语。",
        "我经常在台川喜宴餐厅吃饭,",
        "偶尔去地中海影城看电影。",
};
Segment segment = HanLP.newSegment().enableOrganizationRecognize(true);
for (String sentence : testCase)
{
    List<Term> termList = segment.seg(sentence);
    System.out.println(termList);
}
  • 目前分词器默认关闭了机构名识别,用户需要手动开启;这是因为消耗性能,其实常用机构名都收录在核心词典和用户自定义词典中。
  • HanLP的目的不是演示动态识别,在生产环境中,能靠词典解决的问题就靠词典解决,这是最高效稳定的方法。
  • 算法详解 《层叠HMM-Viterbi角色标注模型下的机构名识别》