A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 西安Java组 于 2018-2-8 13:20 编辑

原理:将可能出现的多音字词组组合起来,用正确拼音当作其key,词组当作value,保存到一个Map集合中。使用PinYin4j获取汉字拼音时判断是否为多音字(返回数组的长度大于1),如果为多音字,用其拼音去 Map集合中查找,若有则取当前拼音为正确拼音。若到最后都没有找到,给其一个默认的拼音。

文件 : duoyinzi_dic.txt
a#阿阿姨阿富阿门阿拉阿林黑阿麦阿密鹿城阿岙阿福
ao#拗口违拗凹
ai#艾艾滋艾蒿未艾
bang#膀翅膀臂膀重磅磅秤黄泥磅店蛤蚌蚌壳河蚌鹬蚌珠蚌蚌
ba#扒
bai#叔伯百百万柏
bao#剥皮薄超薄薄脆薄板薄饼暴暴晒暴发暴雨暴力风暴暴露暴风汉堡古堡地堡城堡龍堡卡斯堡麻家堡麦芬堡汉堡麦得堡麦尔堡曝光瀑河
beng#蚌埠
bi#复辟臂臂章螳臂交臂前臂一臂奋臂膀臂臂膀秘鲁泌阳
bing#屏弃屏气屏除屏退屏息
bian#扁扁桃便方便方便面便当便捷
bo#薄薄荷单薄伯伯仲伯乐伯劳伯父大伯老伯伯母黄伯伯爵停泊淡泊尼泊漂泊波鸿波柏林
bu#大埔
can#参参谋参事总参参数参议参观参拜参股
cang#藏埋藏藏头秘藏雪藏藏匿收藏馆藏矿藏隐藏蕴藏藏袍储藏窖藏藏龙藏胞冷藏珍藏私藏藏掖西藏藏书藏品伧俗伧龙藏寺
cen#参差
ceng#曾不曾似曾几曾何曾曾经曾几未曾噌噌的一声
cha#差刹那宝刹一刹喳喳
chai#公差差役专差官差听差美差办差差事差使肥差当差钦差
chan#颤颤悠单于禅禅学班禅禅宗禅堂禅门禅机禅杖禅房禅师坐禅参禅禅院
chang#长周长细长长发三长长河长袖长衫天长长短超长长沙长春长远长度长江长处长假长街长征全长长城波长身长长途长吁长虹长方厂
chao#朝朝阳朝阳区朝鲜朝廷王朝历朝解嘲讥嘲自嘲嘲笑嘲弄冷嘲嘲讽绰绰绰起绰家剿袭剿说
che#车汽车停车场车车黑车车饰
chen#称职匀称称心相称对称
cheng#称职称简称总称官称代称称号称谓昵称谦称全称名称乘噌吰澄
chu#六畜家畜耕畜畜生牲畜
chui#椎心
chuan#传文传传媒传销传情真传祖传传闻传家秘传传单传说
chi#匙子茶匙羹匙汤匙尺尺度英尺咫尺尺码公尺卡尺米尺卷尺
chong#重庆重重
chou#臭汗臭臭氧口臭腋臭臭虫臭骂臭美酸臭腐臭臭气腥臭臭名遗臭恶臭臭豆狐臭臭味臭架
chuang#经幢
chuo#绰绰约阔绰绰号宽绰
ci#参差伺候龟兹
cuan#攒钱攒聚攒动
cuo#撮儿撮要撮合
da#大大街沓子龙大大西洋大昌大圣福大黑大大华大包大厦
dao#叨叨唠絮叨叨念叨咕念叨唠叨叨叨磨叨
dai#大夫
dan#单西单东单清单报单单利名单单姓单亲单线单科单间单挑单价单词子弹
de#的似的总的中的别的
deng#澄清
di#怎的无的有的目的标的打的的确的当的士上地大地天地提防堤
diao#调蓝调蓝调吧调调音调论调格调调令低调笔调基调强调声调滥调老调色调单调腔调跑调曲调步调语调主调情调
du#都都会国都都城古都故都大都首都成都旧都都市龙都鼎都鹤都鹏都鸿都麦度度态度读书法度宽度进度
dui#堆
dou#全都句读
duo#测度忖度揣度猜度舵
dun#粮囤顿
e#阿谀阿胶阿弥恶心
er#儿
fan#番番茄繁
fo#佛佛塔佛徒佛牙佛教
fu#仿佛果脯
fou#否是否与否
ga#咖咖喱伽马
gai#盖
gang#扛鼎
ge#革革命皮革鹰革蛤蚧文蛤蛤蜊咯吱咯噔咯咯
gei#给
geng#脖颈
gong#女红
gu#谷布谷谷物谷地硅谷中鹄麦谷麓谷鹭谷鼓
gui#龟龟山龟士龟博龟仔鹿龟龟汁龟苓龟顶
gua#挺括顶呱呱呱呱唧呱嗒呱
guan#纶巾东莞
guang#广广州广东广播
ha#蛤蟆癞蛤虾蟆
hai#还是还有咳
hao#貉子貉绒
hang#总行分行支行行业排行行情央行商行外行银行商行酒行麻行琴行巷道珩
he#和嘉和和睦亲和龙和之貉威吓恫吓恐吓鼎和锦和麒和苑合合资鸿合
heng#道行
hu#鹄鹄望鸿鹄鹄立
huan#还鹂还
hui#会会馆会展会所协会国会会堂
hong#红红装红牌红木红人虹
huo#软和热和暖和
ji#病革给养自给给水薪给给予供给稽考稽查稽核滑稽稽留缉获缉查缉私缉捕狼藉奇数亟亟待亟须亟亟亟需诘屈荠菜
jia#雪茄伽瑜伽伽利略家
jian#见龙见
jiang#降降温降低降旗下降倔强
jiao#嚼舌嚼子细嚼角平角视角海角龙角鹿角围剿征剿饺饺子脚
jie#解解放慰藉蕴藉盘诘诘难诘问反诘桔
jin#矜矜夸矜持骄矜自矜劲
jing#颈颈项颈椎引颈长颈宫颈瓶颈龙颈黑颈鹤鹿颈景景色帝景劲松
ju#咀咀嚼居桔汁
jun#均平均鸿均
juan#棚圈圈养
jv#咀嚼趑趄
jvan#猪圈羊圈
jue#主角角色旦角女角丑角角力名角配角咀嚼觉直觉感觉错觉触觉幻觉堀
jun#龟裂俊
jvn#龟裂
ka#咖啡卡磁卡贺卡卡拉胸卡声卡卡片绿卡卡通网卡卡口龙卡咯痰咯血喀
kang#扛
ke#咳咳嗽干咳贝壳蚌壳外壳蛋壳脑壳弹壳
keng#吭声吭气吭哧
kuai#会计财会
kuo#括
la#癞痢腊
lai#癞疮癞子癞蛤癞皮
lao#积潦络子落枕落价麻粩
le#乐娱乐玩乐乐趣美乐乐缘勒了
lei#勒紧
lo#然咯
lou#佝偻
long#里弄弄堂泷
li#礼豊栎
liao#了解了结明了了得末了未了了如了如指掌潦草潦倒
liang#靓
liu#碌碡碌碌劳碌忙碌庸碌六
lu#绿林碌
luo#络络腮落部落落花日落
lv#率频率机率比率效率胜率概率汇率功率倍率绿绿叶淡绿绿色绿豆伛偻绿洲
lun#丙纶锦纶经纶涤纶
mai#埋
man#埋怨蔓
mai#脉山脉动脉命脉筋脉脉象气脉脉动脉息脉络一脉经脉
mang#氓流氓
me#黛么
meng#群氓盟
mei#没
mo#埋没隐没脉脉模航模模糊男模楷模规模劳模模型模范模特名模摩么麼麽
mou#绸缪
mi#秘秘密秘方奥秘神秘泌尿分泌
miu#谬谬论纰缪
mu#人模字模模板模样模具装模装模做样模子
na#哪娜安娜娜娜丽娜黛尔娜黛娜海娜黑娜黄丽娜麦香娜优娜麦娜麟娜那
nan#南南方湖南
ne#哪吒呢
nong#弄
ni#毛呢花呢呢绒线呢呢料呢子呢喃溺
niao#便溺尿
nian#粘
niu#执拗拗不
nue#疟疟疾
nuo#婀娜袅娜
nv#女女人
nve#疟原疟蚊
pa#扒
pai#迫击迫击炮派
pao#刨炮
pang#膀胱膀肿磅礴
pi#否极臧否龙陂黄陂
pian#扁舟便宜
piao#朴姓
ping#屏屏幕荧屏银屏
po#泊迫朴刀坡陂
pu#暴十一曝十寒里堡十里堡胸脯肉脯脯子杏脯简朴朴质古朴朴厚纯朴朴素诚朴俭朴朴实淳朴曝晒瀑布飞瀑埔黄埔
qiu#龟兹
qi#稽首缉鞋栖奇奇妙传奇亟来荸荠蹊跷林栖鹿奇鹭奇漆齐齐天大圣齐天其
qia#卡脖卡子关卡卡壳哨卡边卡发卡
qiao#雀盲雀子地壳甲壳躯壳
qian#纤手拉纤纤夫纤绳乾
qiang#强颜强人自强强烈强风强大黎强麒强鹤强龚强
qie#茄子颠茄番茄趔趄
qin#亲亲和亲亲棘矜矜锄
qing#干亲亲家黥
qu#区小区
quan#转圈钢圈圆圈罗圈弧圈垫圈小圈眼圈
que#雀麻雀鸟雀燕雀孔雀云雀雀巢、
re#般若
ruo#若
sai#塞麦迪塞姆活塞
se#堵塞搪塞茅塞闭塞鼻塞梗塞阻塞淤塞拥塞哽塞月色彩色特色深色声色黛色黛色黑色瞳色坊
sha#刹车急刹急刹车厦广厦大厦商厦鹰大厦莎
shai#色子
shan#姓单单县杉铁杉杉树封禅禅让黒杉栅
shang#裳衣裳
she#拾级折本
shen#沙参野参参王人参红参丹参山参海参刺参没什什么为什鹿参身
sheng#野乘千乘史乘省晟盛盛大鸿盛
shi#钥匙拾荒捡拾拾物家什什物什锦麻什麦什喀什牛什识见识知识似的骨殖食饮食副食石石业石头石艺氏姓氏上栅下栅
shuai#表率率性率直率真粗率率领轻率直率草率大率坦率数字招数基数数码
shuang#泷水
shu#属金属气数岁数度数数据级数数控数学参数次数正数代数实数系数分数辈数
shui#游说
shuo#数见数见不鲜传说听说妄说实说胡说评说分说小说
si#窥伺伺弄伺机疑似似是好似似曾形似酷似貌似似懂胜似恰似近似神似赛似看似活似强似似乎类似相似思
su#宿主宿命归宿住宿借宿寄宿宿营夜宿露宿投宿宿舍名宿整宿食宿
sui#尿泡
ta#拓本拓片碑拓疲沓拖沓杂沓沓塔鸿塔
tang#汤鸭汤鸡汤
tao#叨扰叨光陶陶器
tan#弹性弹力反弹
ti#手提提速提意提前提早提升提议提款提婚提包耳提提供麦麦提体
tiao#空调调教烹调调羹调料调皮调控调节调整调价谐调协调调色调侃调味失调调治调频调剂调停调休调解
ting#町域町听
tong#垌
tui#褪色褪毛
tuo#拓拓宽拓荒开拓落拓拓展拓印
tun#屯囤积囤聚
wei#尾响尾尾巴尾灯船尾追尾尾椎月尾燕尾尾数年尾岁尾鸢尾凤尾彗尾尾翼结尾遗之龙尾齐鑫尾麻尾麦度鹿尾
wu#可恶交恶好恶厌恶憎恶嫌恶痛恶深恶
wan#藤蔓枝蔓瓜蔓蔓儿莞尔万百万萬
xia#虾虾仁青虾大虾虾皮对虾虾子虾酱虾兵虾米龙虾噶厦厦门吓唬吓人惊吓天虾龙虾皮皮虾麦虾
xi#栖栖系关系星系水系系念体系联系系列菜系世系蹊蹊径溪洗
xiao#校学校切削削面刀削刮削
xian#纤细光纤纤巧纤柔纤小纤维纤瘦纤纤化纤纤秀棉纤纤尘
xiang#巷街巷僻巷巷子龙门巷六巷龙湾巷龙港巷龙泉巷龙巷龙妙巷龄巷齐家巷鼓楼巷鼓巷黎明巷麻子巷麻园巷麦子巷鹊巷
xie#解数出血采血换血血糊尿血淤血放血血晕血淋便血吐血咯血叶韵蝎蝎子
xiu#铜臭乳臭成宿星宿
xin#馨信鸿信
xing#深省省视内省不省人事省悟省察行旅行例行行程行乐龙行人行流行先行行星品行发行行政风行龙行龍行麟行
xu#牧畜畜产畜牧畜养吁气吁喘吁吁吁麦埂圩
xue#削削减削弱削瘦削球削平削价瘦削剥削削职删削削肩血吸血
xun#荨荨麻荨麻疹
ya#芽
yao#发疟疟子约斤称约钥匙金钥耀
yan#吞咽咽气咽喉殷红腌腌制腌肉腌菜烟烟草名烟烟酒
ye#抽咽哽咽咽炎下咽呜咽幽咽悲咽叶绿叶叶子荷叶落叶菜叶红叶树叶枫叶茶叶葉鸿葉液
yi#自艾惩艾后尾遗屹
yin#殷殷勤殷墟殷切殷鉴
yo#杭育
yu#谷浑呼吁吁请吁求育体育教育育儿熨帖熨烫於
yuan#员
yun#熨熨斗电熨斗
yue#乐音器乐乐律乐章音乐乐理民乐乐队声乐奏乐弦乐乐坛管乐配乐乐曲乐谱锁钥密钥乐团鼓乐社乐器栎阳约约会
zan#积攒
zang#宝藏藏历藏文藏香藏语藏青藏族藏医藏戏藏药藏蓝蔵
ze#择择善
zeng#曾孙曾祖
za#绑扎结扎包扎捆扎
zai#牛仔龟仔龙仔鼻仔羊仔仔仔麻仔麵包仔麦旺仔鸿仔煲仔福仔
zha#扎马扎挣扎扎啤扎根扎手扎针扎花扎堆扎营扎实稳扎柞水麻扎镇麻扎乡喳栅栏
zhai#择菜
zhan#不粘粘贴粘连
zhao#朝朝明朝朝晖朝夕朝思有朝今朝朝气朝三朝秦朝霞鹰爪龙爪魔爪爪牙失着着数龙爪槐
zhe#折破折打折叠曲折折冲存折折合折旧折纸骨折折返折价折算波折折扇对折不折折扣七折折中拙著要著著文新著着本着对着
zhi#标识嘎吱咯吱吱扭吱吱繁殖增殖养生殖殖民枝
zhong#重重量鹏重种
zhou#粥
zhu#属意著录撰著名著专著著述著作显著昭著原著著名著书遗著论著著者编著卓著译著著称
zhua#爪
zhui#椎椎骨尾椎椎间腰椎胸椎颈椎脊椎
zhuo#执著着装着落着意着力附着着笔胶着着手着重穿着衣着执着着眼着墨着实沉着着陆着想着色
zhuang#幢房一幢幢楼
zi#吱声兹来兹今兹仔细仔猪
zu#足沐足足道
zuo#撮毛小撮柞绸柞蚕柞树柞木
zui#咀唇尖沙咀黄达咀黄土咀鹰咀

