# TinyPinyin
[![Build Status](https://travis-ci.org/promeG/TinyPinyin.svg?branch=master)](https://travis-ci.org/promeG/TinyPinyin)
适用于Java和Android的快速、低内存占用的汉字转拼音库。
当前稳定版本:2.0.3
## 特性
1. 生成的拼音不包含声调,均为大写;
2. 支持自定义词典,支持简体中文、繁体中文;
3. 执行效率很高(Pinyin4J的4~16倍);
4. 很低的内存占用(不添加词典时小于30KB)。
## 原理介绍
[打造最好的Java拼音库TinyPinyin(一):单字符转拼音的极致优化](http://promeg.io/2017/03/18/tinypinyin-part-1/)
[打造最好的Java拼音库TinyPinyin(二):多音字快速处理方案](http://promeg.io/2017/03/20/tinypinyin-part-2/)
[打造最好的Java拼音库TinyPinyin(三):API设计和测试实践](http://promeg.io/2017/03/22/tinypinyin-part-3/)
## 使用
### 汉字转拼音API
```java
/**
* 如果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
```java
// 添加中文城市词典
Pinyin.init(Pinyin.newConfig().with(CnCityDict.getInstance());
// 添加自定义词典
Pinyin.init(Pinyin.newConfig()
.with(new PinyinMapDict() {
@Override
public Map<String, String[]> mapping() {
HashMap<String, String[]> map = new HashMap<String, String[]>();
map.put("重庆", new String[]{"CHONG", "QING"});
return map;
}
}));
```
### 添加到工程
```groovy
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的问题
1. Jar文件较大,205KB;
2. Pinyin4J的PinyinHelper.toHanyuPinyinStringArray 在第一次调用时耗时非常长(~2000ms);
3. 功能臃肿,许多情况下我们不需要声调、方言;
4. 无法添加自定义词典,进而无法有效处理多音字
5. 内存占用太高;
#### TinyPinyin特性
1. 转换后的结果**不**包含声调和方言;
2. 支持自定义词典,方便处理多音字;
3. 尽可能低的内存占用;
4. 比Pinyin4J更快的转换速度;
### 2\. Correctness
以Pinyin4J作为基准,确保对所有的字符(Character.MAX_VALUE ~ Character.MIN_VALUE),TinyPinyin与Pinyin4J有相同的返回结果。
(Pinyin4J采用无声调的输出,多音字取第一个拼音进行对比)
该部分请见PinyinTest.java
繁体中文的测试请见:PinyinTest.testToPinyin_traditional_chars()
采用以下命令运行test:
```groovy
./gradlew clean build :lib:test :tinypinyin-lexicons-android-cncity:test :tinypinyin-android-asset-lexicons:test :android-sample:connectedAndroidTest
```
### 3\. Effectiveness
#### 速度
使用[JMH](http://openjdk.java.net/projects/code-tools/jmh/)工具得到bechmark,对比TinyPinyin和Pinyin4J的运行速度。
具体测例请见lib/src/jmh/中的性能测试代码。
采用以下命令运行benchmark:
```groovy
./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
+ ~~支持繁体中文~~
+ 支持姓氏拼音
+ 压缩词库
+ 词库生成工具
没有合适的资源?快使用搜索试试~ 我知道了~
TinyPinyin.zip
共78个文件
java:33个
xml:11个
gradle:10个
需积分: 5 0 下载量 149 浏览量
2023-08-18
09:46:19
上传
评论
收藏 642KB ZIP 举报
温馨提示
TinyPinyin
资源推荐
资源详情
资源评论
收起资源包目录
TinyPinyin.zip (78个子文件)
TinyPinyin-master
gradle.properties 834B
gradle
wrapper
gradle-wrapper.jar 50KB
gradle-wrapper.properties 232B
publish-android-library.gradle 3KB
lib
src
jmh
java
com
github
promeg
pinyinhelper
BenchmarkUtils.java 2KB
PinyinDictBenchmark2.java 2KB
PinyinDictBenchmark1.java 924B
PinyinSampleBenchmark.java 2KB
test
java
com
github
promeg
pinyinhelper
PinyinTest.java 16KB
TraditionalCharSet.java 19KB
UtilsTest.java 2KB
PinyinMapDictTest.java 2KB
EngineTest.java 3KB
ForwardLongestSelectorTest.java 2KB
main
java
com
github
promeg
pinyinhelper
Utils.java 884B
PinyinMapDict.java 722B
PinyinCode1.java 40KB
PinyinCode3.java 40KB
Engine.java 4KB
PinyinRules.java 798B
SegmentationSelector.java 968B
PinyinData.java 4KB
PinyinDict.java 652B
ForwardLongestSelector.java 1KB
Pinyin.java 7KB
PinyinCode2.java 40KB
build.gradle 4KB
jmh-libs
tinypinyin-lexicons-java-cncity-2.0.0.jar 4KB
TinypinJmhDict-1.0.jar 432KB
.travis.yml 1KB
tinypinyin-lexicons-java-cncity
src
test
java
com
github
promeg
tinypinyin
lexicons
java
cncity
CnCityDictTest.java 2KB
main
resources
tinypinyin
cncity.txt 2KB
java
com
github
promeg
tinypinyin
lexicons
java
cncity
CnCityDict.java 2KB
build.gradle 3KB
.gitignore 7B
resources
cncity_fulllist.txt 45KB
LICENSE 11KB
gradlew.bat 2KB
build.gradle 1KB
settings.gradle 201B
azure-pipelines.yml 586B
gradlew 5KB
tinypinyin-android-asset-lexicons
src
androidTest
java
com
github
promeg
tinypinyin
android
asset
lexicons
ExampleInstrumentedTest.java 846B
main
java
com
github
promeg
tinypinyin
android
asset
lexicons
AndroidAssetDict.java 2KB
res
values
strings.xml 96B
AndroidManifest.xml 227B
proguard-rules.pro 668B
build.gradle 2KB
.gitignore 7B
tinypinyin-lexicons-android-cncity
src
androidTest
java
com
github
promeg
tinypinyin
lexicons
android
cncity
ExampleInstrumentedTest.java 847B
test
resources
cncity.txt 2KB
java
com
github
promeg
tinypinyin
lexicons
android
cncity
CnCityDictTest.java 2KB
TestApp.java 257B
main
assets
cncity.txt 2KB
java
com
github
promeg
tinypinyin
lexicons
android
cncity
CnCityDict.java 910B
res
values
strings.xml 97B
AndroidManifest.xml 228B
proguard-rules.pro 668B
build.gradle 3KB
.gitignore 7B
.gitignore 90B
android-sample
src
androidTest
java
com
github
promeg
tinypinyin
android_sample
MainActivityTest.java 887B
test
java
com
github
promeg
tinypinyin
android_sample
ExampleUnitTest.java 422B
main
java
com
github
promeg
tinypinyin
android_sample
MainActivity.java 712B
res
mipmap
ic_launcher.png 8KB
values
strings.xml 80B
layout
activity_main.xml 511B
AndroidManifest.xml 697B
proguard-rules.pro 668B
build.gradle 1KB
.gitignore 7B
README.md 5KB
config
quality-android.gradle 2KB
quality-java.gradle 759B
quality
findbugs
findbugs-filter.xml 305B
checkstyle
checkstyle.xml 7KB
suppressions.xml 2KB
pmd
pmd-ruleset.xml 364B
共 78 条
- 1
资源评论
hello_中年人
- 粉丝: 7
- 资源: 324
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- ModStartCMS v8.4.0 框架稳定性持续迭代,修复部分已知问题
- bleder 教室学校学生教育室办公室考试
- 人脸检测-使用OpenCV实现的动漫+漫画人脸检测算法-附项目源码-优质项目实战.zip
- 道路贴图,材质材料免费
- 人脸检测-基于OpenCV+Node.js+WebSockets实现的实时人脸检测应用-附项目源码-优质项目实战.zip
- 一些常见的MySQL死锁案例-mysql-deadlocks-master(源代码+案例+图解说明)
- UE4动画烘焙器-ue4.27
- 新建文件夹.zip
- 1103a2a791bbd96ea98021062e327495b1c422e32fb27e0c2d6404b1bd74b692.gif
- 同城相亲交友php小程序
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功