Java实现汉字拼音转换和关键字分词(pinyin4j、hanlp)

文章目录

pinyin4j

  1. 添加maven依赖
yml 复制代码
<dependency>
    <groupId>com.belerweb</groupId>
    <artifactId>pinyin4j</artifactId>
    <version>2.5.0</version>
</dependency>
  1. 获取文本拼音
java 复制代码
 /**
  * 获取文本拼音
  * @param context 文本内容
  * @param existNotPinyin 是否保存非汉字
  * @return String 拼音
  */
private String pinyinTest(String context, boolean existNotPinyin) {
     if (context == null || context.trim().length() <= 0) {
         return null;
     }
     //设置格式
     HanyuPinyinOutputFormat outputFormat = new HanyuPinyinOutputFormat();
     //WITHOUT_TONE 不带音标、WITH_TONE_NUMBER 带数字音标、WITH_TONE_MARK 带符号音标
     outputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
     char[] chars = context.trim().toCharArray();
     StringBuilder builder = new StringBuilder();
     try {
         for (char aChar : chars) {
             String[] pinyin = PinyinHelper.toHanyuPinyinStringArray(aChar, outputFormat);
             //不是汉字会返回null
             if (pinyin == null || pinyin.length <= 0) {
                 if (existNotPinyin) {
                     builder.append(aChar);
                 }
                 continue;
             }
             //多音字的情况取第一个(也可以全取)
             builder.append(pinyin[0]);
         }
     } catch (BadHanyuPinyinOutputFormatCombination e) {
         e.printStackTrace();
     }
     return builder.toString().toUpperCase();
 }
  1. 测试用例
java 复制代码
@Test
public void test() {
    String temp = "我爱罗52";
    String list = pinyinTest(temp, false); //WOAILUO
}

hanlp

  1. 添加Maven依赖
yml 复制代码
<dependency>
    <groupId>com.hankcs</groupId>
    <artifactId>hanlp</artifactId>
    <version>portable-1.8.4</version>
</dependency>
  1. 获取文本拼音
java 复制代码
 /**
  * 获取文本拼音
  * @param context 文本内容
  * @param existNotPinyin 是否保存非汉字
  * @return String 拼音
  */
private String hanLpTest(String content, Boolean existNotPinyin) {
	if (context == null || context.trim().length() <= 0) {
         return null;
     }
    if (existNotPinyin) {
        return HanLP.convertToPinyinString(content, "", false).toUpperCase();
    }
    List<Pinyin> pinyinList = HanLP.convertToPinyinList(content);
    StringBuilder builder = new StringBuilder();
    pinyinList.forEach(pinyin -> {
        if (pinyin == null || Pinyin.none5.equals(pinyin)) {
            return;
        }
        builder.append(pinyin.getPinyinWithoutTone());
    });
    return builder.toString().toUpperCase();
}
  1. 测试用例
java 复制代码
@Test
public void test() {
    String temp = "我爱罗52";
    System.out.println(hanLpTest(temp, true)); //WOAILUO52
}

关键字分词

  1. 正则表达式
java 复制代码
/**
 * 分词正则表达式
 */
private final String SPLIT_WORD_REG_EX = "[^aoeiuv]?h?[iuv]?(ai|ei|ao|ou|er|ang?|eng?|ong|a|o|e|i|u|ng|n)?";
  1. 获取分词结果
java 复制代码
/**
 * 关键字分词
 * @param keyword 关键字
 * @return List<String> 分词列表
 */
private List<String> splitTest(String keyword) {
	if (context == null || context.trim().length() <= 0) {
         return Collections.emptyList();
     }
    List<String> keywordList = new ArrayList<>();
    int index = 0;
    Pattern pat = Pattern.compile(SPLIT_WORD_REG_EX);
    for (int i = keyword.length(); i > 0; i = i - index) {
        Matcher matcher = pat.matcher(keyword);
        if (!matcher.find()) {
            break;
        }
        keywordList.add(matcher.group());
        index = matcher.end() - matcher.start();
        keyword = keyword.substring(index);
    }
    return keywordList;
}
  1. 测试用例
java 复制代码
 @Test
 public void test() {
     String temp = "我爱罗52";
     List<String> list = splitTest(temp);
     System.out.println(list); //[我, 爱, 罗, 5, 2]
 }
相关推荐
Patrick在香港7 小时前
Python Docker镜像从1.2GB到89MB:多阶段构建的完整优化实录
java·python·docker·信息可视化·容器·数据分析·ai编程
上海安当技术7 小时前
敏感数据怎么防拖库?信封加密(DEK+KEK 二层密钥)架构设计与 Java 实战
java·开发语言·python
我是唐青枫7 小时前
Java JCommander 实战详解:用注解解析命令行参数
java·开发语言
大鹏说大话7 小时前
C++ 内存布局详解:类、虚函数、虚表底层原理
java·开发语言
还是鼠鼠7 小时前
Spring AI连接DeepSeek与通义千问:application.yaml配置详解
java·通义千问·spring ai·deepseek
计算机小白一个8 小时前
蓝桥杯 Java B 组之哈希表应用(两数之和、重复元素判断)
java·数据结构·算法·蓝桥杯
sunburn-10 小时前
Java 队列全面详解:从入门到面试实战
java·开发语言·汇编·ide·idea
vx-程序开发10 小时前
springboot农产品运输服务平台---附源码75498
java·javascript·spring boot·python·eclipse·django·php
zzh___zzh11 小时前
SQL 窗口函数 ROW_NUMBER、RANK、DENSE_RANK 常用方法笔记
java
计科土狗11 小时前
GESP六级专题之类与对象
java·前端·数据库