上一篇文章 Java 汉字转拼音 介绍了Java 中利用Pinyin4j 实现汉字转拼音,但是对于多音字问题采取的是组合拼音方式,例如长沙 取拼音结果就是 changsha zhangsha。某些情况下我们希望能得到多音字的唯一拼音,此时就需要借助多音字字典了,原理很简单:给多音字一个默认的拼音并告诉计算机碰到哪些词的时候使用其它的拼音,例如 长 字,我们可以给它指定默认拼音为 zhang,并标识 长沙 拼音为 chang。

以上是自己搜集的一个多音字词典 duoyinzi_pinyin.txt

[html] view plaincopy
  1. a#阿
  2. ao#拗
  3. ai#艾
  4. bang#膀 磅 蚌
  5. ba#扒车 扒拉 扒皮
  6. bai#叔伯 百 柏杨
  7. bao#剥皮 薄  暴 堡 曝
  8. beng#蚌埠
  9. bi#复辟  臂  秘鲁 泌阳
  10. bing#屏弃 屏气 屏除 屏退 屏息
  11. bian#扁 便
  12. bo#薄荷 单薄 伯 伯爵  泊 波 柏 萝卜 孛
  13. bu#卜
  14. can#参
  15. cang#藏
  16. cen#参差
  17. ceng#曾 噌
  18. cha#差 刹那 宝刹 一刹 查
  19. chai#公差 差役 专差 官差 听差 美差 办差 差事 差使 肥差 当差 钦差 苦差 出差
  20. chan#颤 单于 禅
  21. chang#长  厂
  22. chao#朝 嘲
  23. che#工尺 车
  24. chen#称职 匀称 称心 相称 对称
  25. cheng#称 乘 澄 噌吰 橙 秤
  26. chu#畜
  27. chui#椎心
  28. chuan#传
  29. chi#匙 尺 吃
  30. chong#重庆 重重 虫
  31. chou#臭
  32. chuang#经幢
  33. chuo#绰
  34. ci#参差 伺  龟兹
  35. cuan#攒钱 攒聚 攒动
  36. cuo#撮儿 撮要 撮合
  37. da#大 嗒
  38. dao#叨
  39. dai#大夫
  40. dan#单 弹
  41. dang#铛
  42. de#的
  43. di#堤 底 怎的 有的 目的 标的 打的 的确 的当 的士 地 提防
  44. diao#蓝调 调调 音调 论调 格调 调令 低调 笔调 基调 强调 声调 滥调 老调 色调 单调 腔调 跑调 曲调 步调 语调 主调 情调
  45. ding#丁
  46. du#读 都 度
  47. dou#全都 句读
  48. duo#舵 测度 忖度 揣度 猜度
  49. dun#粮囤 盾 顿 沌 敦
  50. e#阿谀 阿胶 阿弥 恶心
  51. er#儿
  52. fan#番
  53. feng#冯
  54. fo#佛
  55. fu#仿佛 果脯 罘
  56. fou#否则 否定 应否 是否 与否 否决
  57. ga#咖喱 伽马
  58. gai#盖
  59. gao#告
  60. gang#扛鼎
  61. ge#革 蛤蚧 文蛤 蛤蜊 咯
  62. gei#给
  63. geng#脖颈
  64. gong#女红
  65. gu#谷 中鹄  鼓
  66. gui#龟 柜 硅
  67. gua#呱
  68. guan#纶巾 东莞
  69. guang#广
  70. ha#蛤
  71. hai#还 嗨
  72. hao#貉子 貉绒
  73. hang#夯 总行 分行 支行 行业 排行 行情 央行 商行 外行 银行 商行 酒行 麻行 琴行 巷道
  74. he#和 合 核
  75. heng#道行
  76. hu#鹄 水浒
  77. hua#滑
  78. huan#归还 放还 奉还
  79. hui#会 浍河
  80. hong#红 虹
  81. huo#软和 热和 暖和
  82. ji#病革 给养 自给 给水 薪给 给予 供给 稽 缉 藉 奇数 亟 诘屈 荠菜
  83. jia#雪茄 伽 家 价 贾
  84. jian#见
  85. jiang#降
  86. jiao#嚼舌 嚼子 细嚼 角 剿 饺 脚 蕉 矫
  87. jie#解 慰藉 蕴藉 诘
  88. jin#矜 劲
  89. jing#颈 景
  90. ju#咀嚼  居 桔 句
  91. jun#均
  92. juan#棚圈 圈养
  93. jv#咀嚼 趑趄
  94. jvan#猪圈 羊圈
  95. jue#主角 角色 旦角 女角 丑角 角力 名角 配角 咀嚼 觉
  96. jun#龟裂 俊
  97. jvn#龟裂
  98. ka#咖 卡 喀
  99. kai#楷
  100. kang#扛 扛活 扛大
  101. ke#咳 壳
  102. keng#吭
  103. kuai#会计 财会 浍
  104. kuo#括
  105. la#癞痢 腊
  106. lai#癞疮 癞子 癞蛤 癞皮
  107. lao#积潦 络子 落枕 落价 粩 姥
  108. le#乐 勒 了
  109. lei#勒紧
  110. lo#然咯
  111. lou#佝偻
  112. long#里弄 弄堂 泷
  113. li#跞
  114. liao#了解 了结  明了 了得 末了 未了 了如  了如指掌 潦
  115. liang#靓 俩
  116. liu#六
  117. lu#碌 陆 露
  118. luo#络 络 落 漯
  119. lv#率 绿
  120. lun#纶
  121. mai#埋
  122. man#埋怨 蔓
  123. mai#脉
  124. mang#氓 芒
  125. mao#冒
  126. meng#群氓 盟
  127. mei#没
  128. mo#埋没 隐没 脉脉 模 摩
  129. mou#绸缪 牟
  130. mi#秘 泌尿 分泌 谜
  131. miu#谬 谬论 纰缪
  132. mu#人模 字模 模板 模样 模具 装模 装模做样 模子
  133. na#哪 娜 那
  134. nan#南
  135. ne#哪吒 呢
  136. nong#弄
  137. ni#毛呢 花呢 呢绒 线呢 呢料 呢子 呢喃 溺
  138. niao#尿 鸟
  139. nian#粘
  140. niang#酿
  141. niu#执拗 拗不
  142. nu#努
  143. nue#疟 疟疾
  144. nuo#婀娜 袅娜
  145. nv#女
  146. nve#疟原 疟蚊
  147. o#喔
  148. pa#扒
  149. pai#派 迫击 迫击炮
  150. pao#刨 炮
  151. pang#胖 膀胱 膀肿 磅礴
  152. pi#辟 否极 臧否 龙陂 芘
  153. pian#扁舟 便宜
  154. piao#朴姓
  155. ping#屏 苹
  156. po#湖泊 血泊  迫 朴刀 坡 陂
  157. pu#暴十 一曝十寒 里堡 十里堡 脯 朴 曝晒 瀑 埔
  158. qi#期 其 泣
  159. qiu#龟兹
  160. qi#稽首 缉鞋 栖  奇 漆 齐
  161. qia#卡脖 卡子 关卡 卡壳 哨卡 边卡 发卡
  162. qiao#雀盲 雀子 地壳 甲壳 躯壳
  163. qian#纤 乾
  164. qiang#强
  165. qie#茄 趔趄
  166. qin#亲 沁
  167. qing#干亲 亲家
  168. qu#区 趣
  169. quan#圈 券
  170. que#雀
  171. ruo#若
  172. sai#塞
  173. se#堵塞 搪塞 茅塞 闭塞 鼻塞 梗塞 阻塞 淤塞 拥塞 哽塞  色
  174. sha#莎 刹车 急刹 急刹车 厦
  175. shai#色子
  176. shao#勺
  177. shan#姓单 单县 杉
  178. shang#衣裳
  179. she#拾级 折本 射 蛇
  180. shen#沙参 野参 参王 人参 红参 丹参 山参 海参 刺参 鹿参 什 身 沈
  181. sheng#野乘 千乘 史乘  省 晟 盛
  182. shi#钥匙 拾荒 捡拾 拾物 家什 什物 什锦 麻什  麦什 喀什 牛什  识 似的 食 石 氏 拾 适
  183. shuai#表率 率性 率直 率真 粗率 率领 轻率 直率 草率 大率 坦率 衰
  184. shuang#泷水
  185. shu#属 数 术 熟
  186. shui#游说
  187. shuo#数见 数见不鲜  说
  188. si#窥伺 伺弄 伺机 似 思
  189. su#宿
  190. sui#尿泡
  191. ta#拓本 拓片 碑拓 疲沓 拖沓 杂沓 沓 塔 鸿塔
  192. tang#汤
  193. tao#陶
  194. tan#弹性 弹力 反弹
  195. ti#提 体
  196. tiao#调
  197. ting#町 听
  198. tui#褪
  199. tuo#拓
  200. tun#囤 屯
  201. wei#尾 蔚 圩
  202. wu#无 可恶 交恶 好恶 厌恶 憎恶 嫌恶 痛恶 深恶
  203. wan#藤蔓 枝蔓 瓜蔓 蔓儿  莞  万 百万 皖
  204. wai#崴
  205. xia#虾 吓 夏
  206. xi#栖栖 系  蹊 洗 溪 戏
  207. xiao#校 切削 削面 刀削 刮削
  208. xian#纤细 光纤 纤巧 纤柔 纤小 纤维 纤瘦 纤纤 化纤 纤秀 棉纤 纤尘
  209. xiang#降 巷
  210. xie#解数 出血 采血 换血 血糊 尿血 淤血 放血 血晕 血淋 便血 吐血 咯血 叶韵 蝎 蝎子 邪
  211. xiu#铜臭 乳臭 成宿 星宿
  212. xin#馨 信 鸿信
  213. xing#深省 省视 内省 不省人事 省悟 省察 行 旅行 例行 行程 行乐 龙行 人行 流行 先行 行星 品行  发行 行政 风行 龙行 龍行 麟行 荥
  214. xu#牧畜 畜产 畜牧 畜养 吁 麦埂圩 浒
  215. xue#削  血
  216. xun#荨 寻
  217. ya#琊
  218. yao#钥匙 金钥 耀 曜
  219. yan#咽  殷红 腌 烟
  220. ye#液 抽咽 哽咽 咽炎 下咽 呜咽 幽咽 悲咽 叶  葉
  221. yi#自艾 遗 屹
  222. yin#殷
  223. ying#荥经
  224. yo#杭育
  225. yong#涌
  226. yu#余 呼吁 吁请 吁求 育 熨帖 熨烫 於
  227. yuan#员
  228. yun#熨
  229. yue#约 乐音 器乐 乐律 乐章 音乐 乐理 民乐 乐队 声乐 奏乐 弦乐 乐坛 管乐 配乐 乐曲 乐谱  锁钥 密钥 乐团 乐器
  230. za#绑扎 结扎 包扎 捆扎 咱家
  231. zan#攒 咱
  232. zang#宝藏 藏历 藏文 藏语 藏青 藏族 藏医  藏药 藏蓝 西藏
  233. zai#牛仔 龟仔 龙仔 鼻仔 羊仔  仔仔 麻仔  麵包仔 麦旺仔 鸿仔 煲仔 福仔
  234. ze#择
  235. zeng#曾孙 曾祖
  236. zong#综
  237. zha#扎
  238. zhai#宅
  239. zhan#不粘 粘贴 粘连
  240. zhao#朝朝 明朝 朝晖 朝夕 朝思 有朝 今朝 朝气 朝三 朝秦 朝霞 鹰爪 龙爪 魔爪 爪牙 失着 着数 龙爪槐
  241. zhe#折 着
  242. zhi#标识 吱 殖 枝
  243. zhong#重 种
  244. zhou#粥
  245. zhu#属意 著
  246. zhua#爪子
  247. zhui#椎 隹
  248. zhuo#执著 着装 着落 着意 着力 附着 着笔 胶着 着手 着重 穿着 衣着 执着 着眼 着墨 着实 沉着 着陆 着想 着色
  249. zhuang#幢房 一幢 幢楼
  250. zi#仔 兹
  251. zu#足
  252. zuo#柞
  253. zui#咀

