溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python中PyPinyin庫的示例

發(fā)布時間:2020-11-03 09:59:21 來源:億速云 閱讀:140 作者:小新 欄目:編程語言

小編給大家分享一下Python中PyPinyin庫的示例,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

Python 中提供了漢字轉(zhuǎn)拼音的庫,名字叫做 PyPinyin,可以用于漢字注音、排序、檢索等等場合,是基于 hotto/pinyin 這個庫開發(fā)的。

它有這么幾個特性:

根據(jù)詞組智能匹配最正確的拼音。

支持多音字。

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

支持多種不同拼音/注音風(fēng)格。

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

安裝

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

pip3 install pypinyin

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

>>> import pypinyin

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

基本拼音

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

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

運行結(jié)果:

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

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

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

from pypinyin import pinyin
print(pinyin('朝陽'))

運行結(jié)果:

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

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

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

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

運行結(jié)果:

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

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

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

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

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

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

運行結(jié)果:

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

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

這里我們就有一個疑問了,為啥 pinyin 方法返回的結(jié)果默認是帶音調(diào)的,而 lazy_pinyin 是不帶的,這里面就涉及到一個風(fēng)格轉(zhuǎn)換的問題了。

風(fēng)格轉(zhuǎn)換

我們可以對結(jié)果進行一些風(fēng)格轉(zhuǎn)換,比如不帶聲調(diào)風(fēng)格、標準聲調(diào)風(fēng)格、聲調(diào)在拼音之后、聲調(diào)在韻母之后、注音風(fēng)格等等,比如我們想要聲調(diào)放在拼音后面,可以這么來實現(xiàn):

from pypinyin import lazy_pinyin, Style
 
style = Style.TONE3
print(lazy_pinyin('聰明的小兔子', style=style))

運行結(jié)果:

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

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

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

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

好,再回到原來的問題,為什么 pinyin 的方法默認帶聲調(diào),而 lazy_pinyin 方法不帶聲調(diào),答案就是:它們二者使用的默認風(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)

錯誤處理

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

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

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

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

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

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

errors 參數(shù)是有幾種模式的:

default:默認行為,不處理,原木原樣返回

ignore:忽略字符,直接拋掉

replace:直接替換為去掉 u 的 unicode 編碼

callable 對象:當傳入一個可調(diào)用的對象的時候,則可以自定義處理方式。

下面是 errors 這個參數(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))

自定義拼音

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

比如剛才我們看到 “朝陽” 兩個字的發(fā)音默認返回的是 zhao yang,我們想默認返回 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('朝陽'))

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

運行結(jié)果:

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

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

在一些項目里面我們可以自定義很多拼音庫,然后加載就可以了。

另外我們還可以注冊樣式實現(xiàn)自定義,比如將某個拼音前面加上 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'))

運行結(jié)果:

['me', 'me', 'dá']

看完了這篇文章,相信你對Python中PyPinyin庫的示例有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI