谐 音 梗 生 成 器
M小白 | 文
关注一下公众号,帮助作者脱贫致富
duck不必,baby无耻……如何批量制造李诞的快乐源泉。(封面灵感来自奇葩说)
本文章为技术杂学铺公众号第192篇推文
阅读全文预计约9分钟
段子:★★
知识:★★★
阅读本文你将学到:字符串相似度
谐音梗,即通过谐音来制造笑点,比如book思议,Tony带水,贪生pass等等。
谐音梗相较于其他段子来说比较容易创作,不用花费太多心思就能创作出令人愉悦的段子。当然,在李诞同学面前讲谐音梗会获得双倍的愉悦。
谐音梗——李诞的快乐源泉
既然谐音梗如此有趣,那我们能否用程序自动生成谐音梗呢?本文中,我们将制作谐音梗生成器,又名李诞同学的快乐源泉。
首先,我们要明确目标:给出一个成语(如有备而来),谐音梗生成器可以自动将其中的两个字替换成读音相似的英文单词(如有bear来)。
明确了目标后,谐音梗生成器的大体思路如下:
谐音梗生成器 总流程图
第一步:汉语转拼音
首先,我们将汉字成语(有备而来)转换成拼音(you-bei-er-lai)。
在此类问题上,已有很多现成的函数库,直接调用即可(如python中的xpinyin)
第二步:准备英语词典
紧接着,我们需要准备一个英语词典。
为了简化计算,我们只需要考虑最常用的小学词汇,并筛选出所有长度为3-5个字母的单词。
一个包含音标的小学词汇英语词典
这样选出的单词能保证大部分读者认识,如green,blue,time等等,同时也会减少后面字符串匹配的工作量。毕竟一些如supercali...的超长单词是绝对用不上的。
Supercalifragilisticexpialidocious
(人见人爱,花见花开,车见爆胎)
第三步:字符串相似度计算与匹配
已有了一个成语的拼音(YouBeiErLai)以及由上千的简单词汇组成的英语词典后,下一步就是进行字符串匹配了。
这里的匹配不是说找出与成语拼音完全一模一样的英文单词,而是先计算出与成语拼音与各英文单词的相似度,然后进行字符串替换。
于是乎,最重要的问题来了:
如何定义两个字符串的相似度?
第四步:最终效果与进一步完善
我们将上述的几个步骤进行一个整合:
给出单词“有备而来”,将其转换成拼音“You Bei Er Lai”
另外,准备好由若干简单英文单词构成的词库。
选择四字词语里的两个字,如选择“备而”(这里的选择可以人工手动选,也可以遍历所有可能的组合,最后选出最佳的结果即可)
“备而”的拼音是“beier”。采用第三步中介绍的某一个算法(如编辑距离)来计算“beier”与英语词典中的所有词(able,above,act...,zoo)的字符串相似度。
最终我们发现单词“beer”与拼音“beier”的相似度最高,高达0.88888(如果按照第三步中对编辑距离的介绍,则其编辑距离为1)
于是,我们可以用单词“beer”来代替拼音“beier”,成语“有备而来”也就变成了“有beer来”。
“欢天喜地”变成了“hunt喜地”
上述方法在部分情况下可以达到不错的效果,但在有些时候,还是略有缺陷的。
比如“不可思议”中的“不可”,拼音是“buke”,发音相似的单词应该是“book”,但是由于编辑距离的定义,“buke”与“book”的编辑距离是4(删除掉buke中的u和e,并加上两个o)。“buke” 与 “bake” 、 “bike” 的编辑距离是1,于是输出结果就成了“bake思议”。
虽说结果也可以,但仍旧有提升的空间。
那有没有什么比较好的提升方法呢?
有的!用音标!
拼音是对中文汉字进行注音,音标是对英文单词进行注音。拼音和音标正好可以对接起来!
新算法的流程图如下:
整体思路保持不变,仍旧是给出汉字“有备而来”,转为拼音“YouBeiErLai”,选择待匹配拼音“BeiEr”。
新算法对要匹配的英文单词进行了修改。首先,我们通过查询英文词典,可以得知每个单词的音标:“beer”对应“ber”,“sky”对应“skaɪ”。
接着,我们手动设置每个音标对应什么声音。比如音标“aɪ”对应中文拼音的“ai”,音标“ð”音似中文的“zhe”,音标“ˈ”是用于表示重读,这里直接忽略。
最后,我们编写一个音标转近似拼音的函数
单词“beer”的音标“ber”近似为拼音后保持不变,仍旧为“ber”,而单词“sky”的音标“skaɪ”近似为拼音后则变为了“skai”。
此时,我们将“有备而来”中的拼音“BeiEr”与这些近似的拼音进行字符串匹配即可。最后发现单词“beer”的近似音标“ber”与拼音“BeiEr”最相似,于是就用“beer”来代替“备而”。
新方法会比直接用英文单词进行字符串相似度计算性能会好一点,但也不会好多少。
比如“不可思议”中的“不可”(“buke”)用旧方法智能找到“bake”,“bike”。使用新方法后可以找出“book”,但同时也找到了其他不太相关的词如“box”,“block”等等。
包括“谐音梗生成器”在内的往期文章代码
近期会上传至GITHUB
github.com/DrMofu/MLab_wechat
推荐阅读
(点击图片即可访问)
如果你觉得本篇文章比较有意思,欢迎关注技术杂学铺公众号,点赞分享本文章。
网站mwhitelab.com重做了
点击“阅读原文”就能访问了