Coder Social home page Coder Social logo

tinypinyin's Introduction

TinyPinyin

Build Status

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

当前稳定版本:2.0.3

特性

  1. 生成的拼音不包含声调,均为大写;
  2. 支持自定义词典,支持简体中文、繁体中文;
  3. 执行效率很高(Pinyin4J的4~16倍);
  4. 很低的内存占用(不添加词典时小于30KB)。

原理介绍

打造最好的Java拼音库TinyPinyin(一):单字符转拼音的极致优化

打造最好的Java拼音库TinyPinyin(二):多音字快速处理方案

打造最好的Java拼音库TinyPinyin(三):API设计和测试实践

使用

汉字转拼音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<String, String[]> mapping() {
                    HashMap<String, String[]> map = new HashMap<String, String[]>();
                    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的问题

  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:

./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

  • 支持繁体中文
  • 支持姓氏拼音
  • 压缩词库
  • 词库生成工具

tinypinyin's People

Contributors

promeg avatar yaconggu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tinypinyin's Issues

拼音Table并不齐全

在Pinyin4j中有下面这项:
55EF(ng4,ng2,ng3,n2,n3,n4)
55EF 是汉字 的Unicode。
查字典发现 的拼音确实是 nng
而在TinyPinyin里的拼音Table里没有找到 n 这个拼音,同样也没有找到 r 这个拼音。
513F (er2,r2)
513F 是汉字 的Unicode。
于是我猜想你那个拼音Table应该是只取了Pinyin4j里 unicode_to_hanyu_pinyin.txt 这个文件所有汉字的第一个拼音对吧?

找不到pinyinhelper下的类

在2.0.3的版本中,获取不到需要用到的一些类,比如Pinyin类,无法正常使用,换成2.0.2是可以获取到的

多音字问题

比如 重庆,重量,要手动维护这样的多音字词典,
有没有打算支持这样的功能,输入 "重",直接返回 CHONG, ZHONG 这两个拼音?不再依赖外部维护的词典?

切换语言内存增长没有降下来

通过Android monitors观察 第一次切换语言后,内存值会增加4到5M左右,之后一直保持住这个值,降不下来。
public String getPingYin(String inputString) {
char [] charstring= inputString.toCharArray();
return Pinyin.toPinyin(charstring[0]);
}

每次切换语言都会调用此方法。

支持姓氏拼音

姓氏拼音常为单个汉字,目前的词典API无法解决此需求。

添加自定义词典未生效

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;
}
}));

添加自定义词典后, "重庆" 转拼音依旧是ZHONGQING , 项目里是要转重庆大学的, 我是用的
compile 'com.github.promeg:tinypinyin:2.0.3' 这个库

能不能把最小sdk支持的版本修改为15

能不能把最小sdk支持的版本修改为15啊,我项目最小支持到15,而这个库最小支持到16,所以集成的时候会出异常。
uses-sdk:minSdkVersion 15 cannot be smaller than version 16 declared in library [com.github.promeg:tinypinyin-lexicons-android-cncity:2.0.3] D:\JAVA\Android\android-sdk.android\build-cache\fbe05c90d838043a54f6908ddb63c8243e430c60\output\AndroidManifest.xml
Suggestion: use tools:overrideLibrary="com.github.promeg.tinypinyin.lexicons.android.cncity" to force usage
按照上面的异常提示在AndroidManifest.xml文件中增加

还会接着报下面的错
uses-sdk:minSdkVersion 15 cannot be smaller than version 16 declared in library [com.github.promeg:tinypinyin-android-asset-lexicons:2.0.3] D:\JAVA\Android\android-sdk.android\build-cache\1a7036887cb1482bd19c77ce20231d1febdd84e8\output\AndroidManifest.xml
Suggestion: use tools:overrideLibrary="com.github.promeg.tinypinyin.android.asset.lexicons" to force usage

一个是com.github.promeg.tinypinyin.lexicons.android.cncity
一个是com.github.promeg.tinypinyin.android.asset.lexicons
很抓狂,不知道要怎么处理,所以大神你能不能修改下支持到15

META-INF/maven/com.belerweb/pinyin4j/pom.xml

Android studio 3.2
META-INF/maven/com.belerweb/pinyin4j/pom.xml

添加了 无效

 exclude 'META-INF/maven/com.belerweb/pinyin4j/pom.properties'
        exclude 'META-INF/maven/com.belerweb/pinyin4j/pom.xml'

通过拼音获取备选词表

请问有什么方法可以通过输入拼音获取到对应的中文词语备选表,我在尝试实现这样的功能,求教。

Android Studio 用jdk 1.8编译提示下面错误

Error:Execution failed for task ':***:transformClassesWithPreJackPackagedLibrariesForDebug'.

com.android.sched.scheduler.RunnerProcessException: Error during 'ReachingDefinitions' runner on 'static void com.github.promeg.pinyinhelper.PinyinCode1.() (PinyinCode1.java:13-61)': Java heap space

build中启用了jack
jackOptions {
enabled true
}

新换了studio2.0,发现有几个新的编译错误

Information:Using javac 1.7.0_51 to compile java sources
Information:java: Errors occurred while compiling module 'lib'
Information:15-12-23 下午1:40 - Compilation completed with 8 errors and 0 warnings in 1s 148ms
/home/jingtao/git/TinyPinyin/lib/src/jmh/java/com/github/promeg/pinyinhelper/PinyinSampleBenchmark.java
Error:(4, 35) java: package org.openjdk.jmh.annotations does not exist
Error:(5, 32) java: package net.sourceforge.pinyin4j does not exist
Error:(14, 6) java: cannot find symbol
symbol: class Benchmark
location: class com.github.promeg.pinyinhelper.PinyinSampleBenchmark
Error:(19, 6) java: cannot find symbol
symbol: class Benchmark
location: class com.github.promeg.pinyinhelper.PinyinSampleBenchmark
Error:(24, 6) java: cannot find symbol
symbol: class Benchmark
location: class com.github.promeg.pinyinhelper.PinyinSampleBenchmark

拼音首字母

能否添加对返回字符串拼音首字母的支持?

java用的tinyPinyin报错

image

Pinyin.init(Pinyin.newConfig().with(CnCityDict.geInstance()));
这行报错,随后改为自定自定义字典依旧报错

Add Memory Cache Clear

can you provider a method that we can clear the memory cache.beause I just use jar at one place .after that , the memory is unuse.....#

能否把每个字的所有拼音都返回给使用者?

我看你们的介绍,每个字只能返回一个拼音给用户,对于多音字,只能通过词典匹配的方式判断判断一个拼音返回。
但是词典匹配方式显示是不够用的,1,用户没有足够的词典,2,分词难以保证正确性。
举个例子:美的传奇传,这里的多音字,怎么处理?

想问一下,遇到多音字,能不能让用户选择,可以直接把每个字的全部拼音(List)返回给用户?用户可以自己处理多音字的问题。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.