# pinyin
**Repository Path**: houbinbin/pinyin
## Basic Information
- **Project Name**: pinyin
- **Description**: The high performance pinyin tool for java.(java 高性能中文转拼音工具。支持同音字。)
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 1
- **Created**: 2020-07-30
- **Last Updated**: 2025-02-25
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# pinyin
[pinyin](https://github.com/houbb/pinyin) 是 java 实现的高性能中文拼音转换工具。
[](https://travis-ci.com/houbb/pinyin)
[](http://mvnrepository.com/artifact/com.github.houbb/pinyin)
[](https://github.com/houbb/pinyin/blob/master/LICENSE.txt)
[](https://github.com/houbb/nlp-common)
> [变更日志](https://github.com/houbb/pinyin/blob/master/CHANGELOG.md)
## 创作目的
想为 java 设计一款便捷易用的拼音工具。
[如何为 java 设计一款高性能的拼音转换工具 pinyin4j](https://houbb.github.io/2020/01/09/how-to-design-pinyin4j)
## 特性
- [性能是 pinyin4j 的两倍](#benchmark)
- 极简的 api 设计
- 支持转换长文本
- 支持多音字
- 支持多种拼音标注方式
- 支持中文分词
- 支持中文繁简体
- 支持自定义拼音词库
- 支持判断是否为同音字
- 支持单独获取声调信息
- 支持获取声母韵母信息
### v0.1.2 新特性
- 支持指定拼音连接符号
# 快速开始
## 准备
jdk 1.7+
## maven 引入
```xml
com.github.houbb
pinyin
0.1.2
```
## 快速开始
参考 [PinyinHelperTest](https://github.com/houbb/pinyin/blob/master/src/test/java/com/github/houbb/pinyin/test/util/PinyinHelperTest.java)
### 返回中文的拼音
使用 `PinyinHelper.toPinyin(string)` 进行中文转换。
```java
String pinyin = PinyinHelper.toPinyin("我爱中文");
Assert.assertEquals("wǒ ài zhōng wén", pinyin);
```
### 返回多音字列表
使用 `PinyinHelper.toPinyinList(char)` 获取多音字的读音列表。
```java
List pinyinList = PinyinHelper.toPinyinList('重');
Assert.assertEquals("[zhòng, chóng, tóng]", pinyinList.toString());
```
### 分词特性
默认支持中文分词,对用户透明。
```java
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
```java
/**
* 转换为拼音
* @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
```java
String pinyin = PinyinHelper.toPinyin("我爱中文", PinyinStyleEnum.DEFAULT);
Assert.assertEquals("wǒ ài zhōng wén", pinyin);
```
### NORMAL
```java
String pinyin = PinyinHelper.toPinyin("我爱中文", PinyinStyleEnum.NORMAL);
Assert.assertEquals("wo ai zhong wen", pinyin);
```
### NUM_LAST
```java
String pinyin = PinyinHelper.toPinyin("我爱中文", PinyinStyleEnum.NUM_LAST);
Assert.assertEquals("wo3 ai4 zhong1 wen2", pinyin);
```
### FIRST_LETTER
```java
String pinyin = PinyinHelper.toPinyin("我爱中文", PinyinStyleEnum.FIRST_LETTER);
Assert.assertEquals("w a z w", pinyin);
```
### 指定连接符号
有时候使用者希望指定特定的连接符号。
```java
final String text = "我爱中文";
Assert.assertEquals("wazw", PinyinHelper.toPinyin(text, PinyinStyleEnum.FIRST_LETTER, StringUtil.EMPTY));
```
第三个参数用于指定一个非 null 的字符串作为拼音连接符号。 (默认是空格进行连接)
# 更多特性
## 是否为同音字
`PinyinHelper.hasSamePinyin()` 用来判断两个汉字是否为同音字,包括对多音字的处理。
```java
char one = '花';
char two = '重';
char three = '中';
char four = '虫';
Assert.assertFalse(PinyinHelper.hasSamePinyin(one, three));
Assert.assertTrue(PinyinHelper.hasSamePinyin(two, three));
Assert.assertTrue(PinyinHelper.hasSamePinyin(two, four));
```
## 支持繁体中文
本框架支持繁体中文获取对应拼音。
当然你也可以使用 [opencc4j](https://github.com/houbb/opencc4j) 统一转换为简体再做拼音获取,从而提高准确率。
```java
String pinyin = PinyinHelper.toPinyin("奮斗");
Assert.assertEquals("fèn dòu", pinyin);
```
# 自定义拼音词库
已有的词库很难满足各种各样的场景,本工具提供自定义拼音词库的功能。
## 自定义单个字的拼音
### 自定义字典
自定义 `resources/pinyin_dict_char_define.txt` 文件内容,格式如下:
```
莪:wǒ
噯:ài,āi,ǎi
```
汉字与拼音使用英文`:` 分割,多音字使用英文`,`做拼音的分割。
### 测试
```java
String pinyin = PinyinHelper.toPinyin("莪");
Assert.assertEquals("wǒ", pinyin);
```
## 自定义词组的拼音
### 自定义字典
自定义 `resources/pinyin_dict_phrase_define.txt` 文件内容,格式如下:
```
褈慶炎鍋:chóng qìng huǒ guō
```
### 测试
以一串火星文为例。
```java
String pinyin = PinyinHelper.toPinyin("莪噯褈慶炎鍋");
Assert.assertEquals("wǒ ài chóng qìng huǒ guō", pinyin);
```
## 注意点
1. 仅支持汉语的自定义拼音。
2. 为了保持功能的一致性,如果你自定义的是繁体字(词),对应的简体也会变成自定义注音。
# 后期 Road-Map
- 同音字列表返回
- 谐音字判断
- 谐音字列表返回
- 拼音转汉字
# Benchmark
测试代码见 [BenchmarkTest.java](https://github.com/houbb/pinyin/blob/master/src/test/java/com/github/houbb/pinyin/test/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](https://github.com/mozillazg/pinyin-data) 与 [phrase-pinyin-data](https://github.com/mozillazg/phrase-pinyin-data) 提供的拼音数据。
[segment](https://github.com/houbb/segment) 提供的中文分词。