Python汉字转拼音——用pypinyin与xpinyin找出成语接龙的杀手锏

How to Train Your Dragon(来自《驯龙高手》剧照)

为了陪孩子玩成语接龙,于是想找出那些一击必杀的成语,类似‘一个顶俩’【yí, gè,dǐng',liǎ】这种。
在网上搜索了下,从漢典网等网站上可以查询成语。另外,Github也有查询成语的API,不过为了方便,还是决定自己动手。

pypinyin与xpinyin包

Python实现汉字转拼音,常用的包是pypinyin 0.37.0和xpinyin 0.5.6两个。
另外,SnowNLP: Simplified Chinese Text Processing和小明 NLP也是有汉字转拼音功能的,但这两个包不是专注于汉字转拼音,因此相对而言比起前面提到的pypinyin和xpinyin,在拼音这一项上要弱许多,比如无法给出拼音的音调,有些不是很生僻的成语也不能给出拼音(如下图),所以只重点去试了前面提到的两个包。

xmnlp测试

snownlp测试

默认参数

总的来说,pypinyin的功能更加全面。先来看默认参数下的转拼音结果。pypinyin提供了‘slug、pinyin’和‘lazy_pinyin’三个函数,区别在于是否返回结果是否默认带音调、结果是字符串还是列表以及分隔符等区别。xpinyin则是‘get_pinyin’这一个函数,但可以通过参数来返回带音调拼音、改变分隔符等。

from pypinyin import pinyin, lazy_pinyin, slug
from xpinyin import Pinyin

from pypinyin import load_phrases_dict,load_single_dict, Style

word = '魑魅魍魉'
print('pypinyin默认参数结果:')
print('\t',pinyin(word))
print('\t',lazy_pinyin(word))
print('\t',slug(word))
print('xpinyin默认参数结果:')
print('\t',Pinyin().get_pinyin(word))

默认参数

本人是更习惯返回带音调的、空格符分隔的字符串结果,因此用的pypinyin包中的slug()命令更多一些,自动参数 * style=Style.TONE *(拼音带音调)和 separator=' '(空格分隔)。

slug(word, separator=' ',  style=Style.TONE)

为了对比两个包的汉字转拼音结果,用《生僻字》歌词来测试的结果如下:

《生僻字》歌词结果比较

结果来看,明显pypinyin的对于多音字(比如陟罚臧否中的‘否’字、奉为圭臬中的‘为’字)。xpinyin对于生僻字无法给出结果(如字)、或是识别错误(如犄角旮旯中的‘旮旯’两字、腌臜孑孓一句中的‘腌臜’两字)。

pypinyin的heteronym参数与style参数

pypinyin作为汉字转拼音的首选python包,其中heteronym参数与style参数值得注意下。
heteronym参数是多音字模式开关参数,测试下来,我的理解设置** heteronym = True ** 后,可能在有些情况下(是pypinyin无法判断时)会将多音字所有可能的读音都列出来,如下所示,比如'好了'两字。但如果pypinyin能够判断时,heteronym参数对结果无影响,比如'小时了了,大未必佳'中的'了了'二字,pypinyin并不会返回'le le'的结果出现。

heteronym参数

style参数是旋转返回结果音调位置、声母韵母首字母还是全部等等。总之,pypinyin的style参数更为灵活,可以根据需要返回想要的结果。

style选项 参数值 返回结果
常规 Style.NORMAL su hai han chao
拼音带音调 Style.TONE sū hǎi hán cháo
音调数字位于声母韵母之间 Style.TONE2 su1 ha3i ha2n cha2o
音调数字位于韵母之后 Style.TONE3 su1 hai3 han2 chao2
声母 Style.INITIALS s h h ch
首字母 Style.FIRST_LETTER s h h c
韵母 Style.FINALS u ai an ao
韵母带音调 Style.FINALS_TONE ū ǎi án áo
韵母,音调数字位于韵母首字母之间 Style.FINALS_TONE2 u1 a3i a2n a2o
韵母,音调数字位于最后 Style.FINALS_TONE3 u1 ai3 an2 ao2
注音符 Style.BOPOMOFO ㄙㄨ ㄏㄞˇ ㄏㄢˊ ㄔㄠˊ
声母注音符 Style.BOPOMOFO_FIRST ㄙ ㄏ ㄏ ㄔ
style参数

