Python 中拼音庫 PyPinyin 用法詳解_第1頁
Python 中拼音庫 PyPinyin 用法詳解_第2頁
Python 中拼音庫 PyPinyin 用法詳解_第3頁
Python 中拼音庫 PyPinyin 用法詳解_第4頁
Python 中拼音庫 PyPinyin 用法詳解_第5頁
已閱讀5頁,還剩8頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第Python中拼音庫PyPinyin用法詳解最近碰到了一個問題,項目中很多文件都是接手過來的中文命名的一些素材,結果在部署的時候文件名全都亂碼了,導致項目無法正常運行。

后來請教了一位大佬怎么解決文件名亂碼的問題,他說這個需要正面解決嗎?不需要,把文件名全部改掉,文件名永遠不要用中文,永遠不要。

我想他這么說的話,一定也是憑經驗得出來的。

這里也友情提示大家,項目里面文件永遠不要用中文,永遠不要!

好,那不用中文用啥?平時來看,一般我們都會用英文來命名,一般也不會出現中文,比如resource,controller,result,view,spider等等,所以絕大多數情況下,是不會出現什么問題的。但是也有個別的情況,比如一些素材、資源文件可能的中文命名的,那么這時候該咋辦呢?

首先像,因為是中文資源文件,我們要改成非中文命名的,無非兩種,一種是英文,一種是拼音。

如果改英文,當然可以翻譯、我們想翻譯的話,逐個人工翻譯成本太高,機器翻譯的話,翻譯完可能有些文不對題了,而且我們自己也不知道一些奇怪的資源英語應該叫什么,所以到時候真的找起來都找不到了。

所以第二種解決方案,那就是拼音了。中文轉拼音,很自然,而且一個字就對應一串拼音,而且也非常容易從拼音看懂是什么意思,所以這確實是一個不錯的方案。

那么問題就來了,怎樣把一批中文文件轉拼音命名呢?下面就讓我們來了解Python的一個庫PyPinyin吧!

Python中提供了漢字轉拼音的庫,名字叫做PyPinyin,可以用于漢字注音、排序、檢索等等場合,是基于hotto/pinyin這個庫開發的,一些站點鏈接如下:

GitHub:/mozillazg/python-pinyin

文檔:https://pypinyin.readthedocs.io/zh_CN/master/

PyPi:/project/pypinyin/

它有這么幾個特性:

根據詞組智能匹配最正確的拼音。

支持多音字。

簡單的繁體支持,注音支持。

支持多種不同拼音/注音風格。

是不是等不及了呢?那就讓我們來了解一下它的用法吧!

首先就是這個庫的安裝了,通過pip安裝即可:

pip3installpypinyin

安裝完成之后導入一下這個庫,如果不報錯,那就說明安裝成功了。

importpypinyin

好,接下來我們看下它的具體功能。

首先我們進行一下基本的拼音轉換,方法非常簡單,直接調用pinyin方法即可:

frompypinyinimportpinyin

print(pinyin('中心'))

運行結果:

[['zhōng'],['xīn']]

可以看到結果會是一個二維的列表,每個元素都另外成了一個列表,其中包含了每個字的讀音。

那么如果這個詞是多音字咋辦呢?比如“朝陽”,它有兩個讀音,我們拿來試下:

frompypinyinimportpinyin

print(pinyin('朝陽'))

運行結果:

[['zhāo'],['yáng']]

好吧,它只給出來了一個讀音,但是如果我們想要另外一種讀音咋辦呢?

其實很簡單,只需添加heteronym參數并設置為True就好了,我們試下:

frompypinyinimportpinyin

print(pinyin('朝陽',heteronym=True))

運行結果:

[['zhāo','cháo'],['yáng']]

OK了,這下子就顯示出來了兩個讀音了,而且我們也明白了結果為什么是一個二維列表,因為里面的一維的結果可能是多個,比如多音字的情況就是這樣。

但這個多少解析起來有點麻煩,很多情況下我們是不需要管多音字的,我們只是用它來轉換一下名字而已,而處理上面的二維數組又比較麻煩。

所以有沒有一個方法直接給我們一個一維列表呢?有!

我們可以使用lazy_pinyin這個方法來生成,嘗試一下:

frompypinyinimportpinyin

print(pinyin('聰明的小兔子'))

運行結果:

['cong','ming','de','xiao','tu','zi']

這時候觀察到得到的是一個列表,并且不再包含音調了。

這里我們就有一個疑問了,為啥pinyin方法返回的結果默認是帶音調的,而lazy_pinyin是不帶的,這里面就涉及到一個風格轉換的問題了。

我們可以對結果進行一些風格轉換,比如不帶聲調風格、標準聲調風格、聲調在拼音之后、聲調在韻母之后、注音風格等等,比如我們想要聲調放在拼音后面,可以這么來實現:

frompypinyinimportlazy_pinyin,Style

style=Style.TONE3

