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

使用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进行拼音分词的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java中汉字转拼音pinyin4j用法实例分析

    本文实例讲述了Java中汉字转拼音pinyin4j用法.分享给大家供大家参考,具体如下: 汉字转换拼音在日常开发中是个很常见的问题.例如我们伟大的12306,在地名中输入"WH",就会出现"武汉""芜湖""威海"等地名,输入"WUHU"就会出现"芜湖". Java获取汉字的拼音,pinyin4j这个库可以很好的解决这个问题. 下载地址:http://sourceforge.net/pro

  • Java实现将汉字转化为汉语拼音的方法

    本文实例讲述了Java实现将汉字转化为汉语拼音的方法.分享给大家供大家参考,具体如下: 网上乱转,偶然看到一个很有意思的小工具,名字叫pinyin4j,可以把汉字转换为汉语拼音,利用他的话再配合上lucene.中文分词就可以做出类似google那种输入汉语拼音进行全文检索的功能了.实现的代码如下 package pinyin4j; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.forma

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

    使用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.piny

  • 支持汉转拼和拼音分词的PHP中文工具类ChineseUtil

    PHP 中文工具类,支持汉字转拼音.拼音分词.简繁互转. PHP Chinese Tool class, support Chinese pinyin, pinyin participle, simplified and traditional conversion 目前本类库拥有的三个功能,都是在实际开发过程中整理出来的.这次使用的数据不同于以前我开源过汉字转拼音和简繁互转,数据都是从字典网站采集下来的,比以前的数据更加准确. 由于中文的博大精深,字有多音字,简体字和繁体字也有多种对应.并且本

  • Python中文分词实现方法(安装pymmseg)

    本文实例讲述了Python中文分词实现方法.分享给大家供大家参考,具体如下: 在Python这pymmseg-cpp 还是十分方便的! 环境 ubuntu10.04 , python2.65 步骤: 1 下载mmseg-cpp的源代码 http://code.google.com/p/pymmseg-cpp/ 2 执行: tar -zxf pymmseg-cpp*.tar.gz //解压后得到pymmseg 目录 cd pymmseg\mmseg-cpp python build.py #生成

  • JS实现中文汉字按拼音排序的方法

    本文实例讲述了JS实现中文汉字按拼音排序的方法.分享给大家供大家参考,具体如下: 代码1,拼音排序: var array = ['武汉', '北京', '上海', '天津']; var resultArray = array.sort( function compareFunction(param1, param2) { return param1.localeCompare(param2,"zh"); } ); console.log(resultArray); 火狐浏览器 resu

  • JavaScript实现拼音排序的方法

    一般情况下,大家会使用下面的方法来进行汉字的拼音排序 复制代码 代码如下: var list = [ '王', '张','李']; list.sort(function (a, b) { return a.localeCompare(b); }); localeCompare() :用本地特定的顺序来比较两个字符串. 通过localeCompare这个方法来进行拼音排序的不可靠之处在于: 1. 很依赖中文操作系统 2. 很依赖浏览器的内核 也就是说,如果你的网站访问者是通过非中文系统,或者非IE

  • C#中实现输入汉字获取其拼音(汉字转拼音)的2种方法

    前不久看到有的朋友实现对商品名称拼音的录入,发现他的实现方式是手动输入的,-_-#.同志们,福利来了! 本文刚发布时,只写了一个实现方式,使用的是微软的语言包,但是对多音字的效果不怎么理想,甚至个别字会出现很诡异的错误,因此,现在扩展另一个方法,手动实现. 方式一.使用微软语言包 微软为了开发者实现国际化语言的互转,提供了Microsoft Visual Studio International Pack,这个扩展包里面有中文.日文.韩文.英语等各国语言包,并提供方法实现互转.获取拼音.获取字数

  • JAVA实现汉字转拼音功能代码实例

    JAVA中汉字转拼音的方法并不复杂,可以使用pinyin4j包来实现. 一.下载pinyin4j的架包,并导入项目中,如下: 如果是maven项目,maven依赖如下: <dependency> <groupId>com.belerweb</groupId> <artifactId>pinyin4j</artifactId> <version>2.5.0</version> </dependency> 二.汉字

  • MySQL按照汉字的拼音排序简单实例

    如果存储姓名的字段采用的是GBK字符集,那就好办了,因为GBK内码编码时本身就采用了拼音排序的方法(常用一级汉字3755个采用拼音排序,二级汉字就不是了,但考虑到人名等都是常用汉字,因此只是针对一级汉字能正确排序也够用了). 直接在查询语句后面 添加 order by name asc; 查询结果按照姓氏的升序排序: 如果存储姓名的字段采用的是 utf8字符集,需要在排序的时候对字段进行转码:对于的代码是  order by convert(name using gbk) asc; 同样,查询的

  • python中文分词,使用结巴分词对python进行分词(实例讲解)

    在采集美女站时,需要对关键词进行分词,最终采用的是python的结巴分词方法. 中文分词是中文文本处理的一个基础性工作,结巴分词利用进行中文分词. 其基本实现原理有三点: 1.基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG) 2.采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合 3.对于未登录词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法 安装(Linux环境) 下载工具包,解压后进入目录下,运行:python set

  • Python 中拼音库 PyPinyin 用法详解

    最近碰到了一个问题,项目中很多文件都是接手过来的中文命名的一些素材,结果在部署的时候文件名全都乱码了,导致项目无法正常运行. 后来请教了一位大佬怎么解决文件名乱码的问题,他说这个需要正面解决吗?不需要,把文件名全部改掉,文件名永远不要用中文,永远不要. 我想他这么说的话,一定也是凭经验得出来的. 这里也友情提示大家,项目里面文件永远不要用中文,永远不要! 好,那不用中文用啥?平时来看,一般我们都会用英文来命名,一般也不会出现中文,比如 resource, controller, result,

随机推荐