創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:做網(wǎng)站、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的廣陽網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!小編給大家分享一下Python中PyPinyin庫的示例,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
Python 中提供了漢字轉(zhuǎn)拼音的庫,名字叫做 PyPinyin,可以用于漢字注音、排序、檢索等等場合,是基于 hotto/pinyin 這個(gè)庫開發(fā)的。
它有這么幾個(gè)特性:
根據(jù)詞組智能匹配最正確的拼音。
支持多音字。
簡單的繁體支持, 注音支持。
支持多種不同拼音/注音風(fēng)格。
是不是等不及了呢?那就讓我們來了解一下它的用法吧!
安裝
首先就是這個(gè)庫的安裝了,通過 pip 安裝即可:
pip3 install pypinyin
安裝完成之后導(dǎo)入一下這個(gè)庫,如果不報(bào)錯(cuò),那就說明安裝成功了。
>>> import pypinyin
好,接下來我們看下它的具體功能。
基本拼音
首先我們進(jìn)行一下基本的拼音轉(zhuǎn)換,方法非常簡單,直接調(diào)用 pinyin 方法即可:
from pypinyin import pinyin print(pinyin('中心'))
運(yùn)行結(jié)果:
[['zhōng'], ['xīn']]
可以看到結(jié)果會(huì)是一個(gè)二維的列表,每個(gè)元素都另外成了一個(gè)列表,其中包含了每個(gè)字的讀音。
那么如果這個(gè)詞是多音字咋辦呢?比如 “朝陽”,它有兩個(gè)讀音,我們拿來試下:
from pypinyin import pinyin print(pinyin('朝陽'))
運(yùn)行結(jié)果:
[['zhāo'], ['yáng']]
好吧,它只給出來了一個(gè)讀音,但是如果我們想要另外一種讀音咋辦呢?
其實(shí)很簡單,只需添加 heteronym 參數(shù)并設(shè)置為 True 就好了,我們試下:
from pypinyin import pinyin print(pinyin('朝陽', heteronym=True))
運(yùn)行結(jié)果:
[['zhāo', 'cháo'], ['yáng']]
OK 了,這下子就顯示出來了兩個(gè)讀音了,而且我們也明白了結(jié)果為什么是一個(gè)二維列表,因?yàn)槔锩娴囊痪S的結(jié)果可能是多個(gè),比如多音字的情況就是這樣。
但這個(gè)多少解析起來有點(diǎn)麻煩,很多情況下我們是不需要管多音字的,我們只是用它來轉(zhuǎn)換一下名字而已,而處理上面的二維數(shù)組又比較麻煩。
所以有沒有一個(gè)方法直接給我們一個(gè)一維列表呢?有!
我們可以使用 lazy_pinyin 這個(gè)方法來生成,嘗試一下:
from pypinyin import lazy_pinyin print(lazy_pinyin('聰明的小兔子'))
運(yùn)行結(jié)果:
['cong', 'ming', 'de', 'xiao', 'tu', 'zi']
這時(shí)候觀察到得到的是一個(gè)列表,并且不再包含音調(diào)了。
這里我們就有一個(gè)疑問了,為啥 pinyin 方法返回的結(jié)果默認(rèn)是帶音調(diào)的,而 lazy_pinyin 是不帶的,這里面就涉及到一個(gè)風(fēng)格轉(zhuǎn)換的問題了。
風(fēng)格轉(zhuǎn)換
我們可以對(duì)結(jié)果進(jìn)行一些風(fēng)格轉(zhuǎn)換,比如不帶聲調(diào)風(fēng)格、標(biāo)準(zhǔn)聲調(diào)風(fēng)格、聲調(diào)在拼音之后、聲調(diào)在韻母之后、注音風(fēng)格等等,比如我們想要聲調(diào)放在拼音后面,可以這么來實(shí)現(xiàn):
from pypinyin import lazy_pinyin, Style style = Style.TONE3 print(lazy_pinyin('聰明的小兔子', style=style))
運(yùn)行結(jié)果:
['cong1', 'ming2', 'de', 'xiao3', 'tu4', 'zi']
可以看到運(yùn)行結(jié)果每個(gè)拼音后面就多了一個(gè)聲調(diào),這就是其中的一個(gè)風(fēng)格,叫做 TONE3,其實(shí)還有很多風(fēng)格,下面是我從源碼里面找出來的定義:
#: 普通風(fēng)格,不帶聲調(diào)。如: 中國 -> ``zhong guo`` NORMAL = 0 #: 標(biāo)準(zhǔn)聲調(diào)風(fēng)格,拼音聲調(diào)在韻母第一個(gè)字母上(默認(rèn)風(fēng)格)。如: 中國 -> ``zhōng guó`` TONE = 1 #: 聲調(diào)風(fēng)格2,即拼音聲調(diào)在各個(gè)韻母之后,用數(shù)字 [1-4] 進(jìn)行表示。如: 中國 -> ``zho1ng guo2`` TONE2 = 2 #: 聲調(diào)風(fēng)格3,即拼音聲調(diào)在各個(gè)拼音之后,用數(shù)字 [1-4] 進(jìn)行表示。如: 中國 -> ``zhong1 guo2`` TONE3 = 8 #: 聲母風(fēng)格,只返回各個(gè)拼音的聲母部分(注:有的拼音沒有聲母,詳見 `#27`_)。如: 中國 -> ``zh g`` INITIALS = 3 #: 首字母風(fēng)格,只返回拼音的首字母部分。如: 中國 -> ``z g`` FIRST_LETTER = 4 #: 韻母風(fēng)格,只返回各個(gè)拼音的韻母部分,不帶聲調(diào)。如: 中國 -> ``ong uo`` FINALS = 5 #: 標(biāo)準(zhǔn)韻母風(fēng)格,帶聲調(diào),聲調(diào)在韻母第一個(gè)字母上。如:中國 -> ``ōng uó`` FINALS_TONE = 6 #: 韻母風(fēng)格2,帶聲調(diào),聲調(diào)在各個(gè)韻母之后,用數(shù)字 [1-4] 進(jìn)行表示。如: 中國 -> ``o1ng uo2`` FINALS_TONE2 = 7 #: 韻母風(fēng)格3,帶聲調(diào),聲調(diào)在各個(gè)拼音之后,用數(shù)字 [1-4] 進(jìn)行表示。如: 中國 -> ``ong1 uo2`` FINALS_TONE3 = 9 #: 注音風(fēng)格,帶聲調(diào),陰平(第一聲)不標(biāo)。如: 中國 -> ``ㄓㄨㄥ ㄍㄨㄛˊ`` BOPOMOFO = 10 #: 注音風(fēng)格,僅首字母。如: 中國 -> ``ㄓ ㄍ`` BOPOMOFO_FIRST = 11 #: 漢語拼音與俄語字母對(duì)照風(fēng)格,聲調(diào)在各個(gè)拼音之后,用數(shù)字 [1-4] 進(jìn)行表示。如: 中國 -> ``чжун1 го2`` CYRILLIC = 12 #: 漢語拼音與俄語字母對(duì)照風(fēng)格,僅首字母。如: 中國 -> ``ч г`` CYRILLIC_FIRST = 13
有了這些,我們就可以輕松地實(shí)現(xiàn)風(fēng)格轉(zhuǎn)換了。
好,再回到原來的問題,為什么 pinyin 的方法默認(rèn)帶聲調(diào),而 lazy_pinyin 方法不帶聲調(diào),答案就是:它們二者使用的默認(rèn)風(fēng)格不同,我們看下它的函數(shù)定義就知道了:
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)
錯(cuò)誤處理
在這里我們先做一個(gè)測試,比如我們傳入無法轉(zhuǎn)拼音的字,比如:
from pypinyin import lazy_pinyin print(lazy_pinyin('你好☆☆,我是xxx'))
其中包含了星號(hào)兩個(gè),還有標(biāo)點(diǎn)一個(gè),另外還包含了一個(gè) xxx 英文字符,結(jié)果會(huì)是什么呢?
['ni', 'hao', '☆☆,', 'wo', 'shi', 'xxx']
可以看到結(jié)果中星號(hào)和英文字符都作為一個(gè)整體并原模原樣返回了。
那么這種特殊字符可以單獨(dú)進(jìn)行處理嗎?當(dāng)然可以,這里就用到剛才提到的 errors 參數(shù)了。
errors 參數(shù)是有幾種模式的:
default:默認(rèn)行為,不處理,原木原樣返回
ignore:忽略字符,直接拋掉
replace:直接替換為去掉 u 的 unicode 編碼
callable 對(duì)象:當(dāng)傳入一個(gè)可調(diào)用的對(duì)象的時(shí)候,則可以自定義處理方式。
下面是 errors 這個(gè)參數(shù)的源碼實(shí)現(xiàn)邏輯:
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))
自定義拼音
如果對(duì)庫返回的結(jié)果不滿意,我們還可以自定義自己的拼音庫,這里用到的方法就有 load_single_dict 和 load_phrases_dict 方法了。
比如剛才我們看到 “朝陽” 兩個(gè)字的發(fā)音默認(rèn)返回的是 zhao yang,我們想默認(rèn)返回 chao yang,那可以這么做:
from pypinyin import lazy_pinyin, load_phrases_dict print(lazy_pinyin('朝陽')) personalized_dict = { '朝陽': [['cháo'], ['yáng']] } load_phrases_dict(personalized_dict) print(lazy_pinyin('朝陽'))
這里我們自定義了一個(gè)詞典,然后使用 load_phrases_dict 方法設(shè)置了一下就可以了。
運(yùn)行結(jié)果:
2 ['zhao', 'yang'] ['chao', 'yang']
這樣就可以完成自定義的設(shè)置了。
在一些項(xiàng)目里面我們可以自定義很多拼音庫,然后加載就可以了。
另外我們還可以注冊樣式實(shí)現(xiàn)自定義,比如將某個(gè)拼音前面加上 Emoji 表情,樣例:
from pypinyin.style import register from pypinyin import lazy_pinyin @register('kiss') def kiss(pinyin, **kwargs): if pinyin == 'me': return f'{pinyin}' return pinyin print(lazy_pinyin('么么噠', style='kiss'))
運(yùn)行結(jié)果:
['me', 'me', 'dá']
看完了這篇文章,相信你對(duì)Python中PyPinyin庫的示例有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝各位的閱讀!