print(lazy_pinyin('聰明的小兔子',>

運行結果:

['cong1','ming2','de','xiao3','tu4','zi']

可以看到運行結果每個拼音后面就多了一個聲調,這就是其中的一個風格,叫做TONE3,其實還有很多風格,下面是我從源碼里面找出來的定義:

NORMAL=0

#:標準聲調風格,拼音聲調在韻母第一個字母上(默認風格)。如:中國-``zhōngguó``

TONE=1

#:聲調風格2,即拼音聲調在各個韻母之后,用數字[1-4]進行表示。如:中國-``zho1ngguo2``

TONE2=2

#:聲調風格3,即拼音聲調在各個拼音之后,用數字[1-4]進行表示。如:中國-``zhong1guo2``

TONE3=8

#:聲母風格,只返回各個拼音的聲母部分(注:有的拼音沒有聲母,詳見`#27`_)。如:中國-``zhg``

INITIALS=3

#:首字母風格,只返回拼音的首字母部分。如:中國-``zg``

FIRST_LETTER=4

#:韻母風格,只返回各個拼音的韻母部分,不帶聲調。如:中國-``onguo``

FINALS=5

#:標準韻母風格,帶聲調,聲調在韻母第一個字母上。如:中國-``ōnguó``

FINALS_TONE=6

#:韻母風格2,帶聲調,聲調在各個韻母之后,用數字[1-4]進行表示。如:中國-``o1nguo2``

FINALS_TONE2=7

#:韻母風格3,帶聲調,聲調在各個拼音之后,用數字[1-4]進行表示。如:中國-``ong1uo2``

FINALS_TONE3=9

#:注音風格,帶聲調,陰平(第一聲)不標。如:中國-``ㄓㄨㄥㄍㄨㄛˊ``

BOPOMOFO=10

#:注音風格,僅首字母。如:中國-``ㄓㄍ``

BOPOMOFO_FIRST=11

#:漢語拼音與俄語字母對照風格,聲調在各個拼音之后,用數字[1-4]進行表示。如:中國-``чжун1го2``

CYRILLIC=12

#:漢語拼音與俄語字母對照風格,僅首字母。如:中國-``чг``

CYRILLIC_FIRST=13

有了這些,我們就可以輕松地實現風格轉換了。

好,再回到原來的問題,為什么pinyin的方法默認帶聲調,而lazy_pinyin方法不帶聲調,答案就是:它們二者使用的默認風格不同,我們看下它的函數定義就知道了:

pinyin方法的定義如下:

defpinyin(hans,'default',strict=True)

lazy_pinyin方法的定義如下:

deflazy_pinyin(hans,'default',strict=True)

這下懂了吧,因為pinyin方法默認使用了TONE的風格,而lazy_pinyin方法默認使用了NORMAL的風格,所以就導致二者返回風格不同了。

好了,有了這兩個函數的定義,我們再來研究下其他的參數,比如定義里面的errors和strict參數又怎么用呢?

在這里我們先做一個測試,比如我們傳入無法轉拼音的字,比如:

frompypinyinimportlazy_pinyin

print(lazy_pinyin('你好☆☆,我是xxx'))

其中包含了星號兩個,還有標點一個,另外還包含了一個xxx英文字符,結果會是什么呢?

['ni','hao','☆☆,','wo','shi','xxx']

可以看到結果中星號和英文字符都作為一個整體并原模原樣返回了。

那么這種特殊字符可以單獨進行處理嗎?當然可以,這里就用到剛才提到的errors參數了。

errors參數是有幾種模式的:

u

下面是errors這個參數的源碼實現邏輯:

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))

當處理沒有拼音的字符的時候,errors的不同參數會有不同的處理結果,更詳細的邏輯可以翻看源碼。

好了,下面我們來嘗試一下,比如我們想將不能轉拼音的字符去掉,則可以這么設置:

frompypinyinimportlazy_pinyin

print(lazy_pinyin('你好☆☆,我是xxx',errors='ignore'))

運行結果:

['ni','hao','wo','shi']

如果我們想要自定義處理,比如把☆轉化為※,則可以這么設置:

print(lazy_pinyin('你好☆☆,我是xxx',errors=lambdaitem:''.join(['※'ifc=='☆'elsecforcinitem])))

運行結果:

['ni','hao','※※,','wo','shi','xxx']

如上便是一些相關異常處理的操作,我們可以隨心所欲地處理自己想處理的字符了。

最后再看下strict模式,這個參數用于控制處理聲母和韻母時是否嚴格遵循《漢語拼音方案》標準。

下面的一些說明來源于官方文檔:

當strict參數為True時根據《漢語拼音方案》的如下規則處理聲母、在韻母相關風格下還原正確的韻母:

21個聲母:bpmfdtnlgkhjqxzhchshrzcs(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方法了。

比如剛才我們看到“朝陽”兩個字的發音默認返回的是zhaoyang,我們想默認返回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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論