HanLP自然语言处理包初步安装与使用

        HanLP是由一系列模型与算法组成的Java工具包,目标是促进自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。

        HanLP能提供以下功能:关键词提取、短语提取、繁体转简体、简体转繁体、分词、词性标注、拼音转换、自动摘要、命名实体识别(地名、机构名等)、文本推荐等功能,详细请参见以下链接:http://www.hankcs.com/nlp/hanlp.html  

        HanLP下载地址:https://github.com/hankcs/HanLP/releases,HanLP项目主页:https://github.com/hankcs/HanLP

        1、HanLP安装

         hanlp是由jar包、properties文件和data数据模型组成,因此,在安装时,这三种文件都应该有。可以通过建立java工程即可运行。

         hanlp.properties文件中描述了不同词典的相对路径以及root根目录,因此,可以在此文件中修改其路径。

         hanlp-1.3.4.jar包中包含了各种算法及提取方法的api,大部分方法都是静态的,可以通过HanLP直接进行调用,因此,使用非常方便。

         data文件夹中包含了dictionary和model文件夹,dictionary中主要是各种类型的词典,model主要是分析模型,hanlp api中的算法需要使用model中的数据模型。

         2、HanLP的使用

         普通java工程目录如下所示:

  

           3、HanLP的具体使用

           例如:对excel中的聊天记录字段进行热点词的提取,计算并排序,功能如下所示

           package com.run.hanlp.demo;

import java.util.ArrayList;

import java.util.Collections;

import java.util.Comparator;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.Map.Entry;

import org.apache.log4j.Logger;

import com.hankcs.hanlp.HanLP;

import com.hankcs.hanlp.seg.common.Term;

import com.hankcs.hanlp.suggest.Suggester;

import com.hankcs.hanlp.summary.TextRankKeyword;

import com.hankcs.hanlp.tokenizer.NLPTokenizer;

import com.hankcs.hanlp.tokenizer.StandardTokenizer;

import com.run.util.ExcelUtil;

public class HanlpTest {

    public static final Logger log = Logger.getLogger(HanlpTest.class);

    public static void main(String[] args) {

        log.info("关键词提取:");

        HanlpTest.getWordAndFrequency();

    }

    

    /**

     * 获取所有关键词和频率

     */

    public static void getWordAndFrequency() {

        // String content =

        // "程序员(英文Programmer)是从事程序开发、维护的专业人员。一般将程序员分为程序设计人员和程序编码人员,但两者的界限并不非常清楚,特别是在中国。软件从业人员分为初级程序员、高级程序员、系统分析员和项目经理四大类。";

        List<Map<String, Integer>> content = ExcelUtil.readExcelByField("i:/rundata/excelinput",5000,5);

        Map<String, Integer> allKeyWords=new HashMap<>();

        for(int i=0;i<content.size();i++){

            Map<String, Integer> oneMap=content.get(i);

            for(String str:oneMap.keySet()){

                int count = oneMap.get(str);

                CombinerKeyNum(str,count,allKeyWords);

            }

        }

        List<Map.Entry<String,Integer>> sortedMap=sortMapByValue(allKeyWords);

        log.info(sortedMap);

    }

    /**

     *

     * @param allKeyWords 需要进行排序的map

     * @return 返回排序后的list

     */

    public static List<Map.Entry<String,Integer>> sortMapByValue(Map<String,Integer> allKeyWords){

        List<Map.Entry<String,Integer>> sortList=new ArrayList<>(allKeyWords.entrySet());

        

        Collections.sort(sortList, new Comparator<Map.Entry<String, Integer>>() {   

            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {      

                return (o2.getValue() - o1.getValue());

            }

        });

        return sortList;

    }

    /**

     *

     * @param key 关键词变量

     * @param value 关键词词频变量

     * @param allKeyWords  存放关键词和词频的map

     */

    public static void CombinerKeyNum(String key,int value,Map<String,Integer> allKeyWords){

        if(allKeyWords.containsKey(key)){

            int count=allKeyWords.get(key);

            count+=value;

            allKeyWords.put(key, count);

        }else{

            allKeyWords.put(key, value);

        }

    }

    /**

     *

     * @param content 需要提取关键词的字符串变量

     * @return 返回关键词以及关键词词频数的map

     *

     */

    public static HashMap<String, Integer> getKeyWordMap(String content) {

        List<Term> list = StandardTokenizer.SEGMENT.seg(content);

        TextRankKeyword textmap = new TextRankKeyword();

        Map<String, Float> map = textmap.getTermAndRank(content);

        Map<String, Integer> mapCount = new HashMap<>();

        for (String str : map.keySet()) {

            String keyStr = str;

            int count = 0;

            for (int i = 0; i < list.size(); i++) {

                if (keyStr.equals(list.get(i).word)) {

                    count++;

                }

            }

            mapCount.put(keyStr, Integer.valueOf(count));

        }

//        log.info(mapCount);

        return (HashMap<String, Integer>) mapCount;

    }

}

运行之后,结果如下:

 由此可见,可以看见从excel中提取出来的热点词汇及其频率。

文章来源于计算机之wind的博客

原文链接:http://blog.51cto.com/13993767/2295803

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C语言及其他语言

C语言中的宏陷阱 #define SQU(x) x*x

有同学写过或者想写这样的宏定义吗? 求两个或几个数的乘积: #define SQU(x) x*x 我们正常使用没有问题: ? 但如果这样写呢? ? 哎呀,...

3775
来自专栏小樱的经验随笔

设计模式六大原则(5):迪米特法则

定义:一个对象应该对其他对象保持最少的了解。 问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。 解决方案:尽量降低类与...

3156
来自专栏java工会

深度思考编程的艺术

1758
来自专栏mathor

HDOJ1257最少拦截系统

 这个题一开始我百思不得其解,后来看了一眼别人的题解标题,最长上升子序列?我当时还纳闷,这和最长上升子序列有什么关系,后来仔细一想还确实是。因为导弹拦截系统...

872
来自专栏牛客网

深信服一面C++

Linux中创建共享内存的方式?共享内存中起始地址是不是按照页的大小对齐?创建共享内存的时候物理页一定分配吗?惰性空间分配的实现方式?

1342
来自专栏测试开发架构之路

C语言程序设计50例(二)(经典收藏)

【程序11】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月    后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总...

45610
来自专栏每日一篇技术文章

Swift3.0 - 注释

1542
来自专栏写代码的海盗

SEO是件贼有意思的事情 golang入坑系列

这两天迷上了SEO。真心看不起百度的竞价排名,但作为一个商业网站,赚钱是一件无可厚非的事情。只做活雷锋,没有大金主是做不长的。做完功课后,发现百度和google...

2975
来自专栏微信公众号:Java团长

超详细:常用的设计模式汇总

简单点说,就是一个应用程序中,某个类的实例对象只有一个,你没有办法去new,因为构造器是被private修饰的,一般通过getInstance()的方法来获取它...

701
来自专栏程序员的诗和远方

20181013_ARTS_week16

这题没好好审题,题目中说不能增加其它空间,以及要在原数组中改,没注意最后只要前 n 位是无重复的就可以了。

943

扫码关注云+社区

领取腾讯云代金券