漢字轉(zhuǎn)拼音工具庫

僅做收藏用

最近需要實現(xiàn)漢字轉(zhuǎn)拼音功能,找了一個簡單的vue-py,結(jié)果很多生僻字轉(zhuǎn)不了乏矾,后來找了一個能很好轉(zhuǎn)拼音的工具類

一個實現(xiàn)漢字與拼音互轉(zhuǎn)的小巧web工具庫,另外還包含一個非常非常簡單的JS版拼音輸入法。

演示地址:http://demo.haoji.me/pinyinjs/

支持多音字演示:http://demo.haoji.me/pinyinjs/polyphone.html

更多詳細(xì)介紹:http://blog.haoji.me/pinyinjs.html

本工具的優(yōu)點:

  1. 體積足夠小钻心,適合web環(huán)境凄硼,常見漢字字典文件僅26kb,完整漢字也只有122kb捷沸,應(yīng)該說是互聯(lián)網(wǎng)上最小的摊沉;
  2. 支持多種輸出格式,如帶聲調(diào)痒给、不帶聲調(diào)说墨、拼音首字母;
  3. 支持多音字:如果不引入詞庫文件苍柏,會將所有結(jié)果枚舉出來尼斧,如果引入詞庫,則可以識別多音字(當(dāng)然識別的準(zhǔn)確度有待持續(xù)完善)试吁,由于詞庫較大棺棵,一般不推薦web環(huán)境使用;
  4. 附帶一個簡單的JS版拼音輸入法熄捍;

前言

網(wǎng)上關(guān)于JS實現(xiàn)漢字和拼音互轉(zhuǎn)的文章很多烛恤,但是比較雜亂,都是互相抄來抄去余耽,而且有的不支持多音字棒动,有的不支持聲調(diào),有的字典文件太大宾添,還比如有時候我僅僅是需要獲取漢字拼音首字母卻要引入200kb的字典文件船惨,無法根據(jù)實際需要滿足需求。

綜上缕陕,我精心整理并修改了網(wǎng)上幾種常見的字典文件并簡單封裝了一下可以直接拿來用的工具庫粱锐。

關(guān)于多音字

鑒于很多人都比較關(guān)心多音字的問題,所以單獨拿出一個小章節(jié)來介紹多音字的相關(guān)問題扛邑。

準(zhǔn)確識別各種復(fù)雜語句中混雜的多音字其實并沒有那么容易怜浅,有兩個關(guān)鍵的地方,一個是多音字詞庫的豐富程度蔬崩,一個是能否正確的給語句進行分詞恶座。而詞庫和分詞的實現(xiàn)都需要一個非常豐富的詞典文件,現(xiàn)代漢語詞語有多少個沥阳,估計沒有人算得清跨琳,再加上每天新出現(xiàn)的人名、網(wǎng)絡(luò)詞語桐罕、科技詞語等等脉让。一個普通的詞庫文件至少也有幾百kb桂敛,所以不太適合web環(huán)境下去實現(xiàn),一般最好放在服務(wù)器端做成一個接口溅潜。

鑒于很多人都希望有多音字識別的功能术唬,所以我簡單實現(xiàn)了一個版本。詞庫文件是從這里找到的滚澜,并根據(jù)實際情況將文件從1.8M壓縮到了912kb粗仓,分詞暫時只是自己非常簡單的實現(xiàn)(也可以說壓根就沒有分詞),如果是服務(wù)器端推薦幾個不錯的中文分詞工具:Python版的JiebaNodeJieba设捐,性能非常好借浊,其它語言版的參考上面項目的README。

關(guān)于分詞挡育,摘抄一段網(wǎng)絡(luò)解釋:

詞是最小的能夠獨立活動的有意義的語言成分巴碗,英文單詞之間是以空格作為自然分界符的,而漢語是以字為基本的書寫單位即寒,詞語之間沒有明顯的區(qū)分標(biāo)記橡淆,因此,要對中文信息進行處理母赵,正確的分詞就顯得尤為關(guān)鍵逸爵。

比如看中國這一個詞,單獨的看中kàn zhòng凹嘲,中國zhōng guó师倔,連在一起卻讀作kàn zhōng guó

