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 提供的中文分词。

java 支持分词的高性能拼音转换工具,速度是 pinyin4j 的两倍的更多相关文章

  1. 微软拼音转换工具类ChnCharInfo.dll

    1.简介 之前做汉字转拼音是使用各种枚举的方式,将各种情况列举,这种方式出错的机率很大,经常对不上号.(如果你想了解更多:http://www.cnblogs.com/islands/articles ...

  2. java开发常用的日期格式转换工具类

    package com.ydtf.ipcc.sms.util; import java.sql.Timestamp; import java.text.SimpleDateFormat; import ...

  3. Java对象、Json、Xml转换工具Jackson使用

    在Java项目中將一个对象转换成一段Json格式的字符串是非常常见的,能够实现这种需求的工具包也比较多,例如Gson.JSON-lib.Jackson等等.本文主要介绍Jackson的使用,Jacks ...

  4. JSON Bean 相互转换工具(效率是Gson的两倍以上)

    本帖最后由 xuehuayous 于 2015-12-24 08:44 编辑 前几天想封装一个自定义控件,用到Json解析,以前都使用Gson来解析Json数据的,但是想到一个简单的自定义控件就没必要 ...

  5. 【Java】字节数组转换工具类

    import org.apache.commons.lang.ArrayUtils; import java.nio.charset.Charset; /** * 字节数组转换工具类 */ publi ...

  6. jsonUtils&&Json、Xml转换工具Jackson使用

    1.jsonUtils package com.icil.utils; import java.util.List; import com.fasterxml.jackson.core.JsonPro ...

  7. Java-汉字繁体拼音转换

    import com.github.stuxuhai.jpinyin.ChineseHelper; import com.github.stuxuhai.jpinyin.PinyinFormat; i ...

  8. 汉语言处理工具pyhanlp的拼音转换与字符正则化

    汉字转拼音 HanLP中的汉字转拼音功能也十分的强大. 说明: l HanLP不仅支持基础的汉字转拼音,还支持声母.韵母.音调.音标和输入法首字母首声母功能. l HanLP能够识别多音字,也能给繁体 ...

  9. 使用 js 实现一个中文自动转换成拼音的工具库

    使用 js 实现一个中文自动转换成拼音的工具库 中文 => zhong-wen 应用场景 SEO 友好, URL 自动转换 blogs 发布文章,自动化部署,自动生成 url 的 path (时 ...

随机推荐

  1. [转]在ASP.NET WebAPI 中使用缓存【Redis】

    初步看了下CacheCow与OutputCache,感觉还是CacheOutput比较符合自己的要求,使用也很简单 PM>Install-Package Strathweb.CacheOutpu ...

  2. linux进程唤醒的细节

    我们已展现的唤醒进程的样子比内核中真正发生的要简单. 当进程被唤醒时产生的真正动 作是被位于等待队列入口项的一个函数控制的. 缺省的唤醒函数[22]22设置进程为可运行的 状态, 并且可能地进行一个上 ...

  3. 【30.01%】【hdu 3397】Sequence operation

    Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...

  4. 【31.95%】【CF 714B】Filya and Homework

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  5. hihocoeder1384

    hihocoeder1384 算法竞赛进阶指南上的题目 我们肯定是吧最大值和最小值匹配,次大值和次小值匹配以此类推 首先,类似于区间覆盖的思想,我们对于一个\(L\),找到最大的满足条件的\(R\) ...

  6. js实现bind

    Function.prototype.bind=function(ctx,...lastArgs){ let self=this return (...laterArgs)=>self.appl ...

  7. 【2016常州一中夏令营Day1】

    Problem 1. suffix给定一个单词,如果该单词以 er. ly 或者 ing 后缀结尾,则删除该后缀(题目保证删除后缀后的单词长度不为 0),否则不进行任何操作.Input输入一行,包含一 ...

  8. 阿里云基于OSS的云上统一数据保护方案2.0正式发布

    近年来,随着越来越多的企业从传统经济向数字经济转型,云已经渐渐成为数据经济IT新常态.核心业务系统上云,云上的业务创新,这些都产生了大量的业务数据,这些数据也成为了企业最重要的资产.资源.阿里云基于O ...

  9. JDK源码那些事儿之浅析Thread上篇

    JAVA中多线程的操作对于初学者而言是比较难理解的,其实联想到底层操作系统时我们可能会稍微明白些,对于程序而言最终都是硬件上运行二进制指令,然而,这些又太过底层,今天来看一下JAVA中的线程,浅析JD ...

  10. WWDC2018 之 高性能 Auto Layout

    1. 关于 Auto Layout 的历史渊源 上世纪 90 年代,名叫 Cassowary的布局算法,通过将布局问题抽象成线性不等式,并分解成多个位置间的约束,解决了用户界面的布局问题. Apple ...