本文目录导读:

我来为您介绍几个Java分词的使用案例,主要使用HanLP和Jieba这两个流行的分词工具。
HanLP分词案例
依赖配置(Maven)
<dependency>
<groupId>com.hankcs</groupId>
<artifactId>hanlp</artifactId>
<version>portable-1.8.4</version>
</dependency>
基础分词示例
import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.seg.common.Term;
import com.hankcs.hanlp.tokenizer.NLPTokenizer;
import com.hankcs.hanlp.tokenizer.StandardTokenizer;
import java.util.List;
public class HanLPDemo {
public static void main(String[] args) {
String text = "我爱自然语言处理技术,Java编程很有趣";
// 1. 标准分词
System.out.println("标准分词:");
List<Term> termList = StandardTokenizer.segment(text);
for (Term term : termList) {
System.out.println(term.word + "/" + term.nature);
}
// 2. NLP分词(更准确,但速度较慢)
System.out.println("\nNLP分词:");
List<Term> nlpTerms = NLPTokenizer.segment(text);
for (Term term : nlpTerms) {
System.out.println(term.word + "/" + term.nature);
}
// 3. 快速获取分词结果
System.out.println("\n简洁分词结果:");
System.out.println(HanLP.segment(text));
}
}
Jieba分词案例
依赖配置(Maven)
<dependency>
<groupId>com.huaban</groupId>
<artifactId>jieba-analysis</artifactId>
<version>1.0.2</version>
</dependency>
基础分词示例
import com.huaban.analysis.jieba.JiebaSegmenter;
import com.huaban.analysis.jieba.SegToken;
import com.huaban.analysis.jieba.WordDictionary;
import java.io.*;
import java.util.List;
public class JiebaDemo {
public static void main(String[] args) {
JiebaSegmenter segmenter = new JiebaSegmenter();
String text = "我来到北京清华大学学习人工智能";
// 1. 精确模式
System.out.println("精确模式分词:");
List<SegToken> tokens = segmenter.process(text, JiebaSegmenter.SegMode.INDEX);
for (SegToken token : tokens) {
System.out.println(token.word + " (" + token.startOffset + "-" + token.endOffset + ")");
}
// 2. 搜索引擎模式
System.out.println("\n搜索引擎模式分词:");
List<SegToken> searchTokens = segmenter.process(text, JiebaSegmenter.SegMode.SEARCH);
for (SegToken token : searchTokens) {
System.out.println(token.word + " (" + token.startOffset + "-" + token.endOffset + ")");
}
}
}
完整的分词工具类
import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.seg.common.Term;
import com.hankcs.hanlp.tokenizer.NLPTokenizer;
import java.util.*;
import java.util.stream.Collectors;
public class ChineseTokenizerUtil {
/**
* 分词并获取词性
*/
public static List<WordWithPOS> segmentWithPOS(String text) {
List<Term> termList = NLPTokenizer.segment(text);
return termList.stream()
.map(term -> new WordWithPOS(term.word, term.nature.toString()))
.collect(Collectors.toList());
}
/**
* 获取关键词
*/
public static List<String> extractKeywords(String text, int topN) {
return HanLP.extractKeyword(text, topN);
}
/**
* 获取摘要
*/
public static List<String> extractSummary(String text, int sentenceCount) {
return HanLP.extractSummary(text, sentenceCount);
}
/**
* 去除停用词
*/
public static List<String> removeStopWords(String text, Set<String> stopWords) {
List<Term> termList = NLPTokenizer.segment(text);
return termList.stream()
.map(term -> term.word)
.filter(word -> !stopWords.contains(word))
.filter(word -> word.length() > 1) // 过滤单字
.collect(Collectors.toList());
}
// 内部类
public static class WordWithPOS {
private String word;
private String pos;
public WordWithPOS(String word, String pos) {
this.word = word;
this.pos = pos;
}
@Override
public String toString() {
return word + "/" + pos;
}
}
}
实际应用案例
文本分析示例
public class TextAnalysisDemo {
public static void main(String[] args) {
String text = "华为公司在深圳发布了最新款的Mate 60 Pro智能手机,"
+ "该产品搭载了麒麟9000S处理器,支持卫星通信功能。";
// 1. 分词并分析
System.out.println("=== 分词结果 ===");
List<ChineseTokenizerUtil.WordWithPOS> words =
ChineseTokenizerUtil.segmentWithPOS(text);
words.forEach(System.out::println);
// 2. 提取关键词
System.out.println("\n=== 关键词提取 ===");
List<String> keywords = ChineseTokenizerUtil.extractKeywords(text, 5);
keywords.forEach(System.out::println);
// 3. 提取摘要
System.out.println("\n=== 摘要提取 ===");
List<String> summary = ChineseTokenizerUtil.extractSummary(text, 2);
summary.forEach(System.out::println);
// 4. 自定义停用词过滤
System.out.println("\n=== 去停用词结果 ===");
Set<String> stopWords = new HashSet<>(Arrays.asList("的", "了", "在"));
List<String> filteredWords =
ChineseTokenizerUtil.removeStopWords(text, stopWords);
filteredWords.forEach(System.out::println);
}
}
性能对比测试
public class PerformanceTest {
public static void main(String[] args) {
String text = "自然语言处理是人工智能领域中的一个重要方向。";
int iterations = 10000;
// HanLP测试
long startTime = System.currentTimeMillis();
for (int i = 0; i < iterations; i++) {
HanLP.segment(text);
}
long hanlpTime = System.currentTimeMillis() - startTime;
System.out.println("HanLP 耗时:" + hanlpTime + "ms");
// Jieba测试
JiebaSegmenter segmenter = new JiebaSegmenter();
startTime = System.currentTimeMillis();
for (int i = 0; i < iterations; i++) {
segmenter.process(text, JiebaSegmenter.SegMode.INDEX);
}
long jiebaTime = System.currentTimeMillis() - startTime;
System.out.println("Jieba 耗时:" + jiebaTime + "ms");
}
}
使用建议
- HanLP:适合需要词性标注、命名实体识别等高级功能的场景
- Jieba:轻量级,适合简单的分词需求,性能较好
- 实际开发中:建议根据具体需求选择合适的分词工具,并做好性能测试
这些案例涵盖了Java分词的主要应用场景,您可以根据实际需求选择合适的实现方式。