自然语言处理工具包 HanLP 在 Spring Boot 中的应用

本贴最后更新于 2243 天前,其中的信息可能已经事过景迁

全新的 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 目录下的模型、字典等数据来满足特定需求,因此还是十分强大的。


后 记

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



长按扫描 下面的 小心心 来订阅作者公众号 CodeSheep,获取更多 务实、能看懂、可复现的 原创文 ↓↓↓

CodeSheep · 程序羊


  • HanLP
    1 引用
  • 自然语言处理

    自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。

    18 引用 • 10 回帖 • 2 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    943 引用 • 1460 回帖 • 3 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...