SpringBoot + HanLP 轻松搞定 Java 中的分词、文本推荐、语义提取等自然语言处理问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
hansonwang99
V2EX    程序员

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

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

    全新的 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
    关于     帮助文档     自助推广系统     博客   &bsp; API     FAQ     Solana     2380 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 15:40 PVG 23:40 LAX 08:40 JFK 11:40
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86