• java 支持分词的高性能拼音转换工具,速度是 pinyin4j 的两倍


    pinyin

    pinyin 是 java 实现的高性能中文拼音转换工具。

    变更日志

    创作目的

    想为 java 设计一款便捷易用的拼音工具。

    如何为 java 设计一款高性能的拼音转换工具 pinyin4j

    特性

    快速开始

    准备

    jdk 1.7+

    maven 引入

    <dependency>
        <groupId>com.github.houbb</groupId>
        <artifactId>pinyin</artifactId>
        <version>0.0.4</version>
    </dependency>
    

    快速开始

    参考 PinyinBsTest

    返回中文的拼音

    使用 PinyinHelper.toPinyin(string) 进行中文转换。

    String pinyin = PinyinHelper.toPinyin("我爱中文");
    Assert.assertEquals("wǒ ài zhōng wén", pinyin);
    

    返回多音字列表

    使用 PinyinHelper.toPinyin(char) 获取多音字的读音列表。

    List<String> pinyinList = PinyinHelper.toPinyin('重');
    Assert.assertEquals("[zhòng, chóng, tóng]", pinyinList.toString());
    

    分词特性

    默认支持中文分词,对用户透明。

    String pinyin = PinyinHelper.toPinyin("重庆火锅");
    Assert.assertEquals("chóng qìng huǒ guō", pinyin);
    
    String pinyin2 = PinyinHelper.toPinyin("分词也很重要");
    Assert.assertEquals("fēn cí yě hěn zhòng yào", pinyin2);
    

    指定拼音标注形式

    api

    /**
     * 转换为拼音
     * @param string 原始信息
     * @param styleEnum 样式枚举
     * @return 结果
     * @since 0.0.3
     */
    public static String toPinyin(final String string, final PinyinStyleEnum styleEnum)
    

    PinyinStyleEnum 样式枚举

    枚举 说明 例子
    DEFAULT 默认模式,拼音声调在韵母第一个字母上。 pīn yīn
    NORMAL 普通模式,即不带声调。 pin yin
    NUM_LAST 数字标注模式,即拼音声调以数字形式在各个拼音之后,用数字 1-5 进行表示。 pin1 yin1
    FIRST_LETTER 首字母模式,只返回拼音的首字母部分。 p y

    测试案例

    DEFAULT

    String pinyin = PinyinHelper.toPinyin("我爱中文", PinyinStyleEnum.DEFAULT);
    Assert.assertEquals("wǒ ài zhōng wén", pinyin);
    

    NORMAL

    String pinyin = PinyinHelper.toPinyin("我爱中文", PinyinStyleEnum.NORMAL);
    Assert.assertEquals("wo ai zhong wen", pinyin);
    

    NUM_LAST

    String pinyin = PinyinHelper.toPinyin("我爱中文", PinyinStyleEnum.NUM_LAST);
    Assert.assertEquals("wo3 ai4 zhong1 wen2", pinyin);
    

    FIRST_LETTER

    String pinyin = PinyinHelper.toPinyin("我爱中文", PinyinStyleEnum.FIRST_LETTER);
    Assert.assertEquals("w a z w", pinyin);
    

    后期 Road-Map

    • 支持中文繁简体

    默认关闭该功能

    • 拼音转汉字

    用户自定义相关

    • 用户自定义词组

    • 用户自定义分词

    benchmark

    测试代码见 BenchmarkTest.java

    性能对比时使用相同的机器,相同测试文本,验证相同的次数。

    均提前做好预热处理,可供参考。

    单个分词

    对比函数 对比次数 对比内容 耗时
    Pinyin4j toHanyuPinyinStringArray() 100w 次 相同文本随机选择一个字符 621 ms
    pinyin toPinyin() 100w 次 相同文本随机选择一个字符 317 ms

    字符串分词

    对比函数 对比次数 对比内容 耗时
    Pinyin4j toHanyuPinyinString() 1w 次 相同长文本 33002 ms
    pinyin toPinyin() 1w 次 相同长文本 17975 ms

    而且 Pinyin4j 的汉语字符串转换是不支持分词的,本项目在支持分词的情况下速度基本依然是 pinyin4j 的两倍。

    技术鸣谢

    pinyin-dataphrase-pinyin-data 提供的拼音数据。

    segment 提供的中文分词。

  • 相关阅读:
    编译JDK12
    Hexo Next背景动画Canvas_nest:true设置无效
    素数
    Linux 命令行样式
    四种排序算法实现
    Java中的简单容器
    一个关于2的次方问题
    LeetCode--20.有效的括号
    Java中的注释
    关于Metasploitable的测试
  • 原文地址:https://www.cnblogs.com/houbbBlogs/p/12210592.html
Copyright © 2020-2023  润新知