自己封装了一个获取汉字拼音 全拼和简拼的工具类 PinyinUtils,代码如下:

[java] view plaincopy
  1. package com.ricky.java.suggestion.util;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.IOException;
  7. import java.io.InputStreamReader;
  8. import java.io.UnsupportedEncodingException;
  9. import java.util.HashMap;
  10. import java.util.Map;
  11. import org.apache.log4j.Logger;
  12. import net.sourceforge.pinyin4j.PinyinHelper;
  13. import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
  14. import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
  15. import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
  16. import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
  17. import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
  18. public class PinyinUtils {
  19. private static final Logger logger = Logger.getLogger("devLog");
  20. public static Map<String,String> dictionary = new HashMap<String,String>();
  21. //加载多音字词典
  22. static{
  23. BufferedReader br = null;
  24. try {
  25. File file = new File("./config/duoyinzi_pinyin.txt");
  26. br = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));
  27. String line = null;
  28. while((line=br.readLine())!=null){
  29. String[] arr = line.split("#");
  30. if(StringUtils.isNotEmpty(arr[1])){
  31. String[] sems = arr[1].split(" ");
  32. for (String sem : sems) {
  33. if(StringUtils.isNotEmpty(sem)){
  34. dictionary.put(sem , arr[0]);
  35. }
  36. }
  37. }
  38. }
  39. } catch (UnsupportedEncodingException e) {
  40. e.printStackTrace();
  41. } catch (FileNotFoundException e) {
  42. e.printStackTrace();
  43. } catch (IOException e) {
  44. e.printStackTrace();
  45. }finally{
  46. if(br!=null){
  47. try {
  48. br.close();
  49. } catch (IOException e) {
  50. e.printStackTrace();
  51. }
  52. }
  53. }
  54. }
  55. public static String[] chineseToPinYin(char chineseCharacter) throws BadHanyuPinyinOutputFormatCombination{
  56. HanyuPinyinOutputFormat outputFormat = new HanyuPinyinOutputFormat();
  57. outputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
  58. outputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
  59. outputFormat.setVCharType(HanyuPinyinVCharType.WITH_V);
  60. if(chineseCharacter>=32 && chineseCharacter<=125){    //ASCII >=33 ASCII<=125的直接返回 ,ASCII码表:http://www.asciitable.com/
  61. return new String[]{String.valueOf(chineseCharacter)};
  62. }
  63. return PinyinHelper.toHanyuPinyinStringArray(chineseCharacter, outputFormat);
  64. }
  65. /**
  66. * 获取汉字拼音的全拼
  67. * @param chineseCharacter
  68. * @return
  69. * @throws BadHanyuPinyinOutputFormatCombination
  70. */
  71. public static String chineseToPinYinF(String chineseCharacter) throws BadHanyuPinyinOutputFormatCombination{
  72. if(StringUtils.isEmpty(chineseCharacter)){
  73. return null;
  74. }
  75. char[] chs = chineseCharacter.toCharArray();
  76. StringBuilder result = new StringBuilder();
  77. for(int i=0;i<chs.length;i++){
  78. String[] arr = chineseToPinYin(chs[i]);
  79. if(arr==null){
  80. result.append("");
  81. }else if(arr.length==1){
  82. result.append(arr[0]);
  83. }else if(arr[0].equals(arr[1])){
  84. result.append(arr[0]);
  85. }else{
  86. String prim = chineseCharacter.substring(i, i+1);
  87. //              System.out.println("prim="+prim+"**i="+i);
  88. String lst = null,rst = null;
  89. if(i<=chineseCharacter.length()-2){
  90. rst = chineseCharacter.substring(i,i+2);
  91. }
  92. if(i>=1 && i+1<=chineseCharacter.length()){
  93. lst = chineseCharacter.substring(i-1,i+1);
  94. }
  95. //              System.out.println("lst="+lst+"**rst="+rst);
  96. String answer = null;
  97. for (String py : arr) {
  98. if(StringUtils.isEmpty(py)){
  99. continue;
  100. }
  101. if((lst!=null && py.equals(dictionary.get(lst))) ||
  102. (rst!=null && py.equals(dictionary.get(rst)))){
  103. answer = py;
  104. //                      System.out.println("get it,answer="+answer+",i="+i+"**break");
  105. break;
  106. }
  107. if(py.equals(dictionary.get(prim))){
  108. answer = py;
  109. //                      System.out.println("get it,answer="+answer+",i="+i+"**prim="+prim);
  110. }
  111. }
  112. if(answer!=null){
  113. result.append(answer);
  114. }else{
  115. logger.warn("no answer ch="+chs[i]);
  116. }
  117. }
  118. }
  119. return result.toString().toLowerCase();
  120. }
  121. public static String chineseToPinYinS(String chineseCharacter) throws BadHanyuPinyinOutputFormatCombination{
  122. if(StringUtils.isEmpty(chineseCharacter)){
  123. return null;
  124. }
  125. char[] chs = chineseCharacter.toCharArray();
  126. StringBuilder result = new StringBuilder();
  127. for(int i=0;i<chs.length;i++){
  128. String[] arr = chineseToPinYin(chs[i]);
  129. if(arr==null){
  130. result.append("");
  131. }else if(arr.length==1){
  132. result.append(arr[0].charAt(0));
  133. }else if(arr[0].equals(arr[1])){
  134. result.append(arr[0].charAt(0));
  135. }else{
  136. String prim = chineseCharacter.substring(i, i+1);
  137. //              System.out.println("prim="+prim+"**i="+i);
  138. String lst = null,rst = null;
  139. if(i<=chineseCharacter.length()-2){
  140. rst = chineseCharacter.substring(i,i+2);
  141. }
  142. if(i>=1 && i+1<=chineseCharacter.length()){
  143. lst = chineseCharacter.substring(i-1,i+1);
  144. }
  145. //              System.out.println("lst="+lst+"**rst="+rst);
  146. String answer = null;
  147. for (String py : arr) {
  148. if(StringUtils.isEmpty(py)){
  149. continue;
  150. }
  151. if((lst!=null && py.equals(dictionary.get(lst))) ||
  152. (rst!=null && py.equals(dictionary.get(rst)))){
  153. answer = py;
  154. //                      System.out.println("get it,answer="+answer+",i="+i+"**break");
  155. break;
  156. }
  157. if(py.equals(dictionary.get(prim))){
  158. answer = py;
  159. //                      System.out.println("get it,answer="+answer+",i="+i+"**prim="+prim);
  160. }
  161. }
  162. if(answer!=null){
  163. result.append(answer.charAt(0));
  164. }else{
  165. logger.warn("no answer ch="+chs[i]);
  166. }
  167. }
  168. }
  169. return result.toString().toLowerCase();
  170. }
  171. }

