最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python 中拼音庫(kù) PyPinyin 用法詳解

 更新時(shí)間:2021年05月28日 10:12:38   作者:程序員阿城  
很多朋友問(wèn)小編怎樣把一批中文文件轉(zhuǎn)拼音命名呢?下面就讓我們來(lái)了解 Python 的一個(gè)庫(kù) PyPinyin 吧,感興趣的朋友跟隨小編一起看看吧

最近碰到了一個(gè)問(wèn)題,項(xiàng)目中很多文件都是接手過(guò)來(lái)的中文命名的一些素材,結(jié)果在部署的時(shí)候文件名全都亂碼了,導(dǎo)致項(xiàng)目無(wú)法正常運(yùn)行。

后來(lái)請(qǐng)教了一位大佬怎么解決文件名亂碼的問(wèn)題,他說(shuō)這個(gè)需要正面解決嗎?不需要,把文件名全部改掉,文件名永遠(yuǎn)不要用中文,永遠(yuǎn)不要。

我想他這么說(shuō)的話,一定也是憑經(jīng)驗(yàn)得出來(lái)的。

這里也友情提示大家,項(xiàng)目里面文件永遠(yuǎn)不要用中文,永遠(yuǎn)不要!

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

首先像,因?yàn)槭侵形馁Y源文件,我們要改成非中文命名的,無(wú)非兩種,一種是英文,一種是拼音。

如果改英文,當(dāng)然可以翻譯、我們想翻譯的話,逐個(gè)人工翻譯成本太高,機(jī)器翻譯的話,翻譯完可能有些文不對(duì)題了,而且我們自己也不知道一些奇怪的資源英語(yǔ)應(yīng)該叫什么,所以到時(shí)候真的找起來(lái)都找不到了。

所以第二種解決方案,那就是拼音了。中文轉(zhuǎn)拼音,很自然,而且一個(gè)字就對(duì)應(yīng)一串拼音,而且也非常容易從拼音看懂是什么意思,所以這確實(shí)是一個(gè)不錯(cuò)的方案。

那么問(wèn)題就來(lái)了,怎樣把一批中文文件轉(zhuǎn)拼音命名呢?下面就讓我們來(lái)了解 Python 的一個(gè)庫(kù) PyPinyin 吧!

概述

Python 中提供了漢字轉(zhuǎn)拼音的庫(kù),名字叫做 PyPinyin,可以用于漢字注音、排序、檢索等等場(chǎng)合,是基于 hotto/pinyin 這個(gè)庫(kù)開發(fā)的,一些站點(diǎn)鏈接如下:

  • GitHub: https://github.com/mozillazg/python-pinyin
  • 文檔: https://pypinyin.readthedocs.io/zh_CN/master/
  • PyPi: https://pypi.org/project/pypinyin/

它有這么幾個(gè)特性:

  • 根據(jù)詞組智能匹配最正確的拼音。
  • 支持多音字。
  • 簡(jiǎn)單的繁體支持, 注音支持。
  • 支持多種不同拼音/注音風(fēng)格。

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

安裝

首先就是這個(gè)庫(kù)的安裝了,通過(guò) pip 安裝即可:

pip3 install pypinyin

安裝完成之后導(dǎo)入一下這個(gè)庫(kù),如果不報(bào)錯(cuò),那就說(shuō)明安裝成功了。

>>> import pypinyin

好,接下來(lái)我們看下它的具體功能。

基本拼音

首先我們進(jìn)行一下基本的拼音轉(zhuǎn)換,方法非常簡(jiǎn)單,直接調(diào)用 pinyin 方法即可:

from pypinyin import pinyin
print(pinyin('中心'))

運(yùn)行結(jié)果:

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

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

那么如果這個(gè)詞是多音字咋辦呢?比如 “朝陽(yáng)”,它有兩個(gè)讀音,我們拿來(lái)試下:

from pypinyin import pinyin
print(pinyin('朝陽(yáng)'))

運(yùn)行結(jié)果:

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

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

其實(shí)很簡(jiǎn)單,只需添加 heteronym 參數(shù)并設(shè)置為 True 就好了,我們?cè)囅拢?/p>

from pypinyin import pinyin
print(pinyin('朝陽(yáng)', heteronym=True))

運(yùn)行結(jié)果:

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

OK 了,這下子就顯示出來(lái)了兩個(gè)讀音了,而且我們也明白了結(jié)果為什么是一個(gè)二維列表,因?yàn)槔锩娴囊痪S的結(jié)果可能是多個(gè),比如多音字的情況就是這樣。

