pinyin4j 生成 首字母片語組合 多音字片語組合
阿新 • • 發佈:2018-12-11
目標:片語漢字轉拼音首字母組合 (包含多音字)
pinyin4j 有些漢字是多音字會生成多個拼音,首先需要去重;取首字母;然後取組合
一個詞組裡面建議不要有超過20個多音字;最好多音字5個左右;
如果多音字過多,會產生 翻倍 集合,導致記憶體洩漏;
如果多音字過多,建議把集合裡面的 String 換成 StringBuilder;以後有時間在優化
/** * 漢字轉換位漢語拼音首字母 * 英文字元不變,特殊字元丟失 支援多音字 * 生成方式如(長沙市長:cssc,zssz,zssc,cssz) */ public static String converterToFirstSpell(String chines) throws Exception { if (StringUtils.isBlank(chines)) { return null; } // 打散字串 char[] ziCharArray = chines.toCharArray(); // 拼音集合 List<List<String>> list = new ArrayList<List<String>>(); for (int i = 0; i < ziCharArray.length; i++) { // 128 ASCII碼 可見字元 char c = ziCharArray[i]; if (c > 128) { List<String> result = duoYinZi(c); list.add(result); } else { List<String> result = new ArrayList<String>(); result.add(String.valueOf(ziCharArray[i])); list.add(result); } } String result = parseTheChineseByObject(list); return result; } private static String parseTheChineseByObject(List<List<String>> list) { Set<String> result = new HashSet<String>(); if (CollectionUtils.isNotEmpty(list)) { result.addAll(list.get(0)); } for (int i = 1; i < list.size(); i++) { Set<String> compositePYTemp = new HashSet<String>(); for (String pinyinFast : result) { for (String c : list.get(i)) { String str = pinyinFast + c; compositePYTemp.add(str); } } result = compositePYTemp; } StringBuilder sb = new StringBuilder(); if (CollectionUtils.isNotEmpty(result)) { for (String str : result) { sb.append(str).append(","); } sb.deleteCharAt(sb.length() - 1); } return sb.toString(); } public static List<String> duoYinZi(char zi) throws Exception { List<String> pinyinName = new ArrayList<String>(); HanyuPinyinOutputFormat config = new HanyuPinyinOutputFormat(); // 小寫 config.setCaseType(HanyuPinyinCaseType.LOWERCASE); // 沒有音調數字 config.setToneType(HanyuPinyinToneType.WITHOUT_TONE); // 取得當前漢字的所有全拼 String[] pyArray = PinyinHelper.toHanyuPinyinStringArray(zi, config); if (pyArray != null && pyArray.length > 0) { for (int pyIndex = 0; pyIndex < pyArray.length; pyIndex++) { // 取首字母 char fast = pyArray[pyIndex].charAt(0); int index = pinyinName.indexOf(String.valueOf(fast)); if (index < 0) { pinyinName.add(String.valueOf(fast)); } } } return pinyinName; }
@Test
public void test12() throws Exception {
String str = "長沙市長";
String t = Pinyin4jUtil.converterToFirstSpell(str);
System.out.println("--->"+t);
}
// 結果
--->zssc,cssz,zssz,cssc