java 支持分词的高性能拼音转换工具,速度是 pinyin4j 的两倍
pinyin
pinyin 是 java 实现的高性能中文拼音转换工具。
创作目的
想为 java 设计一款便捷易用的拼音工具。
如何为 java 设计一款高性能的拼音转换工具 pinyin4j
特性
极简的 api 设计
支持转换长文本
支持多音字
支持多种拼音标注方式
支持中文分词
快速开始
准备
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-data 与 phrase-pinyin-data 提供的拼音数据。
segment 提供的中文分词。
java 支持分词的高性能拼音转换工具,速度是 pinyin4j 的两倍的更多相关文章
- 微软拼音转换工具类ChnCharInfo.dll
1.简介 之前做汉字转拼音是使用各种枚举的方式,将各种情况列举,这种方式出错的机率很大,经常对不上号.(如果你想了解更多:http://www.cnblogs.com/islands/articles ...
- java开发常用的日期格式转换工具类
package com.ydtf.ipcc.sms.util; import java.sql.Timestamp; import java.text.SimpleDateFormat; import ...
- Java对象、Json、Xml转换工具Jackson使用
在Java项目中將一个对象转换成一段Json格式的字符串是非常常见的,能够实现这种需求的工具包也比较多,例如Gson.JSON-lib.Jackson等等.本文主要介绍Jackson的使用,Jacks ...
- JSON Bean 相互转换工具(效率是Gson的两倍以上)
本帖最后由 xuehuayous 于 2015-12-24 08:44 编辑 前几天想封装一个自定义控件,用到Json解析,以前都使用Gson来解析Json数据的,但是想到一个简单的自定义控件就没必要 ...
- 【Java】字节数组转换工具类
import org.apache.commons.lang.ArrayUtils; import java.nio.charset.Charset; /** * 字节数组转换工具类 */ publi ...
- jsonUtils&&Json、Xml转换工具Jackson使用
1.jsonUtils package com.icil.utils; import java.util.List; import com.fasterxml.jackson.core.JsonPro ...
- Java-汉字繁体拼音转换
import com.github.stuxuhai.jpinyin.ChineseHelper; import com.github.stuxuhai.jpinyin.PinyinFormat; i ...
- 汉语言处理工具pyhanlp的拼音转换与字符正则化
汉字转拼音 HanLP中的汉字转拼音功能也十分的强大. 说明: l HanLP不仅支持基础的汉字转拼音,还支持声母.韵母.音调.音标和输入法首字母首声母功能. l HanLP能够识别多音字,也能给繁体 ...
- 使用 js 实现一个中文自动转换成拼音的工具库
使用 js 实现一个中文自动转换成拼音的工具库 中文 => zhong-wen 应用场景 SEO 友好, URL 自动转换 blogs 发布文章,自动化部署,自动生成 url 的 path (时 ...
随机推荐
- CentOS7在防火墙与端口上的操作
https://jingyan.baidu.com/article/cdddd41cb3bf6c53cb00e1ac.html CentOS7在安装软件包或类库的时候,常常会因为防火墙的拦截和端口未开 ...
- java 网络编程Socket
TCP: 通过TCP协议传输,得到的是一个顺序的无差错的数据流. 发送方和接收方的成对的两个socket之间必须建立连接, 以便在TCP协议的基础上进行通信,当一个socket(通常都是server ...
- ESB总线的核心架构
根据近期对开源ESB产品的研究,已经对Oracle和Tibco的ESB总线产品的实施经验积累,对ESB总线的核心产品架构有了进一步的清晰认识,将ESB的核心架构整理为上图,上图中看到的内容也是做为一款 ...
- 使用iOSSelect.js实现iOS的select下拉选择日期的联动效果
引入文件: <link rel="stylesheet" href="/static/css/iosSelect.css"> <script ...
- ZeroNet搭建个人网站,一些搞笑图片
ZeroNet是一个利用比特币加密和BT技术提供不受审查的网络与通信的BT平台,ZeroNet网络功能已经得到完整的种子的支持和加密连接,保证用户通信和文件共享的安全.使用ZeroNet,你可以匿名上 ...
- linux 使用 ioctl 参数
在看 scull 驱动的 ioctl 代码之前, 我们需要涉及的另一点是如何使用这个额外的参数. 如果它是一个整数, 就容易: 它可以直接使用. 如果它是一个指针, 但是, 必须小心些. 当用一个指针 ...
- linux llseek 实现
llseek 方法实现了 lseek 和 llseek 系统调用. 我们已经说了如果 llseek 方法从设备 的操作中缺失, 内核中的缺省的实现进行移位通过修改 filp->f_pos, 这是 ...
- 【Bad Blood】翻译0
(一)作者注 本书基于对超过150人以上的上百个采访,包括60多个Theranos的职工而著成.叙述中出现的人物大多数都是他们的真实姓名,也有些人希望我隐藏身份信息,他们有些害怕公司的惩罚,有些担心会 ...
- Linux 内核 NuBus 总线
另一个有趣的, 但是几乎被忘记的, 接口总线是 NuBus. 它被发现于老的 Mac 计算机(那 些有 M68K CPU 家族的). 所有的这个总线是内存映射的(象 M68K 的所有东西), 并且设备 ...
- js简单实现promise
function myPromise(fn){ let status='pending',successCallback=[],failedCallback=[],data=null,reason=n ...