使用自然语言处工具HanLP获取人名

1.目的

需要将一句话中的所有人名抽出来,一句话是没有规律的,人员随机说的话

2.思路

没有规律,没法用正则表达式,所以我们用达到了自然语言HanLP来解决,此方法,识别率高,论效率来讲的话,标准分词会比较快,nlp分词要装分析模型,识别率比前者要好一点,但是速度较慢,且此法会有误判率

3.代码

    /**
     * 获取关联人姓名
     *
     * @param nameString 姓名字符串
     * @return 关联人姓名
     */
    private static List<String> getRelationName(String nameString) {
        List<String> standard = new ArrayList<>();
        List<String> tokenizer = new ArrayList<>();
        try {
            standard = standardParticiple(nameString);
            tokenizer = nlpTokenizer(nameString);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        standard.addAll(tokenizer);
        return standard.stream().distinct().collect(Collectors.toList());
    }


    /**
     * 标准分词
     *
     * @param nameString 要分析的字符串
     * @return 人名
     */
    private static List<String> standardParticiple(String nameString) {
        List<Term> termList = HanLP.segment(nameString);
        System.out.println(termList);
        List<Term> collect = termList.stream().filter(x -> x.nature.equals(Nature.nr)).collect(Collectors.toList());
        return collect.stream().map(term -> term.word).collect(Collectors.toList());
    }

    /**
     * NLP分词
     *
     * @param nameString 要分析的字符串
     * @return 人名
     */
    private static List<String> nlpTokenizer(String nameString) {
        NLPTokenizer.ANALYZER.enableCustomDictionary(false);
        List<Term> termList = NLPTokenizer.segment(nameString);
        System.out.println(termList);
        List<Term> collect = termList.stream().filter(x -> x.nature.equals(Nature.nr)).collect(Collectors.toList());
        return collect.stream().map(term -> term.word).collect(Collectors.toList());
    }

4.测试

    public static void main(String[] args) {
        String nameString = "我们这边有李白,杜甫,辛弃疾,李贺,白居易等几个人,你快来救我们。";
        System.out.println(getRelationName(nameString));
    }

5.结果

[我们/r, 这边/r, 有/v, 李白/nr, ,/w, 杜甫/nr, ,/w, 辛弃疾/nr, ,/w, 李贺/nr, ,/w, 白居易/nr, 等/u, 几/m, 个/q, 人/n, ,/w, 你/r, 快来/d, 救/v, 我们/r, 。/w]
[我们/r, 这边/r, 有/v, 李白/nr, ,/w, 杜甫/nr, ,/w, 辛弃疾/nr, ,/w, 李贺/nr, ,/w, 白居易/nr, 等/u, 几个人/n, ,/w, 你/r, 快/d, 来/v, 救/v, 我们/r, 。/w]
[李白, 杜甫, 辛弃疾, 李贺, 白居易]

6.注意点

使用到了npl的话,就得装HanLp的模型库,将模型库data放到Resource下
在这里插入图片描述

7.data下载链接

https://od.hankcs.com/hanlp/data/data-for-1.7.5.zip

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
中文信息计算机自动理的研究已有几十年的 历史 , 但至今仍有许多技术难题没有得到很好解 决 , 中文姓名自动识别问题就是其中的一个。由于 它与中文文本的自动分词一样 , 属于中文信息理 的基础研究领域 , 因而它的研究成果直接影响到中 文信息的深层次研究。汉语的自身特点使得中文信 息自动理大多是先对要理的文本进行自动分词 (加入显式分割符) , 然后再在分词的基础上进行词 法、语法、语义等方面的深入分析。而在分词阶 段 , 文本中的人名、地名以及其它专有名词和生词 大多被切分成单字词 , 在这种情形下如不能很好地 解决汉语文本中专有名词生词的识别问题 , 将给其 后的汉语文本的深入分析带来难以逾越的障碍。中 文姓名的自动识别问题就是在这种背景下提出来 的。对这一问题的研究目前采用的技术中主要利用 以下几方面的信息: 姓名用字的频率信息、上下文 信息[1 ,2 ] 、语料库统计信息[2 ] 、词性信息等[3 ] 。本 文的方法是 , 首先对中文人名的构成、姓名用字的 规律及上下文文本信息特征进行充分分析 , 在此基 础上建立起两组规则集 , 将其作用于测试文本 , 获 得初步识别结果 , 再利用大规模语料库的统计信息 对初步识别结果进行概率筛选 , 设定合适的阈值 , 输出最终识别结果。经对 50 多万字的开放语料测 试 , 系统自动识别出 1781 个中文人名 , 在不同的 筛选阈值下获得 90 %以上的识别准确率 , 而召回 率高于 91 %。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值