V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
hansonwang99
V2EX  ›  程序员

SpringBoot + HanLP 轻松搞定 Java 中的分词、文本推荐、语义提取等自然语言处理问题

  •  
  •   hansonwang99 ·
    hansonwang99 · 2018-11-01 07:23:35 +08:00 · 9355 次点击
    这是一个创建于 2248 天前的主题,其中的信息可能已经有所发展或是发生改变。

    全新的 Mac Mini

    本文共 782 字,阅读大约需要 2 分钟 !


    概 述

    HanLP 是基于 Java 开发的 NLP 工具包,由一系列模型与算法组成,目标是普及自然语言处理在生产环境中的应用。而且 HanLP 具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点,因此十分好上手,本文就结合 Spring Boot 来将 HanLP 用起来!

    注: 本文首发于 My Personal Blog:CodeSheep·程序羊,欢迎光临 小站

    本文内容脑图如下:

    傲游浏览器截图 20181031233757.jpg


    下载 HanLP 数据和程序

    由于 HanLP 库将数据与代码分离,因此我们需要分别下载所需数据和 jar 包:


    工程搭建

    • 创建一个普通的 Spring Boot 工程,不赘述

    • 引入 HanLP 数据 和 配置

    下载完成以后,首先解压 hanlp-release.zip压缩包,然后将解压出的 HanLP 的 jar 包引入 Spring Boot 工程,然后需要来放置 HanLP 所需配置和数据:

    1. 将解压后 hanlp-release.zip压缩包中的 hanlp.properties配置文件置于项目的 resources资源目录下

    2. 然后解压 data.zip压缩包,将解压出的 data 目录同样至于 resources目录下( data 中的数据包很重要,是 HanLP 工作所需的词典和模型 )


    创建 IO 适配器

    HanLP 提供了 IO 适配器,用户可以实现其提供的 com.hankcs.hanlp.corpus.io.IIOAdapter 接口以在不同的平台( HDFS、Redis 等)上运行 HanLP,默认的 IO 适配器 IOAdapter = com.hankcs.hanlp.corpus.io.FileIOAdapter 是基于普通文件系统的。

    接下来我们重写一下 IOAdapter类,使用读写静态资源文件的方法来读取 HanLP 所需的词典和模型数据( 即 resources 目录下刚放置的 data 目录 )

    public class ResourceFileIoAdapter implements IIOAdapter {
        @Override
        public InputStream open(String path) throws IOException {
            ClassPathResource resource = new ClassPathResource( path );
            InputStream is = new FileInputStream( resource.getFile() );
            return is;
        }
    
        @Override
        public OutputStream create(String path) throws IOException {
            ClassPathResource resource = new ClassPathResource( path );
            OutputStream os = new FileOutputStream( resource.getFile() );
            return os;
        }
    }
    

    然后我们配置一下 HanLP 的配置文件 hanlp.properties,有两处需要改为以下配置:

    root=   // 我们不再需要这种指定 data 目录的方式
    IOAdapter=cn.codesheep.springbt_hanlp_userdefine.config.ResourceFileIoAdapter // 指定自定义的 IOAdapter
    

    好,现在项目就可以工作了,我们接下来写几个测试用例测试体验一把 !


    实验测试

    随便写几个例子来感受一番:

    • 分词功能
    @Test
    public void testSegment() {
    	System.out.println( HanLP.segment("www.codesheep.cn 是一个技术博客!") );
    }
    

    分词结果如下:

    [www/nx, ./w, codesheep/nx, ./w, cn/nx, 是 /vshi, 一个 /mq, 技术 /n, 博客 /n, !/w]
    

    每个词段后的 /nx/w之类的是 HanLP 定义的词性,可以去看 HanLP 的接口来获取详情

    • 文本推荐
    @Test
    public void testSuggest() {
        Suggester suggester = new Suggester();
        String[] titleArray =
                (
                        "威廉王子发表演说 呼吁保护野生动物\n" +
                                "《时代》年度人物最终入围名单出炉 普京马云入选\n" +
                                "“黑格比”横扫菲:菲吸取“海燕”经验及早疏散\n" +
                                "日本保密法将正式生效 日媒指其损害国民知情权\n" +
                                "人工智能如今是非常火热的一门技术”"
                ).split("\\n");
        for (String title : titleArray)
        {
            suggester.addSentence(title);
        }
    
        System.out.println(suggester.suggest("机器学习", 1));   // 语义
        System.out.println(suggester.suggest("危机公共", 1));   // 字符
        System.out.println(suggester.suggest("mayun", 1));     // 拼音
    }
    

    三个关键字的语句推荐结果为:

    机器学习  →  [人工智能如今是非常火热的一门技术”]
    危机公共  →  [威廉王子发表演说 呼吁保护野生动物]
    mayun     →  [《时代》年度人物最终入围名单出炉 普京马云入选]
    
    • 关键字提取
    @Test
    public void testKeyExtract() {
        String content = "苹果公司( Apple Inc. )是美国一家高科技公司。由史蒂夫·乔布斯、斯蒂夫·沃兹尼亚克和罗·韦恩(Ron Wayne)等人于 1976 年 4 月 1 日创立," +
                "并命名为美国苹果电脑公司( Apple Computer Inc. ),2007 年 1 月 9 日更名为苹果公司,总部位于加利福尼亚州的库比蒂诺。";
        List<String> keywordList = HanLP.extractKeyword(content, 5);
        System.out.println(keywordList);
    }
    

    提取结果为:

    [公司, 苹果, 美国, Inc, Apple]
    

    体验一番我们发现其自带的模型、字典等数据给出的实验效果已经是非常不错了,而且用户还可以自定义或修改 data 目录下的模型、字典等数据来满足特定需求,因此还是十分强大的。


    后 记

    由于能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流!



    8 条回复    2018-11-01 10:52:16 +08:00
    youngxhui
        1
    youngxhui  
       2018-11-01 07:58:32 +08:00 via Android
    目前正在做语言分析,也需要分词,先把这个库记下来,有时间对比一下和其他库。😂
    hansonwang99
        2
    hansonwang99  
    OP
       2018-11-01 08:08:16 +08:00 via iPhone
    @youngxhui 到时候也麻烦分享一下呢
    Le4fun
        3
    Le4fun  
       2018-11-01 08:46:55 +08:00
    感谢分享
    ryougifujino
        4
    ryougifujino  
       2018-11-01 08:52:35 +08:00 via Android
    hanlp 简繁转换的时候用过,台湾和香港繁体都有对应的吧本地化,感觉不错
    Sypher
        5
    Sypher  
       2018-11-01 09:15:43 +08:00
    感谢分享❤
    ke1e
        6
    ke1e  
       2018-11-01 09:40:15 +08:00 via Android
    感谢分享
    hansonwang99
        7
    hansonwang99  
    OP
       2018-11-01 09:42:32 +08:00
    也希望大佬们给出你们的用的库呀,一起分享才有成长呀
    zhaogaz
        8
    zhaogaz  
       2018-11-01 10:52:16 +08:00
    额,我旁边同事就在做 springboot+hanlp
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1341 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:38 · PVG 01:38 · LAX 09:38 · JFK 12:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.