测试代码

[java] view plaincopy
  1. package com.ricky.java.suggestion.test;
  2. import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
  3. import com.ricky.java.suggestion.util.PinyinUtils;
  4. public class PinyinTest {
  5. /**
  6. * @param args
  7. */
  8. public static void main(String[] args) {
  9. try {
  10. //          String str = "长沙绿爱旅行";
  11. String str = "中信银行(长沙旅行社分行)";
  12. System.out.println(str+" pyf="+PinyinUtils.chineseToPinYinF(str));
  13. System.out.println(str + " pys="+PinyinUtils.chineseToPinYinS(str));
  14. } catch (BadHanyuPinyinOutputFormatCombination e) {
  15. e.printStackTrace();
  16. }
  17. }
  18. }

执行结果

中信银行(长沙旅行社分行) pyf=zhongxinyinhang(changshalvxingshefenhang)
中信银行(长沙旅行社分行) pys=zxyh(cslxsfh)

java 汉字转拼音(解决多音字问题)相关推荐

  1. java汉字转拼音区别多音字_java中文转拼音,支持多音字词组,不支持音标

    官方的pinyin4j虽然强大,能够支持音标转换,但硬伤在于不支持词组.就此特地将pinyin4j的词库提取出来,研究了下,发现多音字有2000多,去掉音标就1000多,常用字也就500左右.然后估摸 ...

  2. Java pinyin4j 汉字转拼音包括——多音字

    Java汉字转拼音(包括多音字) 有个需求需要把汉字转拼音,我的小伙伴推荐用Unicode官方的包:下载有些慢. 实际中用了Java工具包:pinyin4j解决 可以转汉字,多音字,多音字的地方要求不 ...

  3. Java汉字转拼音(全拼、首字母拼)

    Java汉字转拼音(全拼.首字母拼) public class ChineseToEnglish { /*** 汉字转拼音* @param src* @return*/public static St ...

  4. java汉字转拼音(全拼、简拼)

    java汉字转拼音(全拼.简拼) <dependency><groupId>com.belerweb</groupId><artifactId>piny ...

  5. 记录一下:Java 汉字获取拼音或首字母工具类

    记录一下:Java 汉字获取拼音或首字母工具类 Maven依赖配置 Java代码 本文主要记录一下在Java中,如何将字符串中的中文转化为拼音,获取汉字串拼音首字母,获取汉字串拼音的工具类,以及相关的 ...

  6. java 汉字转换拼音

    java 汉字转换拼音 maven依赖 <dependency><groupId>com.belerweb</groupId><artifactId>p ...

  7. java汉字转拼音工具类源代码

    原文:java汉字转拼音工具类源代码 源代码下载地址:http://www.zuidaima.com/share/1550463387880448.htm 汉字转拼音 Pinyin pinyin = ...

  8. Java 汉字转拼音 完整代码实例(包含多音字解决方案)

    汉字转换拼音的方法是使用到一个库:pinyin4j 下载地址: https://download.csdn.net/download/pengfei1990/15562432 maven依赖 < ...

  9. java 汉字转拼音_推荐一款前端汉字转拼音组件工具

    推荐一个前端的汉字转拼音组件 hotoo/pinyin, 支持在 Node 和 Web 浏览器环境运行. github网址:https://github.com/hotoo/pinyin 特性 根据词 ...

  10. Java汉字按照拼音排序

    最近项目上使用到汉字排序的问题,网上搜索了一下后普遍使用下面的方法比较. @Test public void test_sort_pinyin() { Collator cmp = Collator. ...

最新文章

  1. 可测试性如何帮助团队提升效率
  2. C语言模拟实现(四)-----利用open、read、write等系统调用函数实现cp(文件复制)功能
  3. 判断页面在手机和pc打开的方法
  4. 去除IE10自带的清除按钮
  5. InnoDB事务结构体代码变量列表
  6. zabbix 2.2节点批量安装
  7. 如何在 Linux 终端中复制粘贴 [初学者教程]
  8. HeidiSQL使用教程
  9. 如何按行政区划下载谷歌卫星地图并裁剪
  10. 大数据分析-实验五 pdfminer
  11. C#进阶高级程序员开发必知必会:泛型的定义实操案例: 实现堆栈的后进先出功能
  12. html想实现文字环绕图片,HTML/CSS实现文字环绕图片布局
  13. NLP学习-1--语料预处理与向量空间,语料格式
  14. 穿山甲别于传统广告联盟,造势创建新角色
  15. mine makefile studing processing
  16. 【qq机器人】发送图片的插件
  17. 删除 python print()输出的字符里的空格
  18. 2021秋冬上海时装周开启,聚焦8大国内外品牌
  19. 2016百度沸点榜单出炉 看看年度搜索报告有哪些
  20. 全栈工程师是那些为了节约成本的小公司在招聘吗?

热门文章

  1. Java开发环境安裝教程
  2. 数学建模论文写作要求
  3. 【我的世界Minecraft-MC】常见及各种指令大杂烩【2022.8版】
  4. C#异步加载数据:BackgroundWorker的使用
  5. 借助易宝实现Java版网上在线支付
  6. 内存数据库 TimesTen
  7. Timesten Classic 18.1 建立缓存组
  8. Android keystore 证书文件制作
  9. 2021Java笔试题总结!三星java经典手机游戏
  10. 力克亮相CISMA 2017,以工业4.0思维应对时尚变革