




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第Python中拼音庫PyPinyin用法詳解最近碰到了一個(gè)問題,項(xiàng)目中很多文件都是接手過來的中文命名的一些素材,結(jié)果在部署的時(shí)候文件名全都亂碼了,導(dǎo)致項(xiàng)目無法正常運(yùn)行。
后來請(qǐng)教了一位大佬怎么解決文件名亂碼的問題,他說這個(gè)需要正面解決嗎?不需要,把文件名全部改掉,文件名永遠(yuǎn)不要用中文,永遠(yuǎn)不要。
我想他這么說的話,一定也是憑經(jīng)驗(yàn)得出來的。
這里也友情提示大家,項(xiàng)目里面文件永遠(yuǎn)不要用中文,永遠(yuǎn)不要!
好,那不用中文用啥?平時(shí)來看,一般我們都會(huì)用英文來命名,一般也不會(huì)出現(xiàn)中文,比如resource,controller,result,view,spider等等,所以絕大多數(shù)情況下,是不會(huì)出現(xiàn)什么問題的。但是也有個(gè)別的情況,比如一些素材、資源文件可能的中文命名的,那么這時(shí)候該咋辦呢?
首先像,因?yàn)槭侵形馁Y源文件,我們要改成非中文命名的,無非兩種,一種是英文,一種是拼音。
如果改英文,當(dāng)然可以翻譯、我們想翻譯的話,逐個(gè)人工翻譯成本太高,機(jī)器翻譯的話,翻譯完可能有些文不對(duì)題了,而且我們自己也不知道一些奇怪的資源英語應(yīng)該叫什么,所以到時(shí)候真的找起來都找不到了。
所以第二種解決方案,那就是拼音了。中文轉(zhuǎn)拼音,很自然,而且一個(gè)字就對(duì)應(yīng)一串拼音,而且也非常容易從拼音看懂是什么意思,所以這確實(shí)是一個(gè)不錯(cuò)的方案。
那么問題就來了,怎樣把一批中文文件轉(zhuǎn)拼音命名呢?下面就讓我們來了解Python的一個(gè)庫PyPinyin吧!
Python中提供了漢字轉(zhuǎn)拼音的庫,名字叫做PyPinyin,可以用于漢字注音、排序、檢索等等場(chǎng)合,是基于hotto/pinyin這個(gè)庫開發(fā)的,一些站點(diǎn)鏈接如下:
GitHub:/mozillazg/python-pinyin
文檔:https://pypinyin.readthedocs.io/zh_CN/master/
PyPi:/project/pypinyin/
它有這么幾個(gè)特性:
根據(jù)詞組智能匹配最正確的拼音。
支持多音字。
簡(jiǎn)單的繁體支持,注音支持。
支持多種不同拼音/注音風(fēng)格。
是不是等不及了呢?那就讓我們來了解一下它的用法吧!
首先就是這個(gè)庫的安裝了,通過pip安裝即可:
pip3installpypinyin
安裝完成之后導(dǎo)入一下這個(gè)庫,如果不報(bào)錯(cuò),那就說明安裝成功了。
importpypinyin
好,接下來我們看下它的具體功能。
首先我們進(jìn)行一下基本的拼音轉(zhuǎn)換,方法非常簡(jiǎn)單,直接調(diào)用pinyin方法即可:
frompypinyinimportpinyin
print(pinyin('中心'))
運(yùn)行結(jié)果:
[['zhōng'],['xīn']]
可以看到結(jié)果會(huì)是一個(gè)二維的列表,每個(gè)元素都另外成了一個(gè)列表,其中包含了每個(gè)字的讀音。
那么如果這個(gè)詞是多音字咋辦呢?比如“朝陽”,它有兩個(gè)讀音,我們拿來試下:
frompypinyinimportpinyin
print(pinyin('朝陽'))
運(yùn)行結(jié)果:
[['zhāo'],['yáng']]
好吧,它只給出來了一個(gè)讀音,但是如果我們想要另外一種讀音咋辦呢?
其實(shí)很簡(jiǎn)單,只需添加heteronym參數(shù)并設(shè)置為True就好了,我們?cè)囅拢?/p>
frompypinyinimportpinyin
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è)方法來生成,嘗試一下:
frompypinyinimportpinyin
print(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)換的問題了。
我們可以對(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):
frompypinyinimportlazy_pinyin,Style
style=Style.TONE3
print(lazy_pinyin('聰明的小兔子',>
運(yùn)行結(jié)果:
['cong1','ming2','de','xiao3','tu4','zi']
可以看到運(yùn)行結(jié)果每個(gè)拼音后面就多了一個(gè)聲調(diào),這就是其中的一個(gè)風(fēng)格,叫做TONE3,其實(shí)還有很多風(fēng)格,下面是我從源碼里面找出來的定義:
NORMAL=0
#:標(biāo)準(zhǔn)聲調(diào)風(fēng)格,拼音聲調(diào)在韻母第一個(gè)字母上(默認(rèn)風(fēng)格)。如:中國(guó)-``zhōngguó``
TONE=1
#:聲調(diào)風(fēng)格2,即拼音聲調(diào)在各個(gè)韻母之后,用數(shù)字[1-4]進(jìn)行表示。如:中國(guó)-``zho1ngguo2``
TONE2=2
#:聲調(diào)風(fēng)格3,即拼音聲調(diào)在各個(gè)拼音之后,用數(shù)字[1-4]進(jìn)行表示。如:中國(guó)-``zhong1guo2``
TONE3=8
#:聲母風(fēng)格,只返回各個(gè)拼音的聲母部分(注:有的拼音沒有聲母,詳見`#27`_)。如:中國(guó)-``zhg``
INITIALS=3
#:首字母風(fēng)格,只返回拼音的首字母部分。如:中國(guó)-``zg``
FIRST_LETTER=4
#:韻母風(fēng)格,只返回各個(gè)拼音的韻母部分,不帶聲調(diào)。如:中國(guó)-``onguo``
FINALS=5
#:標(biāo)準(zhǔn)韻母風(fēng)格,帶聲調(diào),聲調(diào)在韻母第一個(gè)字母上。如:中國(guó)-``ōnguó``
FINALS_TONE=6
#:韻母風(fēng)格2,帶聲調(diào),聲調(diào)在各個(gè)韻母之后,用數(shù)字[1-4]進(jìn)行表示。如:中國(guó)-``o1nguo2``
FINALS_TONE2=7
#:韻母風(fēng)格3,帶聲調(diào),聲調(diào)在各個(gè)拼音之后,用數(shù)字[1-4]進(jìn)行表示。如:中國(guó)-``ong1uo2``
FINALS_TONE3=9
#:注音風(fēng)格,帶聲調(diào),陰平(第一聲)不標(biāo)。如:中國(guó)-``ㄓㄨㄥㄍㄨㄛˊ``
BOPOMOFO=10
#:注音風(fēng)格,僅首字母。如:中國(guó)-``ㄓㄍ``
BOPOMOFO_FIRST=11
#:漢語拼音與俄語字母對(duì)照風(fēng)格,聲調(diào)在各個(gè)拼音之后,用數(shù)字[1-4]進(jìn)行表示。如:中國(guó)-``чжун1го2``
CYRILLIC=12
#:漢語拼音與俄語字母對(duì)照風(fēng)格,僅首字母。如:中國(guó)-``чг``
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方法的定義如下:
defpinyin(hans,'default',strict=True)
lazy_pinyin方法的定義如下:
deflazy_pinyin(hans,'default',strict=True)
這下懂了吧,因?yàn)閜inyin方法默認(rèn)使用了TONE的風(fēng)格,而lazy_pinyin方法默認(rèn)使用了NORMAL的風(fēng)格,所以就導(dǎo)致二者返回風(fēng)格不同了。
好了,有了這兩個(gè)函數(shù)的定義,我們?cè)賮硌芯肯缕渌膮?shù),比如定義里面的errors和strict參數(shù)又怎么用呢?
在這里我們先做一個(gè)測(cè)試,比如我們傳入無法轉(zhuǎn)拼音的字,比如:
frompypinyinimportlazy_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ù)是有幾種模式的:
u
下面是errors這個(gè)參數(shù)的源碼實(shí)現(xiàn)邏輯:
def_handle_nopinyin_char(chars,errors='default'):
"""處理沒有拼音的字符"""
ifcallable_check(errors):
returnerrors(chars)
iferrors=='default':
returnchars
eliferrors=='ignore':
returnNone
eliferrors=='replace':
iflen(chars)1:
return''.join(text_type('%x'%ord(x))forxinchars)
else:
returntext_type('%x'%ord(chars))
當(dāng)處理沒有拼音的字符的時(shí)候,errors的不同參數(shù)會(huì)有不同的處理結(jié)果,更詳細(xì)的邏輯可以翻看源碼。
好了,下面我們來嘗試一下,比如我們想將不能轉(zhuǎn)拼音的字符去掉,則可以這么設(shè)置:
frompypinyinimportlazy_pinyin
print(lazy_pinyin('你好☆☆,我是xxx',errors='ignore'))
運(yùn)行結(jié)果:
['ni','hao','wo','shi']
如果我們想要自定義處理,比如把☆轉(zhuǎn)化為※,則可以這么設(shè)置:
print(lazy_pinyin('你好☆☆,我是xxx',errors=lambdaitem:''.join(['※'ifc=='☆'elsecforcinitem])))
運(yùn)行結(jié)果:
['ni','hao','※※,','wo','shi','xxx']
如上便是一些相關(guān)異常處理的操作,我們可以隨心所欲地處理自己想處理的字符了。
最后再看下strict模式,這個(gè)參數(shù)用于控制處理聲母和韻母時(shí)是否嚴(yán)格遵循《漢語拼音方案》標(biāo)準(zhǔn)。
下面的一些說明來源于官方文檔:
當(dāng)strict參數(shù)為True時(shí)根據(jù)《漢語拼音方案》的如下規(guī)則處理聲母、在韻母相關(guān)風(fēng)格下還原正確的韻母:
21個(gè)聲母:bpmfdtnlgkhjqxzhchshrzcs(y,w不是聲母)
i行的韻母,前面沒有聲母的時(shí)候,寫成yi(衣),ya(呀),ye(耶),yao(腰),you(憂),yan(煙),yin(因),yang(央),ying(英),yong(雍)。(y不是聲母)
u行的韻母,前面沒有聲母的時(shí)候,寫成wu(烏),wa(蛙),wo(窩),wai(歪),wei(威),wan(彎),wen(溫),wang(汪),weng(翁)。(w不是聲母)
ü行的韻母,前面沒有聲母的時(shí)候,寫成yu(迂),yue(約),yuan(冤),yun(暈);ü上兩點(diǎn)省略。(韻母相關(guān)風(fēng)格下還原正確的韻母ü)
ü行的韻跟聲母j,q,x拼的時(shí)候,寫成ju(居),qu(區(qū)),xu(虛),ü上兩點(diǎn)也省略;但是跟聲母n,l拼的時(shí)候,仍然寫成nü(女),lü(呂)。(韻母相關(guān)風(fēng)格下還原正確的韻母ü)
iou,uei,uen前面加聲母的時(shí)候,寫成iu,ui,un。例如niu(牛),gui(歸),lun(論)。(韻母相關(guān)風(fēng)格下還原正確的韻母iou,uei,uen)
當(dāng)strict為False時(shí)就是不遵守上面的規(guī)則來處理聲母和韻母,比如:y,w會(huì)被當(dāng)做聲母,yu(迂)的韻母就是一般認(rèn)為的u等。
具體差異可以查看源碼中tests/test_standard.py中的對(duì)比結(jié)果測(cè)試用例。
自定義拼音
如果對(duì)庫返回的結(jié)果不滿意,我們還可以自定義自己的拼音庫,這里用到的方法就有l(wèi)oad_single_dict和load_phrases_dict方法了。
比如剛才我們看到“朝陽”兩個(gè)字的發(fā)音默認(rèn)返回的是zhaoyang,我們想默認(rèn)返回chaoyang,那可以這么做:
frompypinyinimportlazy_pinyin,load_phrases_dict
print(lazy_pinyin('朝陽'))
personalized_dict={
'朝陽':[['cháo'],['yáng']]
load_phrases_dict(personalized_dict)
print(lazy_pinyin('朝陽'))
這里我
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 材料力學(xué)與智能制造工藝重點(diǎn)基礎(chǔ)知識(shí)點(diǎn)
- 材料疲勞裂紋擴(kuò)展數(shù)據(jù)處理原理重點(diǎn)基礎(chǔ)知識(shí)點(diǎn)
- 集合概念的實(shí)際應(yīng)用試題及答案
- 常見火災(zāi)事故應(yīng)急預(yù)案(3篇)
- 行政法學(xué)知識(shí)點(diǎn)梳理與試題及答案匯編
- 低壓室火災(zāi)應(yīng)急預(yù)案(3篇)
- 發(fā)展戰(zhàn)略與市場(chǎng)預(yù)測(cè)的關(guān)系試題及答案
- 火災(zāi)撲滅瞬間應(yīng)急預(yù)案(3篇)
- 計(jì)算機(jī)程序設(shè)計(jì)入門考試題及答案
- 2025軟考網(wǎng)絡(luò)運(yùn)營(yíng)管理試題及答案
- 《探訪龍江劇》-完整版PPT
- GB∕T 31030-2014 機(jī)場(chǎng)旅客擺渡車
- 閥門系數(shù)Cv和KV值計(jì)算表格(帶公式)
- 壓縮空氣系統(tǒng)驗(yàn)證方案
- 中暑預(yù)防與應(yīng)急處理
- 體質(zhì)測(cè)量與評(píng)價(jià)期末考試試題及答案
- 病原學(xué)檢測(cè)陰性肺結(jié)核診斷流程T∕CHATA 008-2020
- 尾礦庫基礎(chǔ)知識(shí)最全PPT資料課件
- dgt801系列數(shù)字式發(fā)電機(jī)變壓器組保護(hù)裝置調(diào)試大綱
- 300B電子管技術(shù)參數(shù)
- 國(guó)家開放大學(xué)《理工英語3》章節(jié)測(cè)試參考答案
評(píng)論
0/150
提交評(píng)論