但這個(gè)多少解析起來(lái)有點(diǎn)麻煩,很多情況下我們是不需要管多音字的,我們只是用它來(lái)轉(zhuǎn)換一下名字而已,而處理上面的二維數(shù)組又比較麻煩。

所以有沒(méi)有一個(gè)方法直接給我們一個(gè)一維列表呢?有!

我們可以使用 lazy_pinyin 這個(gè)方法來(lái)生成,嘗試一下:

from pypinyin import pinyin
print(pinyin('聰明的小兔子'))

運(yùn)行結(jié)果:

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

這時(shí)候觀察到得到的是一個(gè)列表,并且不再包含音調(diào)了。

這里我們就有一個(gè)疑問(wèn)了,為啥 pinyin 方法返回的結(jié)果默認(rèn)是帶音調(diào)的,而 lazy_pinyin 是不帶的,這里面就涉及到一個(gè)風(fēng)格轉(zhuǎn)換的問(wè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)放在拼音后面,可以這么來(lái)實(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)格,下面是我從源碼里面找出來(lái)的定義:

#: 普通風(fēng)格,不帶聲調(diào)。如: 中國(guó) -> ``zhong guo``
NORMAL = 0
#: 標(biāo)準(zhǔn)聲調(diào)風(fēng)格,拼音聲調(diào)在韻母第一個(gè)字母上(默認(rèn)風(fēng)格)。如: 中國(guó) -> ``zhōng guó``
TONE = 1
#: 聲調(diào)風(fēng)格2,即拼音聲調(diào)在各個(gè)韻母之后,用數(shù)字 [1-4] 進(jìn)行表示。如: 中國(guó) -> ``zho1ng guo2``
TONE2 = 2
#: 聲調(diào)風(fēng)格3,即拼音聲調(diào)在各個(gè)拼音之后,用數(shù)字 [1-4] 進(jìn)行表示。如: 中國(guó) -> ``zhong1 guo2``
TONE3 = 8
#: 聲母風(fēng)格,只返回各個(gè)拼音的聲母部分(注:有的拼音沒(méi)有聲母,詳見 `#27`_)。如: 中國(guó) -> ``zh g``
INITIALS = 3
#: 首字母風(fēng)格,只返回拼音的首字母部分。如: 中國(guó) -> ``z g``
FIRST_LETTER = 4
#: 韻母風(fēng)格,只返回各個(gè)拼音的韻母部分,不帶聲調(diào)。如: 中國(guó) -> ``ong uo``
FINALS = 5
#: 標(biāo)準(zhǔn)韻母風(fēng)格,帶聲調(diào),聲調(diào)在韻母第一個(gè)字母上。如:中國(guó) -> ``ōng uó``
FINALS_TONE = 6
#: 韻母風(fēng)格2,帶聲調(diào),聲調(diào)在各個(gè)韻母之后,用數(shù)字 [1-4] 進(jìn)行表示。如: 中國(guó) -> ``o1ng uo2``
FINALS_TONE2 = 7
#: 韻母風(fēng)格3,帶聲調(diào),聲調(diào)在各個(gè)拼音之后,用數(shù)字 [1-4] 進(jìn)行表示。如: 中國(guó) -> ``ong1 uo2``
FINALS_TONE3 = 9
#: 注音風(fēng)格,帶聲調(diào),陰平(第一聲)不標(biāo)。如: 中國(guó) -> ``ㄓㄨㄥ ㄍㄨㄛˊ``
BOPOMOFO = 10
#: 注音風(fēng)格,僅首字母。如: 中國(guó) -> ``ㄓ ㄍ``
BOPOMOFO_FIRST = 11
#: 漢語(yǔ)拼音與俄語(yǔ)字母對(duì)照風(fēng)格,聲調(diào)在各個(gè)拼音之后,用數(shù)字 [1-4] 進(jìn)行表示。如: 中國(guó) -> ``чжун1 го2``
CYRILLIC = 12
#: 漢語(yǔ)拼音與俄語(yǔ)字母對(duì)照風(fēng)格,僅首字母。如: 中國(guó) -> ``ч г``
CYRILLIC_FIRST = 13

有了這些,我們就可以輕松地實(shí)現(xiàn)風(fēng)格轉(zhuǎn)換了。

好,再回到原來(lái)的問(wè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)

這下懂了吧,因?yàn)?pinyin 方法默認(rèn)使用了 TONE 的風(fēng)格,而 lazy_pinyin 方法默認(rèn)使用了 NORMAL 的風(fēng)格,所以就導(dǎo)致二者返回風(fēng)格不同了。

