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 提供的中文分詞。