NLP自然語言處理-漢字拼音轉(zhuǎn)換
簡介
特性
- https://github.com/mozillazg/python-pinyin#id1
- 根據(jù)詞組智能匹配最正確的拼音声离。
- 支持多音字。
- 簡單的繁體支持, 注音支持胀屿。
- 支持多種不同拼音/注音風(fēng)格抄罕。
安裝
$ pip install pypinyin
使用示例
Python 3(Python 2 下把 ‘中心’ 替換為 u’中心’ 即可):
>>> from pypinyin import pinyin, lazy_pinyin, Style
>>> pinyin('中心')
[['zhōng'], ['xīn']]
>>> pinyin('中心', heteronym=True) # 啟用多音字模式
[['zhōng', 'zhòng'], ['xīn']]
>>> pinyin('中心', style=Style.FIRST_LETTER) # 設(shè)置拼音風(fēng)格
[['z'], ['x']]
>>> pinyin('中心', style=Style.TONE2, heteronym=True)
[['zho1ng', 'zho4ng'], ['xi1n']]
>>> pinyin('中心', style=Style.TONE3, heteronym=True)
[['zhong1', 'zhong4'], ['xin1']]
>>> pinyin('中心', style=Style.BOPOMOFO) # 注音風(fēng)格
[['ㄓㄨㄥ'], ['ㄒㄧㄣ']]
>>> lazy_pinyin('中心') # 不考慮多音字的情況
['zhong', 'xin']
>>> lazy_pinyin('戰(zhàn)略', v_to_u=True) # 不使用 v 表示 ü
['zhan', 'lüe']
# 使用 5 標(biāo)識輕聲
>>> lazy_pinyin('衣裳', style=Style.TONE3, neutral_tone_with_five=True)
['yi1', 'shang5']
注意事項 :
默認(rèn)情況下拼音結(jié)果不會標(biāo)明哪個韻母是輕聲,輕聲的韻母沒有聲調(diào)或數(shù)字標(biāo)識(可以通過參數(shù) neutral_tone_with_five=True 開啟使用 5 標(biāo)識輕聲 )。
默認(rèn)情況下無聲調(diào)相關(guān)拼音風(fēng)格下的結(jié)果會使用 v 表示 ü (可以通過參數(shù) v_to_u=True 開啟使用 ü 代替 v )逛拱。
默認(rèn)情況下會原樣輸出沒有拼音的字符(自定義處理沒有拼音的字符的方法見 文檔 )。
命令行工具:
$ pypinyin 音樂 yīn yuè $ pypinyin -h
文檔
- 詳細(xì)文檔請訪問:http://pypinyin.rtfd.io/ 台猴。
- 項目代碼開發(fā)方面的問題可以看看 開發(fā)文檔 https://pypinyin.readthedocs.io/zh_CN/develop/develop.html 朽合。
FAQ
詞語中的多音字拼音有誤?
目前是通過詞組拼音庫的方式來解決多音字問題的饱狂。如果出現(xiàn)拼音有誤的情況曹步, 可以自定義詞組拼音來調(diào)整詞語中的拼音:
>>> from pypinyin import Style, pinyin, load_phrases_dict
>>> pinyin('步履蹣跚')
[['bù'], ['lǚ'], ['mán'], ['shān']]
>>> load_phrases_dict({'步履蹣跚': [['bù'], ['lǚ'], ['pán'], ['shān']]})
>>> pinyin('步履蹣跚')
[['bù'], ['lǚ'], ['pán'], ['shān']]
為什么沒有 y, w, yu 幾個聲母?
>>> from pypinyin import Style, pinyin
>>> pinyin('下雨天', style=Style.INITIALS)
[['x'], [''], ['t']]
因為根據(jù) 《漢語拼音方案》 休讳, y讲婚,w,ü (yu) 都不是聲母俊柔。
聲母風(fēng)格(INITIALS)下筹麸,“雨”活合、“我”、“圓”等漢字返回空字符串物赶,因為根據(jù) 《漢語拼音方案》 白指, y,w酵紫,ü (yu) 都不是聲母侵续,在某些特定韻母無聲母時,才加上 y 或 w憨闰,而 ü 也有其特定規(guī)則状蜗。 —— @hotoo
如果你覺得這個給你帶來了麻煩,那么也請小心一些無聲母的漢字(如“啊”鹉动、“餓”轧坎、“按”、“昂”等)泽示。 這時候你也許需要的是首字母風(fēng)格(FIRST_LETTER)缸血。 —— @hotoo
參考: hotoo/pinyin#57, #22, #27, #44
如果覺得這個行為不是你想要的,就是想把 y 當(dāng)成聲母的話械筛,可以指定 strict=False 捎泻, 這個可能會符合你的預(yù)期:
>>> from pypinyin import Style, pinyin
>>> pinyin('下雨天', style=Style.INITIALS)
[['x'], [''], ['t']]
>>> pinyin('下雨天', style=Style.INITIALS, strict=False)
[['x'], ['y'], ['t']]
詳見 strict 參數(shù)的影響 。
如何減少內(nèi)存占用
如果對拼音的準(zhǔn)確性不是特別在意的話埋哟,可以通過設(shè)置環(huán)境變量 PYPINYIN_NO_PHRASES 和 PYPINYIN_NO_DICT_COPY 來節(jié)省內(nèi)存笆豁。 詳見 文檔
更多 FAQ 詳見文檔中的 FAQ 部分。
拼音數(shù)據(jù)
- 單個漢字的拼音使用 pinyin-data 的數(shù)據(jù)
- 詞組的拼音使用 phrase-pinyin-data 的數(shù)據(jù)
- 聲母和韻母使用 《漢語拼音方案》 的數(shù)據(jù)
Related Projects
hotoo/pinyin: 漢字拼音轉(zhuǎn)換工具 Node.js/JavaScript 版赤赊。
mozillazg/go-pinyin: 漢字拼音轉(zhuǎn)換工具 Go 版闯狱。
mozillazg/rust-pinyin: 漢字拼音轉(zhuǎn)換工具 Rust 版。
實現(xiàn)原理
主邏輯:
- 對輸入的字符串按是否是漢字進(jìn)行分詞(seg)
- 對分詞結(jié)果的每個詞條進(jìn)行獲取詞條拼音的邏輯
2.1 檢查詞條是否是漢字抛计,不是漢字則走處理沒有拼音數(shù)據(jù)的邏輯(handle_nopinyin)
2.2 檢查詞條是否在 PHRASES_DICT 中哄孤,如果在直接取 PHRASES_DICT 中這個詞條的拼音數(shù)據(jù) 2.3 如果詞條不在 PHRASES_DICT 中,遍歷詞條包含的字符吹截,每個字符進(jìn)行 single_pinyin 邏輯處理 - single_pinyin 的邏輯:
3.1 檢查字符是否在 PINYIN_DICT 中瘦陈,如果在的話,取 PINYIN_DICT 中這個字符的拼音數(shù)據(jù) 3.2 如果不在的話波俄,走 handle_nopinyin 邏輯 - handle_nopinyin 邏輯: 根據(jù) errors 參數(shù)的值返回不同的結(jié)果晨逝。
- 對上面的步驟獲得的拼音數(shù)據(jù)按指定的拼音風(fēng)格進(jìn)行轉(zhuǎn)換。
- PHRASES_DICT:詞組拼音數(shù)據(jù)
- PINYIN_DICT: 單個漢字的拼音數(shù)據(jù)
本文使用 文章同步助手 同步