HanLP-Java运行例子

  |  

摘要: 本文介绍 HanLP 的 Java 接口的使用方式,手动配置 data 目录和 hanlp.properties,使用 Maven 和 java 命令行两种方式引入 hanlp 的 jar 包。

【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】
我的网站:潮汐朝夕的生活实验室
我的公众号:算法题刷刷
我的知乎:潮汐朝夕
我的github:FennelDumplings
我的leetcode:FennelDumplings


在 Java 使用 HanLP 进行中文分词

本文使用的例子是用 HanLP 进行中文分词。代码比较简单,重点是项目的建立,以及编译运行的过程。

(1) 自行配置 jar、data、hanlp.properties

建立项目根目录 HanLP-chinese-segment,然后进入该目录。

建立目录,结构如下:

1
2
3
4
5
6
7
8
|---- data
|---- src
| |---- com
| | |---- czx
| | |---- MainTest.java
| |---- hanlp.properties
|---- libs
|---- hanlp-1.8.3.jar

其中 data 文件夹、hanlp-1.8.3.jar 文件、hanlp.properties 文件需要自行下载,下载链接:https://github.com/hankcs/HanLP/releases

如果通过 pip install pyhanlp 安装了 Python 版的 hanlp,则这三个文件已经在本地有了。执行以下命令即可

1
hanlp -v

结果如下:

1
2
3
jar  1.8.3: /home/ppp/anaconda3/envs/python-3.6/lib/python3.6/site-packages/pyhanlp/static/hanlp-1.8.3.jar
data 1.8.3: /home/ppp/anaconda3/envs/python-3.6/lib/python3.6/site-packages/pyhanlp/static/data
config : /home/ppp/anaconda3/envs/python-3.6/lib/python3.6/site-packages/pyhanlp/static/hanlp.properties

这三个恰好就是所需的 data 文件夹,hanlp-1.8.3.jar 文件,hanlp.properties。

其中 hanlp.properties 中最关键的一行如下,说明 data 文件夹所在的路径,其它内容可以不变。

1
root=/home/ppp/codes/java/HanLP-chinese-segment

MainTest.Java 中的源代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package com.czx;

import java.util.List;

import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.seg.common.Term;
import com.hankcs.hanlp.suggest.Suggester;
import com.hankcs.hanlp.tokenizer.NLPTokenizer;

public class MainTest {
public static void main(String[] args) {
System.out.println("首次编译运行时,HanLP会自动构建词典缓存,请稍候……\n");
// 第一次运行会有文件找不到的错误但不影响运行,缓存完成后就不会再有了
System.out.println("标准分词:");
System.out.println(HanLP.segment("你好,欢迎使用HanLP!"));
System.out.println();

List<Term> termList = NLPTokenizer.segment("中国科学院计算技术研究所的宗成庆教授正在教授自然语言处理课程");
System.out.println("NLP分词:");
System.out.println(termList);
System.out.println();

System.out.println("智能推荐:");
getSegement();
System.out.println();

System.out.println("关键字提取:");
getMainIdea();
System.out.println();

System.out.println("自动摘要:");
getZhaiYao();
System.out.println();

System.out.println("短语提取:");
getDuanYu();
}

/**
* 智能推荐部分
*/
public static void getSegement() {
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)); // 拼音
}


/**
* 关键字提取
*/
public static void getMainIdea() {
String content = "程序员(英文Programmer)是从事程序开发、维护的专业人员。一般将程序员分为程序设计人员和程序编码人员,但两者的界限并不非常清楚,特别是在中国。软件从业人员分为初级程序员、高级程序员、系统分析员和项目经理四大类。";
List<String> keywordList = HanLP.extractKeyword(content, 5);
System.out.println(keywordList);
}

/**
* 自动摘要
*/
public static void getZhaiYao() {
String document = "算法可大致分为基本算法、数据结构的算法、数论算法、计算几何的算法、图的算法、动态规划以及数值分析、加密算法、排序算法、检索算法、随机化算法、并行算法、厄米变形模型、随机森林算法。\n"
+ "算法可以宽泛的分为三类,\n" + "一,有限的确定性算法,这类算法在有限的一段时间内终止。他们可能要花很长时间来执行指定的任务,但仍将在一定的时间内终止。这类算法得出的结果常取决于输入值。\n"
+ "二,有限的非确定算法,这类算法在有限的时间内终止。而,对于一个(或一些)给定的数值,算法的结果并不是唯一的或确定的。\n"
+ "三,无限的算法,是那些由于没有定义终止定义条件,或定义的条件无法由输入的数据满足而不终止运行的算法。通常,无限算法的产生是由于未能确定的定义终止条件。";
List<String> sentenceList = HanLP.extractSummary(document, 3);
System.out.println(sentenceList);
}