我這個實現(xiàn)非常得簡單周蹭,效果一般趋艘,性能也一般,需要下載將近1M的詞庫文件凶朗,所以不適合web環(huán)境瓷胧,演示地址:

http://demo.haoji.me/pinyinjs/polyphone.html

拼音字典文件

按照字典文件的大小從小到大依次介紹。

字典一:拼音首字母

字典文件的內(nèi)容大致如下:

/**
 * 拼音首字母字典文件
 */
var pinyin_dict_firstletter = {};
pinyin_dict_firstletter.all = "YDYQSXMWZSSXJBYMGCCZQPSSQBYCDSCDQLDYLYBSSJG...";
pinyin_dict_firstletter.polyphone = {"19969":"DZ","19975":"WM","19988":"QJ","20048":"YL",...};

該數(shù)據(jù)字典將Unicode字符中4E00(19968)-9FA5(40869)共計20902個漢字的拼音首字母拼接在一起得到一個很長的字符串棚愤,然后再將有多音字的漢字(共計370個多音字)單獨列出來搓萧。該字典文件大小為25kb

該字典文件優(yōu)點是體積小宛畦,支持多音字瘸洛,缺點是只能獲取拼音首字母。

字典二:常用漢字

該字典文件將漢字按照拼音進行歸類次和,共計401種組合反肋,收錄了6763個常用漢字,不支持多音字斯够。由于從網(wǎng)絡(luò)上收集的囚玫,收錄字?jǐn)?shù)較少喧锦,所以文件體積只有24kb读规,后續(xù)有空看能不能給擴充一下抓督。

字典文件大致內(nèi)容如下(這里只是示例,所以只展示一小部分):

/**
 * 常規(guī)拼音數(shù)據(jù)字典束亏,收錄常見漢字6763個铃在,不支持多音字
 */
var pinyin_dict_notone = 
{
    "a":"啊阿錒",
    "ai":"埃挨哎唉哀皚癌藹矮艾礙愛隘誒捱噯嗌嬡璦曖砹锿靄",
    "an":"鞍氨安俺按暗岸胺案諳埯揞犴庵桉銨鵪頇黯",
    "ang":"骯昂盎",
    "ao":"凹敖熬翱襖傲奧懊澳坳拗嗷噢岙廒遨媼驁聱螯鏊鰲鏖",
    "ba":"芭捌扒叭吧笆八疤巴拔跋靶把耙壩霸罷爸茇菝萆捭岜灞杷鈀粑鲅魃",
    "bai":"白柏百擺佰敗拜稗薜掰鞴",
    "ban":"斑班搬扳般頒板版扮拌伴瓣半辦絆阪坂豳鈑瘢癍舨",
    "bang":"邦幫梆榜膀綁棒磅蚌鎊傍謗蒡螃",
    "bao":"苞胞包褒雹保堡飽寶抱報暴豹鮑爆勹葆宀孢煲鴇褓趵齙",
    "bo":"剝薄玻菠播撥缽波博勃搏鉑箔伯帛舶脖膊渤泊駁亳蕃啵餑檗擘礴鈸鵓簸跛",
    "bei":"杯碑悲卑北輩背貝鋇倍狽備憊焙被孛陂邶埤蓓唄怫悖碚鵯褙鐾",
    "ben":"奔苯本笨畚坌錛"
    // 省略其它
};

后來慢慢發(fā)現(xiàn)這個字典文件中存在諸多錯誤,比如把的拼音寫成了nue(正確寫法應(yīng)該是nve),寫成了thang碍遍,而且不支持多音字定铜,所以后來我根據(jù)其它字典文件自己重新生成了一份這樣格式的 字典文件

  • 共有404種拼音組合
  • 收錄了6763個常用漢字
  • 支持多音字
  • 不支持聲調(diào)
  • 文件大小為27kb

同時,我根據(jù)網(wǎng)上一份常用6763個漢字使用頻率表怕敬,將這6763個漢字按照使用頻率進行了排序揣炕,這樣就可以實現(xiàn)一個差強人意的JS版輸入法了。