[Java] 纯文本查看 复制代码
import java.io.BufferedReader;    
import java.io.IOException;    
import java.io.InputStream;    
import java.io.InputStreamReader;    
import java.util.Arrays;    
import java.util.HashMap;    
import java.util.List;    
import java.util.Map;    

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;    

/**  
 * 汉字转拼音,能处理多音字
 * 
 *   
 */    

public class ChineseToHanYuPYTest {    

    private static Map<String, List<String>> pinyinMap = new HashMap<String, List<String>>();    
    private static long count = 0;    

    public static void main(String[] args) {    

        String str = "中国银行长沙分行";    
//      String str = "龙港巷店";    

        initPinyin("/duoyinzi_dic.txt");    

        String py = convertChineseToPinyin(str);    
        System.out.println(str+" = "+py);    

    }    

    /**  
     * 将某个字符串的首字母大写
     * @param str  
     * @return  
     */    
    public static String convertInitialToUpperCase(String str){    
        if(str==null){    
            return null;    
        }    
        StringBuffer sb = new StringBuffer();    
        char[] arr = str.toCharArray();    
        for(int i=0;i<arr.length;i++){    
            char ch = arr[i];    
            if(i==0){    
                sb.append(String.valueOf(ch).toUpperCase());    
            }else{    
                sb.append(ch);    
            }    
        }    

        return sb.toString();    
    }    

    /**  
     * 汉字转拼音最大匹配优先
     * @param chinese  
     * @return  
     */    
    private static String convertChineseToPinyin(String chinese) {    

        StringBuffer pinyin = new StringBuffer();    

        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();    
        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);    
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);    

        char[] arr = chinese.toCharArray();    

        for (int i = 0; i < arr.length; i++) {    

            char ch = arr[i];    

            if (ch > 128) { // 非ASCII码
                // 取得当前汉字的所有全拼
                try {    

                    String[] results = PinyinHelper.toHanyuPinyinStringArray(    
                            ch, defaultFormat);    

                    if (results == null) {  //非中文

                        return "";    
                    } else {    

                        int len = results.length;    

                        if (len == 1) { // 不是多音字

//                          pinyin.append(results[0]);    
                            String py = results[0];         
                            if(py.contains("u:")){  //过滤 u:    
                                py = py.replace("u:", "v");    
                                System.out.println("filter u:"+py);    
                            }    
                            pinyin.append(convertInitialToUpperCase(py));    

                        }else if(results[0].equals(results[1])){    //非多音字有多个音,取第一个

//                          pinyin.append(results[0]);    
                            pinyin.append(convertInitialToUpperCase(results[0]));    

                        }else { // 多音字

                            System.out.println("多音字:"+ch);    

                            int length = chinese.length();    

                            boolean flag = false;    

                            String s = null;    

                            List<String> keyList =null;    

                            for (int x = 0; x < len; x++) {    

                                String py = results[x];    

                                if(py.contains("u:")){  //过滤 u:    
                                    py = py.replace("u:", "v");    
                                    System.out.println("filter u:"+py);    
                                }    

                                keyList = pinyinMap.get(py);    

                                if (i + 3 <= length) {   //后向匹配2个汉字大西洋
                                    s = chinese.substring(i, i + 3);    
                                    if (keyList != null && (keyList.contains(s))) {    
//                                  if (value != null && value.contains(s)) {    

                                        System.out.println("last 2 > " + py);    
//                                      pinyin.append(results[x]);    [/i][/i][i][i]                                         pinyin.append(convertInitialToUpperCase(py));    
                                        flag = true;    
                                        break;    
                                    }    
                                }    

                                if (i + 2 <= length) {   //后向匹配 1个汉字大西
                                    s = chinese.substring(i, i + 2);    
                                    if (keyList != null && (keyList.contains(s))) {    

                                        System.out.println("last 1 > " + py);    
//                                      pinyin.append(results[x]);    
                                        pinyin.append(convertInitialToUpperCase(py));    
                                        flag = true;    
                                        break;    
                                    }    
                                }    

                                if ((i - 2 >= 0) && (i+1<=length)) {  // 前向匹配2个汉字龙固大
                                    s = chinese.substring(i - 2, i+1);    
                                    if (keyList != null && (keyList.contains(s))) {    

                                        System.out.println("before 2 < " + py);    
//                                      pinyin.append(results[x]);    
                                        pinyin.append(convertInitialToUpperCase(py));    
                                        flag = true;    
                                        break;    
                                    }    
                                }    

                                if ((i - 1 >= 0) && (i+1<=length)) {  // 前向匹配1个汉字固大
                                    s = chinese.substring(i - 1, i+1);    
                                    if (keyList != null && (keyList.contains(s))) {    

                                        System.out.println("before 1 < " + py);    
//                                      pinyin.append(results[x]);    
                                        pinyin.append(convertInitialToUpperCase(py));    
                                        flag = true;    
                                        break;    
                                    }    
                                }    

                                if ((i - 1 >= 0) && (i+2<=length)) {  //前向1个,后向1个固大西
                                    s = chinese.substring(i - 1, i+2);    
                                    if (keyList != null && (keyList.contains(s))) {    

                                        System.out.println("before last 1 <> " + py);    
//                                      pinyin.append(results[x]);    
                                        pinyin.append(convertInitialToUpperCase(py));    
                                        flag = true;    
                                        break;    
                                    }    
                                }    
                            }    

                            if (!flag) {    //都没有找到,匹配默认的读音大

                                s = String.valueOf(ch);    

                                for (int x = 0; x < len; x++) {    

                                    String py = results[x];    

                                    if(py.contains("u:")){  //过滤 u:    
                                        py = py.replace("u:", "v");    
                                        System.out.println("filter u:");    
                                    }    

                                    keyList = pinyinMap.get(py);    

                                    if (keyList != null && (keyList.contains(s))) {    

                                        System.out.println("default = " + py);    
//                                      pinyin.append(results[x]);  //如果不需要拼音首字母大写,直接返回即可
                                        pinyin.append(convertInitialToUpperCase(py));//拼音首字母大写
                                        break;    
                                    }    
                                }    
                            }    
                        }    
                    }    

                } catch (BadHanyuPinyinOutputFormatCombination e) {    
                    e.printStackTrace();    
                }    
            } else {    
                pinyin.append(arr[i]);    
            }    
        }    
        return pinyin.toString();    
    }    

    /**  
     * 初始化所有的多音字词组
     *   
     * @param fileName  
     */    
    public static void initPinyin(String fileName) {    
        // 读取多音字的全部拼音表;    
        InputStream file = PinyinHelper.class.getResourceAsStream(fileName);    

        BufferedReader br = new BufferedReader(new InputStreamReader(file));    

        String s = null;    
        try {    
            while ((s = br.readLine()) != null) {    

                if (s != null) {    
                    String[] arr = s.split("#");    
                    String pinyin = arr[0];    
                    String chinese = arr[1];    

                    if(chinese!=null){    
                        String[] strs = chinese.split(" ");    
                        List<String> list = Arrays.asList(strs);    
                        pinyinMap.put(pinyin, list);    
                    }    
                }    
            }    

        } catch (IOException e) {    
            e.printStackTrace();    
        }finally{    
            try {    
                br.close();    
            } catch (IOException e) {    
                e.printStackTrace();    
            }    
        }    
    }    
}    


运行结果:
多音字:行
before 1 < hang
多音字:长
last 1 > chang
多音字:行
before 1 < hang

中国银行长沙分行 = ZhongGuoYinHangChangShaFenHang


1 个回复

倒序浏览
谢谢老师分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马