突发!员工跳楼!只拿低保工资!央企设计院集体罢工!

突发!北京某院集体罢工!

淄博向东,惠泊向西:在人民与人民币之间,惠泊停车选择了人民币

【少儿禁】马建《亮出你的舌苔或空空荡荡》

10部适合女性看的唯美情色电影

生成图片,分享到微信朋友圈

自由微信安卓APP发布,立即下载! | 提交文章网址
查看原文

神马三押四押 给你来上一打

胡萝卜酱 DataGo数据狗 2022-07-01

大家七夕过的愉快吗?胡萝卜酱来更hiphop歌曲最后一部分了,关于押韵的分析。看今年的新说唱,发现那吾克热他们简直是押韵狂魔啊,怎么能想到那么多可以押韵的词啊?真是令语文一向不好的小编好生羡慕啊。大家还记得可视化篇里面我们已经将中英文分开了吗?鉴于小编能力有限,无法去分析英文的押韵,所以本文只分析了中文部分的。


xpinyin的应用


要想押韵,那么就必须提及我们的拼音呢。如何把汉字转化为拼音呢,那就必须用上xpinyin了。你可以通过pip直接安装,并且它的使用非常的简单,我们通过一个小小的例子来认识一下吧。

1from xpinyin import Pinyin
2p = Pinyin()
3# 默认‘-’分隔
4p.get_pinyin(u"上海")
5'shang-hai'
6# 显示声调
7p.get_pinyin(u"上海", show_tone_marks=True)
8'shàng-hǎi'
9#无分隔
10p.get_pinyin(u"上海"'')
11'shanghai'
12# 空格进行分隔
13p.get_pinyin(u"上海"' ')
14'shang hai'
15#首字母大写,默认‘-’分隔
16p.get_initials(u"上海")
17'S-H'
18#首字母大写,并无分隔
19p.get_initials(u"上海"u'')
20'SH'

是不是觉得很好用啊,其实把汉字转为拼音容易,但我们押韵分析的并不是整个拼音,而只是韵脚,所以,我们进行了下一步。


韵脚分析


分析韵脚,当然要进行一些分类,小编是直接从网上找的,分为下列两个数据集。

1RhymeIndex = [('1', ['a''ia''ua']), ('2', ['ai''uai']), ('3', ['an''ian''uan']),
2              ('4', ['ang''iang''uang']), ('5', ['ao''iao']), ('6', ['e''o''uo']), ('7', ['ei''ui']),
3              ('8', ['en''in''un']), ('9', ['eng''ing''ong''iong']), ('10', ['er']), ('11', ['i']),
4              ('12', ['ie''ye']), ('13', ['ou''iu']), ('14', ['u']), ('16', ['ue']), ('15', ['qu''xu''yu'])]
5
6RhymeDct = {'ui''7''uan''3''ian''3''iu''13''en''8''ue''16''ing''9''a''1''ei''7',
7            'eng''9''uo''6''ye''12''in''8''ou''13''ao''5''uang''4''ong''9''ang''4',
8            'ai''2''ua''1''uai''2''an''3''iao''5''ia''1''ie''12''iong''9''i''11',
9            'er''10''e''6''u''14''un''8''iang''4''o''

现在我们需要做的事,就是让分词出来的中文分别对应于下面那个韵脚。

1chinese_word = pd.DataFrame({"word":chinese_rank.index,"count":chinese_rank.values})
2rhyme = []
3for i in range(len(chinese_word)):
4    word_py = p.get_pinyin(u'{}'.format(chinese_word["word"][i]))
5    lst_words = word_py.split('-')
6    r=[]
7    for j in lst_words:
8        while True:
9            if not j:
10                break
11            token = RhymeDct.get(j, None)
12            if token:
13                r.append(token)
14                break
15            j = j[1:]
16    rhyme.append(r)
17chinese_word["rhyme"] = rhyme
18#print (chinese_word.loc[2])
19#count 2134;word  时间;rhyme  [11, 3]

一个简单的循环,获得相应韵脚,那么我们现在需要的就是分类统计了。


分类统计


我们分词的结果通过过滤,留下来的都是大于两个字的词,考虑到押韵多是两字押韵,将分类结果分为两个TXT文件存储,分别是两个韵脚.txt和三个韵脚及以上.txt。代码如下:

1#押韵组合
2query = []
3for i in chinese_word["rhyme"]:
4    if i not in query:
5        query.append(i)
6
7#分类数据
8def get_words(word):
9    r = []
10    sum=0
11    for i in range(len(chinese_word)):
12        if chinese_word["rhyme"][i] == word:            
13            r.append((chinese_word["word"][i], chinese_word["count"][i]))
14            sum = sum + chinese_word["count"][i]
15    return sorted(r, key=lambda x:x[1], reverse=True),sum            
16
17#存储
18def save_file(r,NUM):
19    if NUM <= 2:
20        with open('两个韵脚''a+')as f:
21            f.write(str(r))
22            f.write('\n')
23    else:
24        with open('三个韵脚及以上''a+')as f:
25            f.write(str(r))
26            f.write('\n')
27
28rdct = dict(RhymeIndex)
29
30for i in query:
31    rh = i
32    res = get_words(rh)   #获得和韵脚匹配的歌词
33    if res:
34        s = []
35        for i in rh:
36            pre = rdct.get(i)
37            s.append(str(pre))
38        NUM = len(rh)
39        s = '-'.join(s)
40        res = '韵脚:' + s '\t' '出现次数:' + str(res[1]) + '\t' + '词汇:' + str(res[0])
41        save_file(res,NUM)
42#个人觉得这部分代码写的很啰嗦,不够简洁,重复太多,计算复杂度过高

得到如下数据集:


可视化


读取存储的数据,进行了简单地统计分析,看看常用的押韵是哪些吧?

两个字最常用的韵脚是['i']-['an', 'ian', 'uan'],比如说'时间', '喜欢', '习惯'等。

三个字及以上的韵脚最常用得是['an', 'ian', 'uan']-['u']-['an', 'ian', 'uan'],比如说‘看不见’,‘敢不敢’等词。


freestyle


为了方便freestyle,可以简单地搜索,所以我们通过键盘输入想要押韵的词,来给出相应的可用的词。比如输入“世界”,输出相应的押韵词汇:

如果你觉得这种上述的方式很难看,你可以学习一下django,搭建一个小网站,将结果输出更加美观。


结语


这一部分就结束了,三篇推文结合起来,你能学习到爬虫,jieba分词,xpinyin库。这次的学习过程也让胡萝卜酱认识到自己的代码写的不够精简,因为平时涉及到的数据量较小,所以没有考虑时间复杂度,计算复杂度的问题,大家有什么建议,可以直接在QQ群或者后台联系,相互讨论,共同进步。mua,爱大家


往期精彩回顾:

网易云音乐上万首hiphop歌曲解析rapper们的最爱(爬虫篇)

网易云音乐上万首hiphop歌曲解析rapper们的最爱(可视化篇)


更多代码和详解在QQ群:852113213)

此文花费了不少功夫,赞赏、点赞、转发都是对作者的认可和支持。

文章有问题?点此查看未经处理的缓存