另外东跪,根據(jù)另外一份更完整的字典文件發(fā)現(xiàn)其實共有412種拼音組合畸陡,上面字典文件中沒有出現(xiàn)的8種發(fā)音是:

chua,den,eng,fiao,m,kei,nun,shei

字典三:終極字典

首先,從網(wǎng)上找的如下結(jié)構(gòu)字典文件(下面稱為字典A)虽填,具體是哪不記得了丁恭,支持聲調(diào)和多音字,它將Unicode字符中4E00(19968)-9FA5(40869)共計20902個漢字(如果算上〇的話那就是20903個)拼音全部列舉斋日,該字典文件大小為280kb

3007 (ling2)
4E00 (yi1)
4E01 (ding1,zheng1)
4E02 (kao3)
4E03 (qi1)
4E04 (shang4,shang3)
4E05 (xia4)
4E06 (none0)
4E07 (wan4,mo4)
4E08 (zhang4)
4E09 (san1)
4E0A (shang4,shang3)
4E0B (xia4)
4E0C (ji1)
4E0D (bu4,bu2,fou3)
4E0E (yu3,yu4,yu2)
4E0F (mian3)
4E10 (gai4)
4E11 (chou3)
4E12 (chou3)
4E13 (zhuan1)
4E14 (qie3,ju1)
...

其中牲览,對于沒有或者找不到讀音的漢字,統(tǒng)一標(biāo)注為none0恶守,我統(tǒng)計了一下第献,這樣的漢字一共有525個。

本著將字典文件盡可能減小體積的目標(biāo)兔港,發(fā)現(xiàn)上述文件中除了第一個〇(3007)之外庸毫,其它都是連續(xù)的,所以我把它改成了如下結(jié)構(gòu)押框,文件體積也從280kb減小到了117kb

var pinyin_dict_withtone = "yi1,ding1 zheng1,kao3,qi1,shang4 shang3,xia4,none0,wan4 mo4,zhang4,san1,shang4 shang3,xia4,ji1,bu4 bu2 fou3,yu3 yu4 yu2,mian3,gai4,chou3,chou3,zhuan1,qie3 ju1...";

該字典文件的缺點是聲調(diào)是用數(shù)字標(biāo)出的岔绸,如果想要得出類似xiǎo míng tóng xué這樣的拼音的話,需要一個算法將合適位置的字母轉(zhuǎn)換成āáǎàōóǒòēéěèīíǐìūúǔùüǖǘǚǜńň橡伞。

本來還準(zhǔn)備自己嘗試寫一個轉(zhuǎn)換的方法的盒揉,后來又找到了如下字典文件(下面稱為字典B),它收錄了20867個漢字兑徘,也支持聲調(diào)和多音字刚盈,但是聲調(diào)是直接標(biāo)在字母上方的,由于它將漢字也列舉出來挂脑,所以文件體積比較大藕漱,有327kb欲侮,大致內(nèi)容如下:

{
    "吖": "yā,ā",
    "阿": "ā,ē",
    "呵": "hē,a,kē",
    "嗄": "shà,á",
    "啊": "ā,á,ǎ,à,a",
    "腌": "ā,yān",
    "錒": "ā",
    "錒": "ā",
    "矮": "ǎi",
    "愛": "ài",
    "挨": "āi,ái",
    "哎": "āi",
    "礙": "ài",
    "癌": "ái",
    "艾": "ài",
    "唉": "āi,ài",
    "藹": "ǎi"
    /* 省略其它 */
}

但是經(jīng)過比對,發(fā)現(xiàn)有502個漢字是字典A中讀音為none但是字典B中有讀音的肋联,還有21個漢字是字典A中有但是B中沒有的:

{
    "兙": "shí kè",
    "兛": "qiān",
    "兝": "fēn",
    "兞": "máo",
    "兡": "bǎi kè",
    "兣": "lǐ",
    "唞": "dǒu",
    "嗧": "jiā lún",
    "囍": "xǐ",
    "堎": "lèng líng",
    "猤": "hú",
    "瓩": "qián wǎ",
    "礽": "réng",
    "膶": "rùn",
    "芿": "rèng",
    "蟘": "tè",
    "貣": "tè",
    "釀": "niàng niàn niáng",
    "醸": "niàng",
    "鋱": "tè",
    "鋱": "tè"
}

