使用Pinyin4j进行拼音分词的方法
程序员文章站
2023-12-20 08:32:52
使用maven引入相关的jar
com.belerweb ...
使用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进行拼音分词的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。