好了,有了這兩個(gè)函數(shù)的定義,我們?cè)賮?lái)研究下其他的參數(shù),比如定義里面的 errors 和 strict 參數(shù)又怎么用呢?

錯(cuò)誤處理

在這里我們先做一個(gè)測(cè)試,比如我們傳入無(wú)法轉(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ù)是有幾種模式的:

u

下面是 errors 這個(gè)參數(shù)的源碼實(shí)現(xiàn)邏輯:

def _handle_nopinyin_char(chars, errors='default'):
    """處理沒(méi)有拼音的字符"""
    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))

當(dāng)處理沒(méi)有拼音的字符的時(shí)候,errors 的不同參數(shù)會(huì)有不同的處理結(jié)果,更詳細(xì)的邏輯可以翻看源碼。

好了,下面我們來(lái)嘗試一下,比如我們想將不能轉(zhuǎn)拼音的字符去掉,則可以這么設(shè)置:

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

運(yùn)行結(jié)果:

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

如果我們想要自定義處理,比如把  轉(zhuǎn)化為  ,則可以這么設(shè)置:

print(lazy_pinyin('你好☆☆,我是xxx', errors=lambda item: ''.join(['※' if c == '☆' else c for c in item])))

運(yùn)行結(jié)果:

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

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

嚴(yán)格模式

最后再看下 strict 模式,這個(gè)參數(shù)用于控制處理聲母和韻母時(shí)是否嚴(yán)格遵循 《漢語(yǔ)拼音方案》標(biāo)準(zhǔn)。

下面的一些說(shuō)明來(lái)源于官方文檔:

當(dāng) strict 參數(shù)為 True 時(shí)根據(jù) 《漢語(yǔ)拼音方案》 的如下規(guī)則處理聲母、在韻母相關(guān)風(fēng)格下還原正確的韻母:

  • 21 個(gè)聲母: b p m f d t n l g k h j q x zh ch sh r z c s ( y, w 不是聲母 )
  • i行的韻母,前面沒(méi)有聲母的時(shí)候,寫成yi(衣),ya(呀),ye(耶),yao(腰),you(憂),yan(煙), yin(因),yang(央),ying(英),yong(雍)。( y 不是聲母 )
  • u行的韻母,前面沒(méi)有聲母的時(shí)候,寫成wu(烏),wa(蛙),wo(窩),wai(歪),wei(威),wan(彎), wen(溫),wang(汪),weng(翁)。( w 不是聲母 )
  • ü行的韻母,前面沒(méi)有聲母的時(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ī)則來(lái)處理聲母和韻母, 比如: y , w 會(huì)被當(dāng)做聲母,yu(迂) 的韻母就是一般認(rèn)為的 u 等。

具體差異可以查看源碼中 tests/test_standard.py 中的對(duì)比結(jié)果測(cè)試用例。

自定義拼音

如果對(duì)庫(kù)返回的結(jié)果不滿意,我們還可以自定義自己的拼音庫(kù),這里用到的方法就有 load_single_dict 和 load_phrases_dict 方法了。

比如剛才我們看到 “朝陽(yáng)” 兩個(gè)字的發(fā)音默認(rèn)返回的是 zhao yang,我們想默認(rèn)返回 chao yang,那可以這么做:

from pypinyin import lazy_pinyin, load_phrases_dict
 
print(lazy_pinyin('朝陽(yáng)'))
personalized_dict = {
    '朝陽(yáng)': [['cháo'], ['yáng']]
}
load_phrases_dict(personalized_dict)
print(lazy_pinyin('朝陽(yáng)'))

這里我們自定義了一個(gè)詞典,然后使用 load_phrases_dict 方法設(shè)置了一下就可以了。

運(yùn)行結(jié)果:

['zhao', 'yang']
['chao', 'yang']

這樣就可以完成自定義的設(shè)置了。

在一些項(xiàng)目里面我們可以自定義很多拼音庫(kù),然后加載就可以了。