還有7個漢字是B中有但是A中沒有的:

{
    "?": "lēng",
    "?": "léng",
    "?": "léng",
    "?": "lèng",
    "?": "lèng,lì,lìn",
    "?": "réng",
    "?": "niàng"
}

所以我在字典A的基礎(chǔ)上將二者進行了合并威蕉,得到了最終的字典文件 pinyin_dict_withtone.js,文件大小為122kb

var pinyin_dict_withtone = "yī,dīng zhēng,kǎo qiǎo yú,qī,shàng,xià,hǎn,wàn mò,zhàng,sān,shàng shǎng,xià,qí jī...";

如何使用

我將這幾種字典文件放在一起并簡單封裝了一下解析方法橄仍,使用中可以根據(jù)實際需要引入不同字典文件韧涨。

封裝好的3個方法:

/**
 * 獲取漢字的拼音首字母
 * @param str 漢字字符串,如果遇到非漢字則原樣返回
 * @param polyphone 是否支持多音字侮繁,默認(rèn)false虑粥,如果為true,會返回所有可能的組合數(shù)組
 */
pinyinUtil.getFirstLetter(str, polyphone);
/**
 * 根據(jù)漢字獲取拼音宪哩,如果不是漢字直接返回原字符
 * @param str 要轉(zhuǎn)換的漢字
 * @param splitter 分隔字符娩贷,默認(rèn)用空格分隔
 * @param withtone 返回結(jié)果是否包含聲調(diào),默認(rèn)是
 * @param polyphone 是否支持多音字锁孟,默認(rèn)否
*/
pinyinUtil.getPinyin(str, splitter, withtone, polyphone);
/**
 * 拼音轉(zhuǎn)漢字彬祖,只支持單個漢字,返回所有匹配的漢字組合
 * @param pinyin 單個漢字的拼音罗岖,不能包含聲調(diào)
 */
pinyinUtil.getHanzi(pinyin)涧至;

下面分別針對不同場合如何使用作介紹。

如果你只需要獲取拼音首字母

<script type="text/javascript" src="pinyin_dict_firstletter.js"></script>
<script type="text/javascript" src="pinyinUtil.js"></script>

<script type="text/javascript">
pinyinUtil.getFirstLetter('小茗同學(xué)'); // 輸出 XMTX
pinyinUtil.getFirstLetter('大中國', true); // 輸出 ['DZG', 'TZG']
</script>

需要特別說明的是桑包,如果你引入的是其它2個字典文件南蓬,也同樣可以獲取拼音首字母的,只是說用這個字典文件更適合哑了。

如果拼音不需要聲調(diào)

<script type="text/javascript" src="pinyin_dict_notone.js"></script>
<script type="text/javascript" src="pinyinUtil.js"></script>

<script type="text/javascript">
pinyinUtil.getPinyin('小茗同學(xué)'); // 輸出 'xiao ming tong xue'
pinyinUtil.getHanzi('ming'); // 輸出 '明名命鳴銘冥茗溟酩瞑螟暝'
</script>

如果需要聲調(diào)或者需要處理生僻字

<script type="text/javascript" src="pinyin_dict_withtone.js"></script>
<script type="text/javascript" src="pinyinUtil.js"></script>

<script type="text/javascript">
pinyinUtil.getPinyin('小茗同學(xué)'); // 輸出 'xiǎo míng tóng xué'
pinyinUtil.getPinyin('小茗同學(xué)', '-', true, true); // 輸出 ['xiǎo-míng-tóng-xué', 'xiǎo-míng-tòng-xué']
</script>

如果需要精準(zhǔn)識別多音字

由于詞典文件較大赘方,本示例不推薦在web環(huán)境下使用:

<script type="text/javascript" src="dict/pinyin_dict_withtone.js"></script>
<script type="text/javascript" src="dict/pinyin_dict_polyphone.js"></script>
<script type="text/javascript" src="pinyinUtil.js"></script>

