溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

使用Pinyin4j怎么實現(xiàn)拼音分詞

發(fā)布時間:2021-03-30 15:53:43 來源:億速云 閱讀:167 作者:Leah 欄目:編程語言

使用Pinyin4j怎么實現(xiàn)拼音分詞?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

使用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;
/**
 * 漢語拼音工具類
 * Created by PengSongHe on 2017/2/9 0009.
 */
public class Pinyin4jUtil {
 public static void main(String[] args) {
  String str = "測試";
  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)換位漢語拼音首字母,英文字符不變,特殊字符丟失 支持多音字,生成方式如(長沙市長: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 {
     // 取得當前漢字的所有全拼
     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)換位漢語全拼,英文字符不變,特殊字符丟失
  * 支持多音字,生成方式如(重當參: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 {
     // 取得當前漢字的所有全拼
     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>>();
  // 用于處理每個字的多音字,去掉重復(fù)
  Map<String, Integer> onlyOne = null;
  String[] firsts = theStr.split(" ");
  // 讀出每個漢字的拼音
  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;
 }
 /**
  * 解析并組合拼音,對象合并方案(推薦使用)
  *
  * @return
  */
 private static String parseTheChineseByObject(
   List<Map<String, Integer>> list) {
  Map<String, Integer> first = null; // 用于統(tǒng)計每一次,集合組合數(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;
 }
}

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI