热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

TinyPinyin适用于Java和Android的快速、低内存占用的汉字转拼音库。特性生成的拼音不包含声调,均为大写;支持自定义词典,支

TinyPinyin

68747470733a2f2f6170692e62696e747261792e636f6d2f7061636b616765732f70726f6d65672f6d6176656e2f74696e7970696e79696e2f696d616765732f646f776e6c6f61642e73766768747470733a2f2f7472617669732d63692e6f72672f70726f6d65472f54696e7950696e79696e2e7376673f6272616e63683d6d6173746572

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

特性

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

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

执行效率很高(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 :lib:jmhFixed

生成的报告在 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’时&#xff0c;额外消耗约43KB内存。

Todo

支持繁体中文

支持姓氏拼音

压缩词库

词库生成工具



推荐阅读
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
author-avatar
陈珍贵263483
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有