/**
* 短语提取
*/
public static void getDuanYu() {
String text = "算法工程师\n"
+ "算法(Algorithm)是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。算法工程师就是利用算法处理事物的人。\n"
+ "\n" + "1职位简介\n" + "算法工程师是一个非常高端的职位;\n" + "专业要求:计算机、电子、通信、数学等相关专业;\n"
+ "学历要求:本科及其以上的学历,大多数是硕士学历及其以上;\n" + "语言要求:英语要求是熟练,基本上能阅读国外专业书刊;\n"
+ "必须掌握计算机相关知识,熟练使用仿真工具MATLAB等,必须会一门编程语言。\n" + "\n" + "2研究方向\n"
+ "视频算法工程师、图像处理算法工程师、音频算法工程师 通信基带算法工程师\n" + "\n" + "3目前国内外状况\n"
+ "目前国内从事算法研究的工程师不少,但是高级算法工程师却很少,是一个非常紧缺的专业工程师。算法工程师根据研究领域来分主要有音频/视频算法处理、图像技术方面的二维信息算法处理和通信物理层、雷达信号处理、生物医学信号处理等领域的一维信息算法处理。\n"
+ "在计算机音视频和图形图像技术等二维信息算法处理方面目前比较先进的视频处理算法:机器视觉成为此类算法研究的核心;另外还有2D转3D算法(2D-to-3D conversion),去隔行算法(de-interlacing),运动估计运动补偿算法(Motion estimation/Motion Compensation),去噪算法(Noise Reduction),缩放算法(scaling),锐化处理算法(Sharpness),超分辨率算法(Super Resolution),手势识别(gesture recognition),人脸识别(face recognition)。\n"
+ "在通信物理层等一维信息领域目前常用的算法:无线领域的RRM、RTT,传送领域的调制解调、信道均衡、信号检测、网络优化、信号分解等。\n" + "另外数据挖掘、互联网搜索算法也成为当今的热门方向。\n"
+ "算法工程师逐渐往人工智能方向发展。";
List<String> phraseList = HanLP.extractPhrase(text, 10);
System.out.println(phraseList);
}
}

到目录 HanLP-chinese-segment/src 下,执行以下编译命令:

1
javac -cp ../libs/hanlp-1.8.3.jar com/czx/MainTest.java

然后会生成文件 com/czx/MainTest.class,执行以下命令即可运行 MainTest。

1
java -cp .:/home/ppp/codes/java/HanLP-chinese-segment/libs/hanlp-1.8.3.jar com.czx.MainTest

结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
首次编译运行时,HanLP会自动构建词典缓存,请稍候……

标准分词:
[你好/vl, ,/w, 欢迎/v, 使用/v, HanLP/nx, !/w]

NLP分词:
[中国科学院计算技术研究所/nt, 的/u, 宗/q, 成庆/vn, 教授/n, 正在/d, 教授/v, 自然语言处理/nz, 课程/n]

智能推荐:
[威廉王子发表演说 呼吁保护野生动物]
[英报告说空气污染带来“公共健康危机”]
[《时代》年度人物最终入围名单出炉 普京马云入选]

关键字提取:
[程序员, 分为, 程序, 人员, 软件]

自动摘要:
[无限算法的产生是由于未能确定的定义终止条件, 这类算法在有限的时间内终止, 有限的非确定算法]

短语提取:
[算法工程师, 算法处理, 一维信息, 算法研究, 信息算法, 处理算法, 通信物理层, 视频算法, 互联网搜索算法, 人工智能方向]

(2) 使用 Maven 然后自行配置 data、hanlp.properties

目录结构如下

1
2
3
4
5
6
7
8
9
10
|---- data
|---- src
| |---- main
| | |---- java
| | | |---- com
| | | |---- czx
| | | |---- MainTest.java
| | |---- hanlp.properties
| |---- test
|---- pom.xml

其中 data 和 hanlp.properties 是从 hanlp -v 的结果中复制来的,pom.xml 中配置了 hanlp 对应的 jar 包,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>
<groupId>com.czx</groupId>
<artifactId>hanlp_segment</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>

<name>hanlp-segment</name>
<url>https://www.hanlp.com/</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.hankcs</groupId>
<artifactId>hanlp</artifactId>
<version>portable-1.8.3</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>10</source>
<target>10</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.czx.MainTest</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

src/main/java/com/czx/MainTest.java 中的代码与前面一模一样,然后编译运行。

1
2
mvn clean compile
mvn exec:java -Dexec.mainClass="com.czx.MainTest"

结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[INFO] Scanning for projects...
[INFO]
[INFO] -----------------------< com.czx:hanlp_segment >------------------------
[INFO] Building hanlp-segment 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- exec-maven-plugin:3.0.0:java (default-cli) @ hanlp_segment ---
首次编译运行时,HanLP会自动构建词典缓存,请稍候……

标准分词:
[你好/vl, ,/w, 欢迎/v, 使用/v, HanLP/nx, !/w]

NLP分词:
[中国科学院计算技术研究所/nt, 的/u, 宗/q, 成庆/vn, 教授/n, 正在/d, 教授/v, 自然语言处理/nz, 课程/n]

智能推荐:
[威廉王子发表演说 呼吁保护野生动物]
[英报告说空气污染带来“公共健康危机”]
[《时代》年度人物最终入围名单出炉 普京马云入选]

关键字提取:
[程序员, 程序, 分为, 人员, 软件]

自动摘要:
[无限算法的产生是由于未能确定的定义终止条件, 这类算法在有限的时间内终止, 有限的非确定算法]

短语提取:
[算法工程师, 算法处理, 一维信息, 算法研究, 信号处理, 信息算法, 通信物理层, 处理算法, 视频算法, 互联网搜索算法]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.642 s
[INFO] Finished at: 2022-05-31T22:49:00+08:00
[INFO] ------------------------------------------------------------------------

Share