当前位置: 移动技术网 > IT编程>开发语言>Java > 使用Pinyin4j进行拼音分词的方法

使用Pinyin4j进行拼音分词的方法

2019年07月19日  | 移动技术网IT编程  | 我要评论

使用maven引入相关的jar

<dependency>
 <groupid>com.belerweb</groupid>
 <artifactid>pinyin4j</artifactid>
 <version>2.5.1</version>
</dependency>

创建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);
 }
 /**
  * 汉字转换位汉语拼音首字母,英文字符不变,特殊字符丢失 支持多音字,生成方式如(长沙市长: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()));
 }
 /**
  * 汉字转换位汉语全拼,英文字符不变,特殊字符丢失
  * 支持多音字,生成方式如(重当参: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()));
 }
 /**
  * 去除多音字重复数据
  *
  * @param thestr
  * @return
  */
 private static list<map<string, integer>> discountthechinese(string thestr) {
  // 去除重复拼音后的拼音列表
  list<map<string, integer>> maplist = new arraylist<map<string, integer>>();
  // 用于处理每个字的多音字,去掉重复
  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; // 用于统计每一次,集合组合数据
  // 遍历每一组集合
  for (int i = 0; i < list.size(); i++) {
   // 每一组集合与上一次组合的map
   map<string, integer> temp = new hashtable<string, integer>();
   // 第一次循环,first为空
   if (first != null) {
    // 取出上次组合与此次集合的字符,并保存
    for (string s : first.keyset()) {
     for (string s1 : list.get(i).keyset()) {
      string str = s + s1;
      temp.put(str, 1);
     }
    }
    // 清理上一次组合数据
    if (temp != null && temp.size() > 0) {
     first.clear();
    }
   } else {
    for (string s : list.get(i).keyset()) {
     string str = s;
     temp.put(str, 1);
    }
   }
   // 保存组合数据以便下次循环使用
   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进行拼音分词的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网