另外我們還可以注冊(cè)樣式實(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':kissing_heart:{pinyin}'
    return pinyin
 
print(lazy_pinyin('么么噠', style='kiss'))

運(yùn)行結(jié)果:

[':kissing_heart:me', ':kissing_heart:me', 'dá']

這里我們調(diào)用 register 方法注冊(cè)了一個(gè)樣式 style,然后轉(zhuǎn)換的時(shí)候指定即可,通過(guò)觀察運(yùn)行結(jié)果我們可以發(fā)現(xiàn),這樣我們就可以將 me 字的拼音前面加上 :kissing_heart: 這個(gè) Emoji 表情了。

以上就是Python 中拼音庫(kù) PyPinyin 的用法的詳細(xì)內(nèi)容,更多關(guān)于Python拼音庫(kù) PyPinyin 的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 在linux下實(shí)現(xiàn) python 監(jiān)控usb設(shè)備信號(hào)

    在linux下實(shí)現(xiàn) python 監(jiān)控usb設(shè)備信號(hào)

    今天小編就為大家分享一篇在linux下實(shí)現(xiàn) python 監(jiān)控usb設(shè)備信號(hào),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • Pytest如何使用skip跳過(guò)執(zhí)行測(cè)試

    Pytest如何使用skip跳過(guò)執(zhí)行測(cè)試

    這篇文章主要介紹了Pytest如何使用skip跳過(guò)執(zhí)行測(cè)試,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • python 模擬登陸github的示例

    python 模擬登陸github的示例

    這篇文章主要介紹了python 模擬登陸github的示例代碼,幫助大家更好的理解和學(xué)習(xí)python 爬蟲的相關(guān)知識(shí),感興趣的朋友可以了解下
    2020-12-12
  • Python編程如何在遞歸函數(shù)中使用迭代器

    Python編程如何在遞歸函數(shù)中使用迭代器

    今天下午想要復(fù)現(xiàn)一下學(xué)長(zhǎng)的recursion file,想模仿源碼里的精髓:迭代器遇到了bug,花了一兩個(gè)小時(shí)才解決?,F(xiàn)總結(jié)如下,有需要的朋友也可借鑒參考下
    2021-09-09
  • python sort、sort_index方法代碼實(shí)例

    python sort、sort_index方法代碼實(shí)例

    這篇文章主要介紹了python sort、sort_index方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 人臉識(shí)別具體案例

    人臉識(shí)別具體案例

    出于興趣和對(duì)IU的喜愛,筆者花了幾天嘗試用爬蟲從百度圖片獲取人物圖片并下載,利用深度神經(jīng)網(wǎng)絡(luò)從其中識(shí)別出人,并將圖片保存至文件夾。若讀者有興趣可以參考下
    2021-04-04
  • Python中使用Opencv開發(fā)停車位計(jì)數(shù)器功能

    Python中使用Opencv開發(fā)停車位計(jì)數(shù)器功能

    這篇文章主要介紹了Python中使用Opencv開發(fā)停車位計(jì)數(shù)器,本教程最好的一點(diǎn)就是我們將使用基本的圖像處理技術(shù)來(lái)解決這個(gè)問(wèn)題,沒(méi)有使用機(jī)器學(xué)習(xí)、深度學(xué)習(xí)進(jìn)行訓(xùn)練來(lái)識(shí)別,感興趣的朋友跟隨小編一起看看吧
    2022-04-04
  • Python3編碼問(wèn)題 Unicode utf-8 bytes互轉(zhuǎn)方法

    Python3編碼問(wèn)題 Unicode utf-8 bytes互轉(zhuǎn)方法

    今天小編就為大家分享一篇Python3編碼問(wèn)題 Unicode utf-8 bytes互轉(zhuǎn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • 詳解MySQL數(shù)據(jù)類型int(M)中M的含義

    詳解MySQL數(shù)據(jù)類型int(M)中M的含義

    int(M)拆分來(lái)說(shuō),int是代表整型數(shù)據(jù)那,么中間的M應(yīng)該是代表多少位了,后來(lái)查mysql手冊(cè)也得知了我的理解是正確的,下面這篇文章小編就來(lái)舉例詳細(xì)說(shuō)明。 文中介紹的很詳細(xì),相信對(duì)大家的理解和學(xué)習(xí)很有幫助,有需要的朋友們下面就來(lái)學(xué)習(xí)學(xué)習(xí)吧。
    2016-11-11
  • Python 獲得命令行參數(shù)的方法(推薦)

    Python 獲得命令行參數(shù)的方法(推薦)

    本篇將介紹python中sys, getopt模塊處理命令行參數(shù)的方法,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2018-01-01

最新評(píng)論

平果县| 余姚市| 兴安盟| 林周县| 安龙县| 射阳县| 上栗县| 扎赉特旗| 中阳县| 秭归县| 乐清市| 铜川市| 南召县| 开远市| 吉水县| 卫辉市| 九龙城区| 潞西市| 肥东县| 琼中| 会理县| 利津县| 林西县| 察隅县| 福鼎市| 镇宁| 新沂市| 涞源县| 和顺县| 林甸县| 晋宁县| 集安市| 宁明县| 江源县| 桐梓县| 大连市| 泸定县| 油尖旺区| 宜黄县| 布拖县| 改则县|