TinyPinyin

适用于Java和Android的快速、低内存占用的汉字转拼音库。

当前稳定版本:2.0.3

特性

生成的拼音不包含声调,均为大写;

支持自定义词典,支持简体中文、繁体中文;

执行效率很高(Pinyin4J的4~16倍);

很低的内存占用(不添加词典时小于30KB)。

原理介绍

使用

汉字转拼音API

/**

* 如果c为汉字,则返回大写拼音;如果c不是汉字,则返回String.valueOf(c)

*/

String Pinyin.toPinyin(char c)

/**

* c为汉字,则返回true,否则返回false

*/

boolean Pinyin.isChinese(char c)

/**

* 将输入字符串转为拼音,转换过程中会使用之前设置的用户词典,以字符为单位插入分隔符

*/

String toPinyin(String str, String separator)

词典API

// 添加中文城市词典

Pinyin.init(Pinyin.newConfig().with(CnCityDict.getInstance());

// 添加自定义词典

Pinyin.init(Pinyin.newConfig()

.with(new PinyinMapDict() {

@Override

public Map mapping() {

HashMap map = new HashMap();

map.put("重庆", new String[]{"CHONG", "QING"});

return map;

}

}));

添加到工程

buildscript {

repositories {

jcenter()

}

dependencies {

compile 'com.github.promeg:tinypinyin:2.0.3' // TinyPinyin核心包,约80KB

compile 'com.github.promeg:tinypinyin-lexicons-android-cncity:2.0.3' // 可选,适用于Android的中国地区词典

compile 'com.github.promeg:tinypinyin-lexicons-java-cncity:2.0.3' // 可选,适用于Java的中国地区词典

}

}

详细说明

1. 设计目标

Pinyin4J的问题

Jar文件较大,205KB;

Pinyin4J的PinyinHelper.toHanyuPinyinStringArray 在第一次调用时耗时非常长(~2000ms);

功能臃肿,许多情况下我们不需要声调、方言;

无法添加自定义词典,进而无法有效处理多音字

内存占用太高;

TinyPinyin特性

转换后的结果不包含声调和方言;

支持自定义词典,方便处理多音字;

尽可能低的内存占用;

比Pinyin4J更快的转换速度;

2. Correctness

以Pinyin4J作为基准,确保对所有的字符(Character.MAX_VALUE ~ Character.MIN_VALUE),TinyPinyin与Pinyin4J有相同的返回结果。

(Pinyin4J采用无声调的输出,多音字取第一个拼音进行对比)

该部分请见PinyinTest.java

繁体中文的测试请见:PinyinTest.testToPinyin_traditional_chars()

采用以下命令运行test:

./gradlew clean build :lib:test :tinypinyin-lexicons-android-cncity:test :tinypinyin-android-asset-lexicons:test :android-sample:connectedAndroidTest

3. Effectiveness

速度

使用JMH工具得到bechmark,对比TinyPinyin和Pinyin4J的运行速度。

具体测例请见lib/src/jmh/中的性能测试代码。

采用以下命令运行benchmark:

./gradlew jmh

生成的报告在 pinyinhelper/build/reports/jmh/ 中。

性能测试结果简要说明:单个字符转拼音的速度是Pinyin4j的四倍,添加字典后字符串转拼音的速度是Pinyin4j的16倍。

详细测试结果:

Benchmark

Mode

Samples

Score

Unit

TinyPinyin_Init_With_Large_Dict(初始化大词典)

thrpt

200

66.131

ops/s

TinyPinyin_Init_With_Small_Dict(初始化小词典)

thrpt

200

35408.045

ops/s

TinyPinyin_StringToPinyin_With_Large_Dict(添加大词典后进行String转拼音)

thrpt

200

16.268

ops/ms

Pinyin4j_StringToPinyin(Pinyin4j的String转拼音)

thrpt

200

1.033

ops/ms

TinyPinyin_CharToPinyin(字符转拼音)

thrpt

200

14.285

ops/us

Pinyin4j_CharToPinyin(Pinyin4j的字符转拼音)

thrpt

200

4.460

ops/us

TinyPinyin_IsChinese(字符是否为汉字)

thrpt

200

15.552

ops/us

Pinyin4j_IsChinese(Pinyin4j的字符是否为汉字)

thrpt

200

4.432

ops/us

内存占用

1. 不添加词典时

3个static byte[7000] 存储所有汉字的拼音的低8位,占用7000 1 3 = 21KB 内存;

3个static byte[7000/8] 存储所有汉字的拼音的第9位(最高位),占用7000 / 8 1 3 = 3KB 内存;

一个String[408] 存储所有可能的拼音,占用 1.7KB 内存;

共占用 < 30KB.

2. 添加词典时

使用‘com.github.promeg:tinypinyin-lexicons-java-cncity:2.0.0’时,额外消耗约43KB内存。

Todo

支持繁体中文

支持姓氏拼音

压缩词库

词库生成工具

java 拼音_GitHub - promeG/TinyPinyin: 适用于Java和Android的快速、低内存占用的汉字转拼音库。...相关推荐

  1. java就_GitHub - IammyselfYBX/This_is_how_Java_should_be_learned: 《Java就应该这样学》

    Java就该这么学 说明 这里使用 centos7 的openjdk,不是Oracle的JDK yum search java|grep jdk yum install java-1.8.0-open ...

  2. java仪表盘_GitHub - Jensenczx/Dashboard: 通过Java实现的仪表盘

    #README ###JAVA Dashboard ####Support Type: 线性仪表 扇形仪表 圆形仪表 中间刻度仪表盘 Function: 表盘颜色设置 表盘尺寸大小 表盘单位显示 表盘 ...

  3. java录音机_GitHub - wylGeorge/RuphyRecorder: 基于Java的录音机(使用基于Rest API的页面操作,方便远程控制)...

    RuphyRecorder 配置文件src/main/resources/application.properties server.port=8080 download.passwd=123... ...

  4. java 扫描文件测试_适用于Java开发人员的微服务:安全测试和扫描

    java 扫描文件测试 1.简介 本教程的这一部分专门讨论安全性测试,将围绕被证明在软件开发领域(包括微服务 )中无价的测试策略进行总结. 尽管软件项目中的安全方面每天都变得越来越重要,但是令人惊讶的 ...

  5. java服务负载均衡_适用于Java开发人员的微服务:配置,服务发现和负载平衡

    java服务负载均衡 1.配置,服务发现和负载平衡–简介 我们正在缓慢但稳定地朝着准备好将微服务部署到生产中的方向发展. 在本教程的这一部分中,我们将讨论三个主要主题:配置,服务发现和负载平衡. 我们 ...

  6. 汉字转拼音,TinyPinyin、Pinyin4j与JPinyin哪个库更快

    1. 介绍 本文对TinyPinyin.Pinyin4j与JPinyin三个汉字转拼音库的用法.测试代码及转换的结果做一个简单的总结. TinyPinyin 适用于Java和Android的快速.低内 ...

  7. java 汉字转换为拼音

    需要引入pinyin4j  , 没有文件上传,pinyin4j 上传不上来 import java.io.UnsupportedEncodingException; import net.source ...

  8. java 判断汉字音调_Java中汉字转拼音pinyin4j用法实例分析

    本文实例讲述了Java中汉字转拼音pinyin4j用法.分享给大家供大家参考,具体如下: 汉字转换拼音在日常开发中是个很常见的问题.例如我们伟大的12306,在地名中输入"WH", ...

  9. java ee开发环境_设置Java EE 6开发环境

    java ee开发环境 本教程简要说明了如何设置典型的环境来开发基于Java EE 6的应用程序. 除了可以正常工作的Windows XP客户端具有足够的CPU能力和内存外,本教程没有其他先决条件. ...

最新文章

  1. 怎样测试运算放大器的输入失调电压?
  2. hihocoder #1055 : 刷油漆(树形dp)
  3. C#: 8.0 和 9.0 常用新特性
  4. Android 8.0 学习(12)---init.rc语法及解析过程总结
  5. SpringMVC框架搭建的步骤
  6. html两个字段自动相加,HTML_两个并列的div让其根据内容自动保持同等高度,我们看下下面这个问题:有左 - phpStudy...
  7. 解决gitlab关闭登录选项问题
  8. hibernate 一对多_为什么很多人不愿意用hibernate了?
  9. 蓝厂为什么着急推出vivo X23?只因vivo NEX叫好不叫座
  10. freeswitch呼叫系统
  11. 2022GPLT团体程序设计天梯赛L1-086 斯德哥尔摩火车上的题
  12. windows电脑防火墙关闭,一键系统防火墙关闭工具推荐
  13. 亚马逊云科技:云厂商做自研芯片的两个「选择」
  14. 喜剧院线电影《大夫我没病》在京开机
  15. can和could的用法_情态动词can和could用法详解
  16. 如何成为IC验证工程师?
  17. 太空旅行时代到了!马斯克载人飞船发射成功!
  18. oracle mapviewer 11g安装使用,Oracle MapViewer11g安装与部署
  19. Ubuntu Unable to run mksdcard SDK tool 解决办法
  20. kylin系统gcc编译报错fatal error:stadio.h: 没有那个文件或目录解决办法

热门文章

  1. px、em、rem、rpx 用法 与 区别
  2. QQ群、讨论组上传文件,由于网络原因上传失败?
  3. 高效的敏捷测试第四课 测试的团队协作
  4. 工作人员做好项目协调服务器,项目团队协作做好三件事
  5. 一文详解!你真的了解商业智能BI吗?
  6. poj--1625Censored!+AC自动机上的dp+大数
  7. 机器人运动控制-水下机器人
  8. 读书笔记丨《数据产品经理修炼手册:从零基础到大数据产品实践》丨DAY4
  9. amp;#9733;色盲悖论正解!
  10. 基于UWB的室内SDS_TWR测距算法优化和定位算法融合的研究