<script type="text/javascript">
pinyinUtil.getPinyin('長城和長大', ' ', true, true); // 輸出:cháng chéng hé zhǎng dà
pinyinUtil.getPinyin('喝水和喝彩', ' ', true, true)弱左; // 輸出:hē shuǐ hé hè cǎi
pinyinUtil.getPinyin('偉大的大夫', ' ', true, true)窄陡; // 輸出:wěi dà de dài fū
</script>

關(guān)于簡單拼音輸入法

一個正式的輸入法需要考慮的東西太多太多,比如詞庫拆火、用戶個人輸入習(xí)慣等跳夭,這里只是實現(xiàn)一個最簡單的輸入法,沒有任何詞庫(雖然加上也可以们镜,但是web環(huán)境不適合引入太大的文件)币叹。

推薦使用第二個字典文件pinyin_dict_noletter.js,雖然字典三字?jǐn)?shù)更多模狭,但是不能按照漢字使用頻率排序颈抚,一些生僻字反而在前面。

<link rel="stylesheet" type="text/css" href="simple-input-method/simple-input-method.css">
<input type="text" class="test-input-method"/>
<script type="text/javascript" src="pinyin_dict_noletter.js"></script>
<script type="text/javascript" src="pinyinUtil.js"></script>
<script type="text/javascript" src="simple-input-method/simple-input-method.js"></script>
<script type="text/javascript">
    SimpleInputMethod.init('.test-input-method');
</script>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嚼鹉,一起剝皮案震驚了整個濱河市贩汉,隨后出現(xiàn)的幾起案子驱富,更是在濱河造成了極大的恐慌,老刑警劉巖匹舞,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件褐鸥,死亡現(xiàn)場離奇詭異,居然都是意外死亡策菜,警方通過查閱死者的電腦和手機晶疼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門酒贬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來又憨,“玉大人,你說我怎么就攤上這事锭吨〈垒海” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵零如,是天一觀的道長躏将。 經(jīng)常有香客問我,道長考蕾,這世上最難降的妖魔是什么祸憋? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮肖卧,結(jié)果婚禮上蚯窥,老公的妹妹穿的比我還像新娘。我一直安慰自己塞帐,他們只是感情好拦赠,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著葵姥,像睡著了一般荷鼠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上榔幸,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天允乐,我揣著相機與錄音,去河邊找鬼削咆。 笑死牍疏,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的态辛。 我是一名探鬼主播麸澜,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼奏黑!你這毒婦竟也來了炊邦?” 一聲冷哼從身側(cè)響起编矾,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎馁害,沒想到半個月后窄俏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡碘菜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年凹蜈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忍啸。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡仰坦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出计雌,到底是詐尸還是另有隱情悄晃,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布凿滤,位于F島的核電站妈橄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏翁脆。R本人自食惡果不足惜眷蚓,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望反番。 院中可真熱鬧沙热,春花似錦、人聲如沸恬口。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祖能。三九已至歉秫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間养铸,已是汗流浹背雁芙。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钞螟,地道東北人兔甘。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像鳞滨,于是被迫代替她去往敵國和親洞焙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 封裝好的3個方法: /** * 獲取漢字的拼音首字母 * @param str 漢字字符串熔任,如果遇到非漢字則原樣返...
    他在發(fā)呆閱讀 812評論 0 0
  • (供參考) 老汪這個好多了,語言有些文釆了唁情!而且有話則長疑苔,無話則短,不啰...
    老樹A閱讀 212評論 0 0
  • 北斗七星高甸鸟,崔巖夜帶刀 夏日惦费,遠(yuǎn)足,登山抢韭,這還不夠薪贫,還要加點作料,那么夜深人靜篮绰,北斗七星高后雷,以及背后的跨刀,這夠了...
    four0928閱讀 1,024評論 1 4
  • 今天是2017年8月12日吠各,星期六。 早上睡到八點多勉抓,肚子餓到咕咕叫贾漏,實在頂唔順,起床吃早餐:三條兩指粗的地瓜和一...
    弟哥閱讀 199評論 0 0
  • 我覺得每一個人的內(nèi)心里都有住著一個不完美的自己與完美的他人藕筋,當(dāng)自己不完美的一面與完美的他人產(chǎn)生碰撞時纵散,會產(chǎn)生...
    蘭榴蓮閱讀 354評論 0 0