神马三押四押 给你来上一打
大家七夕过的愉快吗?胡萝卜酱来更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)
此文花费了不少功夫,赞赏、点赞、转发都是对作者的认可和支持。