pypinyin的load_phrases_dict和load_single_dict命令

前面已经提到pypinyin的结果正确率更高,但这并不意味着pypinyin返回的结果就百分百一定正确。在将接龙成语转拼音时也发现,极少情况下,xpinyin返回了正确结果,pypinyin的结果反而有误。对于这些被发现的错误拼音,可以通过** load_phrases_dict **生成自定义词典来修正。


load_phrases_dict自定义词典

此外** load_single_dict ** 可以调整对于多音字其结果中的出现顺序:
比如以其人之道,还治其人之身一句中的‘还’字,默认情况下pypinyin是先转换为‘huai’的读音。

多音字的识别顺序

正如结果所示,多音字的顺序并不需要特别操心,pypinyin多数情况下对于成语、词组之类都可以自动识别并给出正确的拼音。
pypinyin还给出了轻声的音调等参数设置,感兴趣的可以去看pypinyin 0.37.0 文档。
值得一提的是,拼音的轻声确实是在成语接龙中稍微比较令人头疼的问题之一。比方对方说‘唐突西子’我接龙‘子虚乌有’,在我看来是完全可以的,但在pypinyin给出的拼音结果来看,这两个成语中的'zi'一个是轻声一个是三声,是不同的两个读音。而且实际上,我收集到的成语库中,根本就找不到以轻声的‘zi’开头的成语。所以如果让程序自动去查找接龙的成语的话,可能就不得不要考虑轻声声调的问题。
所以简单起见,干脆还是用load_phrases_dict 自定义词典将pypinyin认为的轻声都给改为原来的读音最是直截了当。

成语接龙杀手锏

成语来源包括网上下载到的TXT(PDF、Epub)文件,包括前述Github上的JSON文件等。中间过程不赘述了,无非是按照文件中的格式,正则表达式提取出成语(以及拼音),整理清洗后共计31063个条目。

中华成语大词典

折腾了一番,利用pypinyin将成语转拼音,再用pandas查询的结果。
不考虑轻声的拼音,整理出的成语接龙必杀技如下:

成语 拼音 成语 拼音
放荡形骸 fàng dàng xíng hái 言简意该 yán jiǎn yì gāi
春梦无痕 chūn mèng wú hén 弄兵潢池 nòng bīng huáng shi
唐临晋帖 táng lín jìn tiē 七拼八凑 qī pīn bā còu
发蒙解缚 fā méng jiě fu 张牙舞爪 zhāng yá wǔ zhǎo
作好作歹 zuò hǎo zuò dǎi 衣食税租 yī shí shuì zū
完美无疵 wán měi wú cī 敲骨榨髓 qiāo gǔ zhà suǐ
锯牙钩爪 jù yá gōu zhǎo 心潮澎湃 xīn cháo pēng pài
同源异派 tóng yuán yì pài 云期雨约 yún qī yǔ yuē
撮科打閧 cuō kē dǎ hòng 成龙配套 chéng lóng pèi tào
膏梁纨裦 gāo liáng wán fóu 无理取闹 wú lǐ qǔ nào
插圈弄套 chā quān nòng tào 长篇大套 cháng piān dà tào
服服贴贴 fú fú tiē tiē 老蚌珠胎 lǎo bàng zhū tāi
牙签玉轴 yá qiān yù zhóu 牙签犀轴 yá qiān xī zhóu
狼艰狈蹶 láng jiān bèi juě 东挪西凑 dōng nuó xī còu
做好做歹 zuò hǎo zuò dǎi 七担八挪 qī dān bā nuó
桑间之约 sāng jiān zhī yuē 血肉模糊 xuè ròu mó hu
恶迹昭着 è jì zhāo zhe 彰明昭着 zhāng míng zhāo zhe
一针见血 yī zhēn jiàn xiě 敌王所忾 dí wáng suǒ kài
百年之约 bǎi nián zhī yuē 不尴不尬 bù gān bù gà
为非作歹 wéi fēi zuò dǎi 轻描淡写 qīng miáo dàn xiě
丛轻折轴 cóng qīng zhé zhóu 孽根祸胎 niè gēn huò tāi
打闷葫芦 dǎ mèn hú lu 膏粱纨袴 gāo liáng wán kù
与时消息 yǔ shí xiāo xi 火耕水耨 huǒ gēng shuǐ nòu
唯唯否否 wěi wěi fǒu fǒu 瓮中捉鳖 wèng zhōng zhuō biē
丰神绰约 fēng shén chuò yuē 握粟出卜 wò sù chū bo
生搬硬套 shēng bān yìng tào 心惊胆颤 xīn jīng dǎn chàn
龙血凤髓 lóng xuè fèng suǐ 怀着鬼胎 huái zhe guǐ tāi
隐隐约约 yǐn yǐn yuē yuē 言简意赅 yán jiǎn yì gāi
人民城郭 rén mín chéng guō 牙签万轴 yá qiān wàn zhóu
失马塞翁 shī mǎ sài wēng 车马辐辏 chē mǎ fú còu
莺期燕约 yīng qī yàn yuē 相忘形骸 xiāng wàng xíng hái
杀人如蒿 shā rén rú hāo 秉钧当轴 bǐng jūn dāng zhóu
不落俗套 bù luò sú tào 依样葫芦 yī yàng hú lu
雕心鹰爪 diāo xīn yīng zhǎo 换骨脱胎 huàn gǔ tuō tāi
东补西凑 dōng bǔ xī còu 鹰心雁爪 yīng xīn yàn zhǎo
索垢寻疵 suǒ gòu xún cī 等米下锅 děng mǐ xià guō
捶骨沥髓 chuí gǔ lì suǐ 金屋娇娘 jīn wū jiāo niáng
刀枪入库 dāo qiāng rù kù 伐毛换髓 fá máo huàn suǐ
深入骨髓 shēn rù gǔ suǐ 力有未逮 lì yǒu wèi dǎi
深刺腧髓 shēn cì shù suǐ 病入骨髓 bìng rù gǔ suǐ
语简意赅 yǔ jiǎn yì gāi 心怀鬼胎 xīn huái guǐ tāi
敲膏吸髓 qiāo gāo xī suǐ 榆木疙瘩 yú mù gē da
倒廪倾囷 dǎo lǐn qīng qūn 汹涌澎湃 xiōng yǒng péng pài
吹唇唱吼 chuī chún chàng hǒu 敲骨吸髓 qiāo gǔ xī suǐ
膏粱纨裦 gāo liáng wán fóu 半间不界 bàn gān bù gà
汹涌彭湃 xiōng yǒng péng pài 鱼封雁帖 yú fēng yàn tiē
说好说歹 shuō hǎo shuō dǎi 赏善罚否 shǎng shàn fá fǒu
大醇小疵 dà chún xiǎo cī 东鳞西爪 dōng lín xī zhǎo
泣血稽颡 qì xuè jī sǎng 黏吝缴绕 nián lìn jiǎo rào
披毛求疵 pī máo qiú cī 鼓鼓囊囊 gǔ gǔ nāng nāng
证龟成鳖 zhèng guī chéng biē 钟鼎人家 zhōng dǐng rén jia
尺二冤家 chǐ èr yuān jia 四方辐辏 sì fāng fú còu
易子析骸 yì zi xī hái 阿家阿翁 ā gū ā wēng
同仇敌忾 tóng chóu dí kài 踉踉跄跄 liàng liàng qiàng qiàng
指囷相赠 zhǐ què xiāng zèng 将虾钓鳖 jiāng xiā diào biē
挠喉捩嗓 náo hóu liè sǎng 辞简义赅 cí jiǎn yì gāi
浊骨凡胎 zhuó gǔ fán tāi 丽藻春葩 lì zǎo chūn pā
雪泥鸿爪 xuě ní hóng zhǎo 坏裳为裤 huài shang wéi kù
牙签锦轴 yá qiān jǐn zhóu 若敖鬼馁 ruò áo guǐ něi
夹枪带棍 jiā qiāng dài gùn 肉眼凡胎 ròu yǎn fán tāi
魂飞胆颤 hún fēi dǎn chàn 半间半界 bàn gān bàn gà
魂惊胆颤 hún jīng dǎn chàn 龙游曲沼 lóng yóu qū zhǎo
榆木圪垯 yú mù gē da 翠围珠绕 cuì wéi zhū rào
救过不给 jiù guò bù gěi 剥肤及髓 bō fū jí suǐ
吹毛索疵 chuī máo suǒ cī 雪鸿指爪 xuě hóng zhǐ zhǎo
花枝招颤 huā zhī zhāo chàn 雷惊电绕 léi jīng diàn rào
一鳞片爪 yī lín piàn zhǎo 伐毛洗髓 fá máo xǐ suǐ
鸿泥雪爪 hóng ní xuě zhǎo 汹涌渒湃 xiōng yǒng pài pài
先斩后奏 xiān zhǎn hòu zòu 抽抽噎噎 chōu chōu yē yē
羹藜含糗 gēng lí hán qiǔ 八音迭奏 bā yīn dié zòu
鱼釜尘甑 yú fǔ chén zèng 嫌好道歹 xián hǎo dào dǎi
群轻折轴 qún qīng zhé zhóu 吹花嚼蕊 chuī huā jiáo ruǐ
余音缭绕 yú yīn liáo rào 一推两搡 yī tuī liǎng sǎng
插架万轴 chā jià wàn zhóu 幽期密约 yōu qī mì yuē
青鞋布袜 qīng xié bù wà 人涉卬否 rén shè áng fǒu
饰垢掩疵 shì gòu yǎn cī 东游西逛 dōng yóu xī guàng
一鳞半爪 yī lín bàn zhǎo 东拼西凑 dōng pīn xī còu
枉曲直凑 wǎng qǔ zhí còu 不识好歹 bù shí hǎo dǎi
片鳞半爪 piàn lín bàn zhǎo 不知好歹 bù zhī hǎo dǎi
批毛求疵 pī máo qiú cī 油头光棍 yóu tóu guāng gùn
骈首就逮 pián shǒu jiù dǎi 鸿篇巨着 hóng piān jù zhe
珠围翠绕 zhū wéi cuì rào 刀耕火耨 dāo gēng huǒ nòu
深耕易耨 shēn gēng yì nòu 四肢百骸 sì zhī bǎi hái
应名点卯 yìng míng diǎn mǎo 鸾鸣凤奏 luán míng fèng zòu
丰姿绰约 fēng zī chuò yuē 河东狮吼 hé dōng shī hǒu
椎肤剥髓 chuí fū bō suǐ 敲骨取髓 qiāo gǔ qǔ suǐ
土木形骸 tǔ mù xíng hái 自出机轴 zì chū jī zhóu
一鳞一爪 yī lín yī zhǎo 沦肌浃髓 lún jī jiā suǐ
秉钧持轴 bǐng jūn chí zhóu 袅袅娜娜 niǎo niǎo nuó nuó
同心敌忾 tóng xīn dí kài 龙肝凤髓 lóng gān fèng suǐ
刮垢磨痕 guā gòu mó hén 鼓吻奋爪 gǔ wěn fèn zhǎo
黄锺瓦缶 huáng zhōng wǎ fǒu 不间不界 bù gān bù gà
阿姑阿翁 ā gū ā wēng 不置可否 bù zhì kě fǒu
龙肝豹胎 lóng gān bào tāi 不越雷池 bù yuè léi shi
子丑寅卯 zi chǒu yín mǎo 娉婷袅娜 pīng tíng niǎo nuó
撮科打哄 cuō kē dǎ hòng 不哼不哈 bù hēng bù hā
没头苍蝇 méi tóu cāng ying 锦囊玉轴 jǐn náng yù zhóu
饥寒交凑 jī hán jiāo còu 瓮中之鳖 wèng zhōng zhī biē
雕心雁爪 diāo xīn yàn zhǎo 戳心灌髓 chuō xīn guàn suǐ
拉帮结派 lā bāng jié pài 进退可否 jìn tuì kě fǒu
痛入骨髓 tòng rù gǔ suǐ 放浪形骸 fàng làng xíng hái
进可替否 jìn kě tì fǒu 恨入骨髓 hèn rù gǔ suǐ
大大咧咧 dà dà liē liē 鸿飞雪爪 hóng fēi xuě zhǎo
十捉九着 shí zhuō jiǔ zhe 韩卢逐逡 hán lú zhú qūn
门不夜扃 mén bù yè jiōng 行眠立盹 xíng mián lì dǔn
整本大套 zhěng běn dà tào 沦浃肌髓 lún jiā jī suǐ
以规为瑱 yǐ guī wéi tiàn 空头支票 kōng tóu zhī piào
雪中鸿爪 xuě zhōng hóng zhǎo 羹藜唅糗 gēng lí hán qiǔ
背盟败约 bèi méng bài yuē 凿骨捣髓 záo gǔ dǎo suǐ
无所可否 wú suǒ kě fǒu 祝哽祝噎 zhù gěng zhù yē
澡垢索疵 zǎo gòu suǒ cī 献可替否 xiàn kě tì fǒu
不猧不魀 bù wō bù gà 厉行节约 lì xíng jié yuē
麟肝凤髓 lín gān fèng suǐ 蹈矩循彟 dǎo jǔ xún yuē
雾鳞云爪 wù lín yún zhǎo 三好两歹 sān hǎo liǎng dǎi
吹叶嚼蕊 chuī yè jiáo ruǐ 献替可否 xiàn tì kě fǒu
飞鸿雪爪 fēi hóng xuě zhǎo 重生爷娘 chóng shēng yé niáng
陈言老套 chén yán lǎo tào 露钞雪纂 lù chāo xuě zuǎn
修鳞养爪 xiū lín yǎng zhǎo 怨入骨髓 yuàn rù gǔ suǐ
由博返约 yóu bó fǎn yuē 龙鸣狮吼 lóng míng shī hǒu
浮花浪蕊 fú huā làng ruǐ 换骨夺胎 huàn gǔ duó tāi
龙蟠虎绕 lóng pán hǔ rào 吹毛求疵 chuī máo qiú cī
敲骨剥髓 qiāo gǔ bāo suǐ 说好嫌歹 shuō hǎo xián dǎi
就棍打腿 jiù gùn dǎ tuǐ 婆婆妈妈 pó po mā mā
握拳透爪 wò quán tòu zhǎo 劣迹昭着 liè jì zhāo zhe
口谐辞给 kǒu xié cí gěi 剔抽禿刷 tī chōu tū shuā
风姿绰约 fēng zī chuò yuē 滴水不羼 dī shuǐ bù chàn
瑶草琪葩 yáo cǎo qí pā 祝鲠祝噎 zhù gěng zhù yē
东闪西挪 dōng shǎn xī nuó 匡其不逮 kuāng qí bù dǎi
浃沦肌髓 jiā lún jī suǐ 义正辞约 yì zhèng cí yuē
桑中之约 sāng zhōng zhī yuē 犬牙鹰爪 quǎn yá yīng zhǎo
四体百骸 sì tǐ bǎi hái 根连株逮 gēn lián zhū dǎi

类似痛定思痛、防不胜防、数不胜数、微乎其微、忍无可忍、惺惺惜惺惺……这样的首尾两字均相同的成语也没有收入了。个人觉得这种只是属于死循环,而不是死胡同的必杀。
另外盛行的‘一个顶俩’没包括在上面,因为我收集到的成语词典中没有这一条。

参考资料
  1. pypinyin 0.37.0 文档
  2. xpinyin 0.5.6
  3. SnowNLP: Simplified Chinese Text Processing
  4. 小明 NLP — 轻量级中文自然语言处理工具
  5. 利用python实现汉字转拼音的2种方法
  6. Python中文分词工具大合集:安装、使用和测试
  7. chinese-poetry: 最全中文诗歌古典文集数据库
  8. 【Python】使用python实现汉字转拼音(2018.12更新)
  9. 汉典网
  10. Github: pwxcoo-chinese-xinhua
image.png

你可能感兴趣的:(Python汉字转拼音——用pypinyin与xpinyin找出成语接龙的杀手锏)