>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 22249 个阅读者 刷新本主题
 * 贴子主题:  java 支持分词的高性能拼音转换工具,速度是 pinyin4j 的两倍 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2020-01-27 13:52:52     消息  查看  搜索  好友  邮件  复制  引用

  

pinyin

pinyin 是 java 实现的高性能中文拼音转换工具。
  变更日志

创作目的

想为 java 设计一款便捷易用的拼音工具。

     如何为 java 设计一款高性能的拼音转换工具 pinyin4j

特性

  •   性能是 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-dataphrase-pinyin-data 提供的拼音数据。

     segment 提供的中文分词。



----------------------------
原文链接:https://blog.51cto.com/9250070/2467735
原作者:叶止水

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-01-28 17:34:51 重新编辑]
  Java面向对象编程-->内部类
  JavaWeb开发-->开发JavaMail Web应用
  JSP与Hibernate开发-->映射组成关系
  Java网络编程-->创建非阻塞的HTTP服务器
  精通Spring-->计算属性和数据监听
  Vue3开发-->通过Axios访问服务器
  类连接阶段的验证原理
  Java函数式接口和Stream流
  BIO、NIO和AIO的区别、三种IO的原理与用法
  序列化与反序列化知识点汇总
  Java如何遍历Enumeration
  面试问我,创建多少个线程合适?我该怎么说
  如何优雅地打印一个Java对象?
  Java设计模式:观察者模式
  Java入门实用代码:获取当前线程名称
  Java入门实用代码:获取远程文件大小
  Java入门实用代码:100以内整数求和运算
  Java入门实用代码:打印平行四边形
  Java入门实用代码:字符串替换
  Java程序代码优化技巧
  Java中用动态代理实现标准的DataSource数据源连接池
  更多...
 IPIP: 已设置保密
树形列表:   
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。