Python 漢字轉拼音的庫--- PyPinyin
Python 漢字轉拼音的庫--- PyPinyin
Python 中提供了漢字轉拼音的庫,名字叫做 PyPinyin,可以用於漢字注音、排序、檢索等等場合,是基於 hotto/pinyin 這個庫開發的,一些站點連結如下:
-
GitHub:
https://github.com/mozillazg/python-pinyin
-
文件:
https://pypinyin.readthedocs.io/zh_CN/master/
-
PyPi:
https://pypi.org/project/pypinyin/
它有這麼幾個特性:
-
根據片語智慧匹配最正確的拼音。
-
支援多音字。
-
簡單的繁體支援, 注音支援。
-
支援多種不同拼音/注音風格。
是不是等不及了呢?那就讓我們來了解一下它的用法吧!
安裝
首先就是這個庫的安裝了,通過 pip 安裝即可:
pip3 install pypinyin
安裝完成之後匯入一下這個庫,如果不報錯,那就說明安裝成功了。
>>> import pypinyin
好,接下來我們看下它的具體功能。
基本拼音
首先我們進行一下基本的拼音轉換,方法非常簡單,直接呼叫 pinyin 方法即可:
from pypinyin import pinyinprint(pinyin('中心'))
執行結果:
[['zhōng'], ['xīn']]
可以看到結果會是一個二維的列表,每個元素都另外成了一個列表,其中包含了每個字的讀音。
那麼如果這個詞是多音字咋辦呢?比如 "朝陽",它有兩個讀音,我們拿來試下:
from pypinyin import pinyinprint(pinyin('朝陽'))
執行結果:
[['zhāo'], ['yáng']]
好吧,它只給出來了一個讀音,但是如果我們想要另外一種讀音咋辦呢?
其實很簡單,只需新增 heteronym 引數並設定為 True 就好了,我們試下:
from pypinyin import pinyinprint(pinyin('朝陽', heteronym=True))
執行結果:
[['zhāo', 'cháo'], ['yáng']]
OK 了,這下子就顯示出來了兩個讀音了,而且我們也明白了結果為什麼是一個二維列表,因為裡面的一維的結果可能是多個,比如多音字的情況就是這樣。
但這個多少解析起來有點麻煩,很多情況下我們是不需要管多音字的,我們只是用它來轉換一下名字而已,而處理上面的二維陣列又比較麻煩。
所以有沒有一個方法直接給我們一個一維列表呢?有!
我們可以使用 lazy_pinyin 這個方法來生成,嘗試一下:
from pypinyin import pinyinprint(pinyin('聰明的小兔子'))
執行結果:
['cong', 'ming', 'de', 'xiao', 'tu', 'zi']
這時候觀察到得到的是一個列表,並且不再包含音調了。
這裡我們就有一個疑問了,為啥 pinyin 方法返回的結果預設是帶音調的,而 lazy_pinyin 是不帶的,這裡面就涉及到一個風格轉換的問題了。
風格轉換
我們可以對結果進行一些風格轉換,比如不帶聲調風格、標準聲調風格、聲調在拼音之後、聲調在韻母之後、注音風格等等,比如我們想要聲調放在拼音後面,可以這麼來實現:
from pypinyin import lazy_pinyin, Stylestyle = Style.TONE3print(lazy_pinyin('聰明的小兔子', style=style))
執行結果:
['cong1', 'ming2', 'de', 'xiao3', 'tu4', 'zi']
可以看到執行結果每個拼音後面就多了一個聲調,這就是其中的一個風格,叫做 TONE3,其實還有很多風格,下面是我從原始碼裡面找出來的定義:
#: 普通風格,不帶聲調。如: 中國 -> ``zhong guo``NORMAL = 0#: 標準聲調風格,拼音聲調在韻母第一個字母上(預設風格)。如: 中國 -> ``zhōng guó``TONE = 1#: 聲調風格2,即拼音聲調在各個韻母之後,用數字 [1-4] 進行表示。如: 中國 -> ``zho1ng guo2``TONE2 = 2#: 聲調風格3,即拼音聲調在各個拼音之後,用數字 [1-4] 進行表示。如: 中國 -> ``zhong1 guo2``TONE3 = 8#: 聲母風格,只返回各個拼音的聲母部分(注:有的拼音沒有聲母,詳見 `#27`_)。如: 中國 -> ``zh g``INITIALS = 3#: 首字母風格,只返回拼音的首字母部分。如: 中國 -> ``z g``FIRST_LETTER = 4#: 韻母風格,只返回各個拼音的韻母部分,不帶聲調。如: 中國 -> ``ong uo``FINALS = 5#: 標準韻母風格,帶聲調,聲調在韻母第一個字母上。如:中國 -> ``ōng uó``FINALS_TONE = 6#: 韻母風格2,帶聲調,聲調在各個韻母之後,用數字 [1-4] 進行表示。如: 中國 -> ``o1ng uo2``FINALS_TONE2 = 7#: 韻母風格3,帶聲調,聲調在各個拼音之後,用數字 [1-4] 進行表示。如: 中國 -> ``ong1 uo2``FINALS_TONE3 = 9#: 注音風格,帶聲調,陰平(第一聲)不標。如: 中國 -> ``ㄓㄨㄥ ㄍㄨㄛˊ``BOPOMOFO = 10#: 注音風格,僅首字母。如: 中國 -> ``ㄓ ㄍ``BOPOMOFO_FIRST = 11#: 漢語拼音與俄語字母對照風格,聲調在各個拼音之後,用數字 [1-4] 進行表示。如: 中國 -> ``чжун1 го2``CYRILLIC = 12#: 漢語拼音與俄語字母對照風格,僅首字母。如: 中國 -> ``ч г``CYRILLIC_FIRST = 13
有了這些,我們就可以輕鬆地實現風格轉換了。
好,再回到原來的問題,為什麼 pinyin 的方法預設帶聲調,而 lazy_pinyin 方法不帶聲調,答案就是:它們二者使用的預設風格不同,我們看下它的函式定義就知道了:
pinyin 方法的定義如下:
def pinyin(hans, style=Style.TONE, heteronym=False, errors='default', strict=True)
lazy_pinyin 方法的定義如下:
def lazy_pinyin(hans, style=Style.NORMAL, errors='default', strict=True)
這下懂了吧,因為 pinyin 方法預設使用了 TONE 的風格,而 lazy_pinyin 方法預設使用了 NORMAL 的風格,所以就導致二者返回風格不同了。
好了,有了這兩個函式的定義,我們再來研究下其他的引數,比如定義裡面的 errors 和 strict 引數又怎麼用呢?
錯誤處理
在這裡我們先做一個測試,比如我們傳入無法轉拼音的字,比如:
from pypinyin import lazy_pinyinprint(lazy_pinyin('你好☆☆,我是xxx'))
其中包含了星號兩個,還有標點一個,另外還包含了一個 xxx 英文字元,結果會是什麼呢?
['ni', 'hao', '☆☆,', 'wo', 'shi', 'xxx']
可以看到結果中星號和英文字元都作為一個整體並原模原樣返回了。
那麼這種特殊字元可以單獨進行處理嗎?當然可以,這裡就用到剛才提到的 errors 引數了。
errors 引數是有幾種模式的:
-
default:預設行為,不處理,原木原樣返回
-
ignore:忽略字元,直接拋掉
-
replace:直接替換為去掉
\u
的 unicode 編碼 -
callable 物件:當傳入一個可呼叫的物件的時候,則可以自定義處理方式。
下面是 errors 這個引數的原始碼實現邏輯:
def _handle_nopinyin_char(chars, errors='default'): """處理沒有拼音的字元""" if callable_check(errors): return errors(chars) if errors == 'default': return chars elif errors == 'ignore': return None elif errors == 'replace': if len(chars) > 1: return ''.join(text_type('%x' % ord(x)) for x in chars) else: return text_type('%x' % ord(chars))
當處理沒有拼音的字元的時候,errors 的不同引數會有不同的處理結果,更詳細的邏輯可以翻看原始碼。
好了,下面我們來嘗試一下,比如我們想將不能轉拼音的字元去掉,則可以這麼設定:
from pypinyin import lazy_pinyinprint(lazy_pinyin('你好☆☆,我是xxx', errors='ignore'))
執行結果:
['ni', 'hao', 'wo', 'shi']
如果我們想要自定義處理,比如把
☆
轉化為
※
,則可以這麼設定:
print(lazy_pinyin('你好☆☆,我是xxx', errors=lambda item: ''.join(['※' if c == '☆' else c for c in item])))
執行結果:
['ni', 'hao', '※※,', 'wo', 'shi', 'xxx']
如上便是一些相關異常處理的操作,我們可以隨心所欲地處理自己想處理的字元了。
嚴格模式
最後再看下 strict 模式,這個引數用於控制處理聲母和韻母時是否嚴格遵循 《漢語拼音方案》 標準。
下面的一些說明來源於官方文件:
當 strict 引數為 True 時根據 《漢語拼音方案》 的如下規則處理聲母、在韻母相關風格下還原正確的韻母:
-
21 個聲母:
b p m f d t n l g k h j q x zh ch sh r z c s
( y, w 不是聲母 ) -
i行的韻母,前面沒有聲母的時候,寫成yi(衣),ya(呀),ye(耶),yao(腰),you(憂),yan(煙), yin(因),yang(央),ying(英),yong(雍)。( y 不是聲母 )
-
u行的韻母,前面沒有聲母的時候,寫成wu(烏),wa(蛙),wo(窩),wai(歪),wei(威),wan(彎), wen(溫),wang(汪),weng(翁)。( w 不是聲母 )
-
ü行的韻母,前面沒有聲母的時候,寫成yu(迂),yue(約),yuan(冤),yun(暈);ü上兩點省略。 ( 韻母相關風格下還原正確的韻母 ü )
-
ü行的韻跟聲母j,q,x拼的時候,寫成ju(居),qu(區),xu(虛),ü上兩點也省略; 但是跟聲母n,l拼的時候,仍然寫成nü(女),lü(呂)。( 韻母相關風格下還原正確的韻母 ü )
-
iou,uei,uen前面加聲母的時候,寫成iu,ui,un。例如niu(牛),gui(歸),lun(論)。 ( 韻母相關風格下還原正確的韻母 iou,uei,uen )
當 strict 為 False 時就是不遵守上面的規則來處理聲母和韻母, 比如:
y
,
w
會被當做聲母,yu(迂) 的韻母就是一般認為的
u
等。
具體差異可以檢視原始碼中 tests/test_standard.py 中的對比結果測試用例。
自定義拼音
如果對庫返回的結果不滿意,我們還可以自定義自己的拼音庫,這裡用到的方法就有 load_single_dict 和 load_phrases_dict 方法了。
比如剛才我們看到 "朝陽" 兩個字的發音預設返回的是 zhao yang,我們想預設返回 chao yang,那可以這麼做:
from pypinyin import lazy_pinyin, load_phrases_dictprint(lazy_pinyin('朝陽'))personalized_dict = { '朝陽': [['cháo'], ['yáng']]}load_phrases_dict(personalized_dict)print(lazy_pinyin('朝陽'))
這裡我們自定義了一個詞典,然後使用 load_phrases_dict 方法設定了一下就可以了。
執行結果:
['zhao', 'yang']['chao', 'yang']
這樣就可以完成自定義的設定了。
在一些專案裡面我們可以自定義很多拼音庫,然後載入就可以了。
另外我們還可以註冊樣式實現自定義,比如將某個拼音前面加上 Emoji 表情,樣例:
from pypinyin.style import registerfrom pypinyin import lazy_pinyin@register('kiss')def kiss(pinyin, **kwargs): if pinyin == 'me': return f'?{pinyin}' return pinyinprint(lazy_pinyin('麼麼噠', style='kiss'))
執行結果:
['?me', '?me', 'dá']
這裡我們呼叫 register 方法註冊了一個樣式 style,然後轉換的時候指定即可,通過觀察執行結果我們可以發現,這樣我們就可以將 me 字的拼音前面加上 ? 這個 Emoji 表情了。
以上就是 PyPinyin 這個庫的基本用法,更多的用法建議大家看看原始碼或者看 API 文件:https://pypinyin.readthedocs.io/zh_CN/master/api.html。
About Me
........................................................................................................................ ● 本文作者:小麥苗,部分內容整理自網路,若有侵權請聯絡小麥苗刪除 ● 本文在itpub( http://blog.itpub.net/26736162 )、部落格園( http://www.cnblogs.com/lhrbest )和個人weixin公眾號( xiaomaimiaolhr )上有同步更新 ● 本文itpub地址: http://blog.itpub.net/26736162 ● 本文部落格園地址: http://www.cnblogs.com/lhrbest ● 本文pdf版、個人簡介及小麥苗雲盤地址: http://blog.itpub.net/26736162/viewspace-1624453/ ● 資料庫筆試面試題庫及解答: http://blog.itpub.net/26736162/viewspace-2134706/ ● DBA寶典今日頭條號地址: http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826 ........................................................................................................................ ● QQ群號: 230161599 (滿) 、618766405 ● weixin群:可加我weixin,我拉大家進群,非誠勿擾 ● 聯絡我請加QQ好友 ( 646634621 ) ,註明新增緣由 ● 於 2019-05-01 06:00 ~ 2019-05-30 24:00 在魔都完成 ● 最新修改時間:2019-05-01 06:00 ~ 2019-05-30 24:00 ● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解 ● 版權所有,歡迎分享本文,轉載請保留出處 ........................................................................................................................ ● 小麥苗的微店 : https://weidian.com/s/793741433?wfr=c&ifr=shopdetail ● 小麥苗出版的資料庫類叢書 : http://blog.itpub.net/26736162/viewspace-2142121/ ● 小麥苗OCP、OCM、高可用網路班 : http://blog.itpub.net/26736162/viewspace-2148098/ ● 小麥苗騰訊課堂主頁 : https://lhr.ke.qq.com/ ........................................................................................................................ 使用 weixin客戶端 掃描下面的二維碼來關注小麥苗的weixin公眾號( xiaomaimiaolhr )及QQ群(DBA寶典)、新增小麥苗weixin, 學習最實用的資料庫技術。
........................................................................................................................ |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2645039/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- xpinyin:漢字轉換為拼音庫
- 漢字轉漢語拼音
- C#漢字轉漢語拼音C#
- JS 漢字轉換拼音JS
- Hanlp漢字轉拼音使用python呼叫詳解HanLPPython
- C#中漢字轉拼音C#
- ORACLE SQL函式中文漢字轉拼音首字母OracleSQL函式
- Android環境下hanlp漢字轉拼音功能的使用介紹AndroidHanLP
- 漢字之美,拼音之韻
- C#漢字拼音檢索C#
- JavaScript按照漢字拼音順序排序JavaScript排序
- js 漢字陣列按拼音排序JS陣列排序
- 在Excel中如何獲取漢字拼音首字母?Excel
- Python 漢字區位碼、字串 相互轉換Python字串
- java 漢字轉配音Java
- 使用多執行緒查詢百萬條使用者資料將漢字轉化成拼音執行緒
- 漢語言處理工具pyhanlp的拼音轉換與字元正則化HanLP字元
- 阿拉伯-漢字-數字轉換
- PHP 將數字轉換為漢字PHP
- 用Python實現阿拉伯數字轉換成中國漢字Python
- win10拼音打不出漢字怎麼辦 win10電腦輸入法打不出漢字如何解決Win10
- utils公共方法:將數字轉為漢字
- JS 中文轉拼音JS
- 直播原始碼開發,vue漢字獲取字母首拼或拼音、大小寫原始碼Vue
- python中怎麼列印漢字Python
- 漢字-字母-位元組-位之間的轉換
- HTML5:給漢字加拼音?收起展開元件?讓我秀給你看HTML元件
- Python 英文的月份轉數字及數字轉英文Python
- win10系統微軟拼音輸入法打字不顯示漢字怎麼辦Win10微軟
- PHP 實現字串翻轉(包含中文漢字)的實現PHP字串
- mysql 報錯json字串 中文漢字轉義的問題MySqlJSON字串
- element-ui中el-select下拉框實現拼音、首字母、漢字等模糊搜尋UI
- [20180606]如何dump資料庫裡面的漢字.txt資料庫
- 數字轉中文 pythonPython
- java中文字串漢字轉GBK編碼Java字串
- python27拼音帶音調Python
- utf-8的中文漢字
- PHP 字元轉拼音首字iconv 警告錯誤PHP字元