Java分词案例

wen java案例 2

本文目录导读:

Java分词案例

  1. HanLP分词案例
  2. Jieba分词案例
  3. 完整的分词工具类
  4. 实际应用案例
  5. 性能对比测试
  6. 使用建议

我来为您介绍几个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");
    }
}

使用建议

  1. HanLP:适合需要词性标注、命名实体识别等高级功能的场景
  2. Jieba:轻量级,适合简单的分词需求,性能较好
  3. 实际开发中:建议根据具体需求选择合适的分词工具,并做好性能测试

这些案例涵盖了Java分词的主要应用场景,您可以根据实际需求选择合适的实现方式。

抱歉,评论功能暂时关闭!