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]
 }
相关推荐
Yz987614 分钟前
Hadoop里面MapReduce的序列化与Java序列化比较
java·大数据·jvm·hadoop·分布式·mapreduce·big data
凯哥Java16 分钟前
优化批处理流程:自定义BatchProcessorUtils的设计与应用
java·数据库·mysql
njnu@liyong24 分钟前
AOP-前置原理-怎么判断和拦截?
java·aop·拦截
末央&29 分钟前
【C++】内存管理
java·开发语言·c++
心之语歌42 分钟前
设计模式 享元模式(Flyweight Pattern)
java·设计模式·享元模式
MTingle43 分钟前
【Java EE】文件IO
java·java-ee
coffee_baby1 小时前
享元模式详解:解锁高效资源管理的终极武器
java·spring boot·mybatis·享元模式
爱学习的真真子1 小时前
菜鸟也能轻松上手的Java环境配置方法
java·开发语言
曳渔1 小时前
Java-数据结构-二叉树-习题(三)  ̄へ ̄
java·开发语言·数据结构·算法·链表
shark-chili1 小时前
数据结构与算法-Trie树添加与搜索
java·数据结构·算法·leetcode