Python+pypinyin實(shí)現(xiàn)將中文姓名拼音轉(zhuǎn)換與搜索
Python 使用 pypinyin 將中文姓名轉(zhuǎn)換為拼音并支持拼音搜索
在實(shí)際業(yè)務(wù)中,我們經(jīng)常會(huì)遇到這樣的需求:
- 將中文姓名轉(zhuǎn)換為拼音
- 支持通過(guò)拼音或拼音首字母搜索中文姓名
- 結(jié)合 Pandas 對(duì)數(shù)據(jù)進(jìn)行批量處理
本文將基于 pypinyin + pandas,實(shí)現(xiàn)一個(gè)優(yōu)雅且實(shí)用的中文姓名拼音轉(zhuǎn)換與搜索方案。
一、環(huán)境準(zhǔn)備
安裝依賴
pip install pandas pypinyin
導(dǎo)入必要的庫(kù)
import pandas as pd from pypinyin import pinyin, Style
二、示例數(shù)據(jù)準(zhǔn)備
假設(shè)我們有一列中文姓名數(shù)據(jù):
data = {
'name': ['張三', '李四', '王小五', '趙六']
}
df = pd.DataFrame(data)
當(dāng)前 DataFrame 結(jié)構(gòu)如下:
| name |
|---|
| 張三 |
| 李四 |
| 王小五 |
| 趙六 |
三、實(shí)現(xiàn)姓名拼音轉(zhuǎn)換函數(shù)
我們希望實(shí)現(xiàn)兩個(gè)拼音字段:
- full_pinyin:姓名全拼(如
zhangsan) - initials:姓全拼 + 名首字母(如
zhangs)
核心函數(shù)實(shí)現(xiàn)
def get_full_pinyin_and_initials(name):
"""
將中文姓名轉(zhuǎn)換為:
1. 全拼
2. 姓全拼 + 名首字母
"""
# 全拼(張三 -> zhangsan)
full_pinyin = ''.join(
pinyin(name, style=Style.NORMAL)[i][0]
for i in range(len(name))
)
# 姓的全拼
surname_pinyin = pinyin(name[0], style=Style.NORMAL)[0][0]
# 名的首字母
name_initials = pinyin(name[1:], style=Style.FIRST_LETTER)
initials = surname_pinyin + ''.join(i[0] for i in name_initials)
return full_pinyin, initials
四、批量生成拼音字段
使用 apply + pd.Series,將返回的元組拆分成多個(gè)列:
df[['full_pinyin', 'initials']] = (
df['name']
.apply(get_full_pinyin_and_initials)
.apply(pd.Series)
)
處理后的 DataFrame:
| name | full_pinyin | initials |
|---|---|---|
| 張三 | zhangsan | zhangs |
| 李四 | lisi | lis |
| 王小五 | wangxiaowu | wangxw |
| 趙六 | zhaoliu | zhaol |
五、實(shí)現(xiàn)拼音搜索功能
支持以下兩種搜索方式:
- 全拼搜索
- 拼音首字母搜索
搜索函數(shù)實(shí)現(xiàn)
def find_name_by_pinyin(input_pinyin):
"""
根據(jù)拼音或拼音首字母查找姓名
"""
matched_names = df[
df['initials'].str.contains(input_pinyin, na=False) |
df['full_pinyin'].str.contains(input_pinyin, na=False)
]
return matched_names
六、使用示例
input_pinyin = "zhangs" result = find_name_by_pinyin(input_pinyin) print(result)
輸出結(jié)果:
name full_pinyin initials
0 張三 zhangsan zhangs
七、完整代碼
import pandas as pd
from pypinyin import pinyin, Style
# 假設(shè)你的 DataFrame 是這樣的
data = {
'name': ['張三', '李四', '王小五', '趙六']
}
df = pd.DataFrame(data)
# 定義獲取拼音的函數(shù)
def get_full_pinyin_and_initials(name):
# 獲取全拼
full_pinyin = ''.join(pinyin(name, style=Style.NORMAL)[i][0] for i in range(len(name)))
# 獲取姓的拼音和名的首字母
surname_pinyin = pinyin(name[0], style=Style.NORMAL)[0][0] # 姓的全拼
name_initial = pinyin(name[1:], style=Style.FIRST_LETTER) # 名的首字母
initials = surname_pinyin + ''.join(n[0] for n in name_initial)
return full_pinyin, initials
# 應(yīng)用函數(shù)并創(chuàng)建新的列
df[['full_pinyin', 'initials']] = df['name'].apply(get_full_pinyin_and_initials).apply(pd.Series)
# 定義查找姓名的函數(shù)
def find_name_by_pinyin(input_pinyin):
# 查找與輸入拼音匹配的姓名
matched_names = df[df['initials'].str.contains(input_pinyin, na=False) |
df['full_pinyin'].str.contains(input_pinyin, na=False)]
return matched_names
# 示例:查找拼音
input_pinyin = "zhangs" # 你想要查找的拼音
result = find_name_by_pinyin(input_pinyin)
# 打印結(jié)果
print(result)
以上就是Python+pypinyin實(shí)現(xiàn)將中文姓名拼音轉(zhuǎn)換與搜索的詳細(xì)內(nèi)容,更多關(guān)于Python pypinyin拼音轉(zhuǎn)換與搜的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
用python實(shí)現(xiàn)批量重命名文件的代碼
任務(wù)很簡(jiǎn)單,某個(gè)目錄下面有幾千個(gè)文件,某些文件沒有后綴名,現(xiàn)在的任務(wù)就是將所有的沒有后綴名的文件加上后綴名,python有現(xiàn)成的函數(shù)可以實(shí)現(xiàn),但是在實(shí)現(xiàn)過(guò)程中遇到幾個(gè)問(wèn)題,分享一下解決方法2012-05-05
詳解Ubuntu環(huán)境下部署Django+uwsgi+nginx總結(jié)
這篇文章主要介紹了Ubuntu環(huán)境下部署Django+uwsgi+nginx總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
詳解Python中的函數(shù)參數(shù)傳遞方法*args與**kwargs
本文將討論P(yáng)ython的函數(shù)參數(shù)。我們將了解args和kwargs,/和的都是什么,雖然這個(gè)問(wèn)題是一個(gè)基本的python問(wèn)題,但是在我們寫代碼時(shí)會(huì)經(jīng)常遇到,比如timm中就大量使用了這樣的參數(shù)傳遞方式2023-03-03

