pinyin4j獲取漢字正確的全拼和簡拼

jopen 10年前發布 | 93K 次閱讀 Java開發 Pinyin4j

需要獲取漢字的拼音然后根據拼音來實現快速搜索。Java方面有PinYin4j開源項目獲取漢字的拼音,但是對多音字處理的不好,自己研究了一下,終于給解決了。在這里跟大家分享一下!

 

 

工程目錄結構如下

1363751457_9088.png

 

原理:將可能出現的多音字 詞組組合起來,用正確拼音當作其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#咀唇 尖沙咀 黃達咀 黃土咀 鷹咀

ChineseToHanYuPYTest類

</div> </div>

    package com.yulore.pinyin;

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;  

/** 
 * 漢字轉拼音,能處理多音字 
 *  
 * @author feng bingbing 
 *  
 */  

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]);  
                                        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();  
            }  
        }  
    }  
}  </pre><br />


運行結果

多音字:行
before 1 < hang
多音字:長
last 1 > chang
多音字:行
before 1 < hang
中國銀行長沙分行 = ZhongGuoYinHangChangShaFenHang

來自:http://blog.csdn.net/fx_sky/article/details/8531483

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!