使用Pinyin4j進(jìn)行拼音分詞的方法
使用maven引入相關(guān)的jar
<dependency> <groupId>com.belerweb</groupId> <artifactId>pinyin4j</artifactId> <version>2.5.1</version> </dependency>
創(chuàng)建Pinyin4jUtil
package com.os.core.util.solr; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import java.util.Map; /** * 漢語(yǔ)拼音工具類 * Created by PengSongHe on 2017/2/9 0009. */ public class Pinyin4jUtil { public static void main(String[] args) { String str = "測(cè)試"; String pinyin = Pinyin4jUtil.converterToSpell(str); System.out.println(str + " pin yin :" + pinyin); pinyin = Pinyin4jUtil.converterToFirstSpell(str); System.out.println(str + " short pin yin :" + pinyin); } /** * 漢字轉(zhuǎn)換位漢語(yǔ)拼音首字母,英文字符不變,特殊字符丟失 支持多音字,生成方式如(長(zhǎng)沙市長(zhǎng):cssc,zssz,zssc,cssz) * * @param chines 漢字 * @return 拼音 */ public static String converterToFirstSpell(String chines) { StringBuffer pinyinName = new StringBuffer(); char[] nameChar = chines.toCharArray(); HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat(); defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); for (int i = 0; i < nameChar.length; i++) { if (nameChar[i] > 128) { try { // 取得當(dāng)前漢字的所有全拼 String[] strs = PinyinHelper.toHanyuPinyinStringArray( nameChar[i], defaultFormat); if (strs != null) { for (int j = 0; j < strs.length; j++) { // 取首字母 pinyinName.append(strs[j].charAt(0)); if (j != strs.length - 1) { pinyinName.append(","); } } } // else { // pinyinName.append(nameChar[i]); // } } catch (BadHanyuPinyinOutputFormatCombination e) { e.printStackTrace(); } } else { pinyinName.append(nameChar[i]); } pinyinName.append(" "); } // return pinyinName.toString(); return parseTheChineseByObject(discountTheChinese(pinyinName.toString())); } /** * 漢字轉(zhuǎn)換位漢語(yǔ)全拼,英文字符不變,特殊字符丟失 * 支持多音字,生成方式如(重當(dāng)參:zhongdangcen,zhongdangcan,chongdangcen * ,chongdangshen,zhongdangshen,chongdangcan) * * @param chines 漢字 * @return 拼音 */ public static String converterToSpell(String chines) { StringBuffer pinyinName = new StringBuffer(); char[] nameChar = chines.toCharArray(); HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat(); defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); for (int i = 0; i < nameChar.length; i++) { if (nameChar[i] > 128) { try { // 取得當(dāng)前漢字的所有全拼 String[] strs = PinyinHelper.toHanyuPinyinStringArray( nameChar[i], defaultFormat); if (strs != null) { for (int j = 0; j < strs.length; j++) { pinyinName.append(strs[j]); if (j != strs.length - 1) { pinyinName.append(","); } } } } catch (BadHanyuPinyinOutputFormatCombination e) { e.printStackTrace(); } } else { pinyinName.append(nameChar[i]); } pinyinName.append(" "); } // return pinyinName.toString(); return parseTheChineseByObject(discountTheChinese(pinyinName.toString())); } /** * 去除多音字重復(fù)數(shù)據(jù) * * @param theStr * @return */ private static List<Map<String, Integer>> discountTheChinese(String theStr) { // 去除重復(fù)拼音后的拼音列表 List<Map<String, Integer>> mapList = new ArrayList<Map<String, Integer>>(); // 用于處理每個(gè)字的多音字,去掉重復(fù) Map<String, Integer> onlyOne = null; String[] firsts = theStr.split(" "); // 讀出每個(gè)漢字的拼音 for (String str : firsts) { onlyOne = new Hashtable<String, Integer>(); String[] china = str.split(","); // 多音字處理 for (String s : china) { Integer count = onlyOne.get(s); if (count == null) { onlyOne.put(s, new Integer(1)); } else { onlyOne.remove(s); count++; onlyOne.put(s, count); } } mapList.add(onlyOne); } return mapList; } /** * 解析并組合拼音,對(duì)象合并方案(推薦使用) * * @return */ private static String parseTheChineseByObject( List<Map<String, Integer>> list) { Map<String, Integer> first = null; // 用于統(tǒng)計(jì)每一次,集合組合數(shù)據(jù) // 遍歷每一組集合 for (int i = 0; i < list.size(); i++) { // 每一組集合與上一次組合的Map Map<String, Integer> temp = new Hashtable<String, Integer>(); // 第一次循環(huán),first為空 if (first != null) { // 取出上次組合與此次集合的字符,并保存 for (String s : first.keySet()) { for (String s1 : list.get(i).keySet()) { String str = s + s1; temp.put(str, 1); } } // 清理上一次組合數(shù)據(jù) if (temp != null && temp.size() > 0) { first.clear(); } } else { for (String s : list.get(i).keySet()) { String str = s; temp.put(str, 1); } } // 保存組合數(shù)據(jù)以便下次循環(huán)使用 if (temp != null && temp.size() > 0) { first = temp; } } String returnStr = ""; if (first != null) { // 遍歷取出組合字符串 for (String str : first.keySet()) { returnStr += (str + ","); } } if (returnStr.length() > 0) { returnStr = returnStr.substring(0, returnStr.length() - 1); } return returnStr; } }
以上這篇使用Pinyin4j進(jìn)行拼音分詞的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)項(xiàng)目之寵物商城系統(tǒng)的實(shí)現(xiàn)流程
這是一個(gè)使用了java+Springboot+Maven+mybatis+Vue+mysql開(kāi)發(fā)的寵物商城系統(tǒng),是一個(gè)畢業(yè)設(shè)計(jì)的實(shí)戰(zhàn)練習(xí),具有寵物商城該有的所有功能,感興趣的朋友快來(lái)看看吧2022-01-01java如何更改數(shù)據(jù)庫(kù)中的數(shù)據(jù)
這篇文章主要介紹了java如何更改數(shù)據(jù)庫(kù)中的數(shù)據(jù),修改數(shù)據(jù)庫(kù)是數(shù)據(jù)庫(kù)操作必不可少的一部分,使用Statement接口中的excuteUpdate()方法可以修改數(shù)據(jù)表中的數(shù)據(jù),感興趣的朋友跟隨小編一起看看吧2021-11-11Eclipse項(xiàng)目怎么導(dǎo)入IDEA并運(yùn)行(超詳細(xì))
這篇文章主要介紹了Eclipse項(xiàng)目怎么導(dǎo)入IDEA并運(yùn)行(超詳細(xì)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10java使用PDFRenderer實(shí)現(xiàn)預(yù)覽PDF功能
這篇文章主要為大家詳細(xì)介紹了java使用PDFRenderer實(shí)現(xiàn)預(yù)覽PDF功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12Java并發(fā)編程加鎖導(dǎo)致的活躍性問(wèn)題詳解方案
所謂并發(fā)編程是指在一臺(tái)處理器上"同時(shí)"處理多個(gè)任務(wù)。并發(fā)是在同一實(shí)體上的多個(gè)事件。多個(gè)事件在同一時(shí)間間隔發(fā)生,所以編寫正確的程序很難,而編寫正確的并發(fā)程序則難上加難2021-10-10Java 如何從spring容器中獲取注入的bean對(duì)象
這篇文章主要介紹了Java 如何從spring容器中獲取注入的bean對(duì)象,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-11-11