• Python实现海贼王的歌词组成词云图


    Python实现海贼王的歌词组成词云图

     

    前言

    本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

    作者:一粒米饭

    本教程基于Python3,使用Jupyter上进行调试开发。

    涉及的Python基础包括:

    • 变量和函数的定义和使用
    • 列表和字典等数据结构的使用
    • 条件和循环语句,if、for等
    • 模块的导入和使用,import语法

    需要安装以下依赖库:

    • jupyter - 交互式笔记本
    • matplotlib - Python2D绘图库
    • jieba - Python中文分词组件
    • pillow - Python图像处理库
    • wordcloud - Python词云库

    目标

    从海贼王的歌词中提取出关键词,然后生成乔巴形状的云图,最后效果如下:

     

    Python实现海贼王的歌词组成词云图

     

    1.准备数据

    1. 事先我已准备好15首海贼王的歌词文本文件, 放在本地的data目录下。

    ls data  
    BON VOYAGE.txt      free will.txt        向著阳光.txt
    Jungle P.txt        memories.txt         心的地图.txt
    Run!Run!Run!.txt    share the world.txt  未来航海.txt
    Shining Ray.txt     全新世界.txt          永久指针.txt
    believe.txt         冒险世界.txt          疯狂彩虹.txt

    2. 原始数据准备OK后,先实现一个函数循环读取data目录下的所有文件

    import os
    
    def read_content(content_path):
        '''
        读取目录下的所有文件并合并成一个内容块返回
        '''
        
        # 初始化内容为空
        content = ''
        
        # 使用os模块的listdir函数枚举文件夹下所有文件
        for f in os.listdir(content_path):
            
            # 拼接文件完整路径
            file_fullpath = os.path.join(content_path, f)
            
            # 判断是否是文件
            if os.path.isfile(file_fullpath): 
                print('loading {}'.format(file_fullpath))
                # 将文件内容进行拼接
                content += open(file_fullpath, 'r').read()
                # 每首歌词之间用换行符分隔
                content += '
    '
        print('done loading')
        return content
    # 读取文件夹内容
    content = read_content('./data')
    print('
    显示内容的前面部分...
    ')
    print(content[:99])
    loading ./data/believe.txt
    loading ./data/BON VOYAGE.txt
    loading ./data/free will.txt
    loading ./data/Jungle P.txt
    loading ./data/memories.txt
    loading ./data/Run!Run!Run!.txt
    loading ./data/share the world.txt
    loading ./data/Shining Ray.txt
    loading ./data/全新世界.txt
    loading ./data/冒险世界.txt
    loading ./data/向著阳光.txt
    loading ./data/心的地图.txt
    loading ./data/未来航海.txt
    loading ./data/永久指针.txt
    loading ./data/疯狂彩虹.txt
    done loading
    
    显示内容的前面部分...
    
    世代传承的意志 时代的浪潮 人的梦想
    这些都是无法阻挡的
    只要人们继续追求自由的解答
    这一切都将永不停止
    
    我只相信着未来 就算有人笑我也无所谓
    奔驰的热情让你更耀眼
    虽然好刺眼 但我仍要继续凝视

    3. 使用jieba提取出关键词

    import jieba.analyse
    
    # 这里使用jieba的textrank提取出1000个关键词及其比重
    result = jieba.analyse.textrank(content, topK=1000, withWeight=True)
    
    # 生成关键词比重字典
    keywords = dict()
    for i in result:
        keywords[i[0]] = i[1]
    print(keywords)
    Building prefix dict from the default dictionary ...
    Loading model from cache /var/folders/5d/mjgsmy7n6vlfrk42v1_jtc7c0000gn/T/jieba.cache
    Loading model cost 1.042 seconds.
    Prefix dict has been built succesfully.
    {'扬起': 0.15365137065823337, '开始': 0.33887155728627016, '解答': 0.0790997113814255, '奇迹': 0.2019238936444467, '留下': 0.15805775202925612, '想像': 0.08987560148767863, '感觉': 0.058819354518174556, '时间': 0.07551208515941268, '天堂': 0.08441183647061005, '无法': 0.287129785071775, '伸出': 0.09256367548351727, '回到': 0.08349124701438736, '背负': 0.14437968256383968, '前路': 0.05312061493282433, '屏息': 0.1531365836936351, '秘密': 0.09965773105020974, '七色': 0.08878413441578677, '朋友': 0.1397662417669881, '初识': 0.0830682006897093, '光芒': 0.13352559090174942, '指示': 0.06934108111132412, '拥有': 0.11544194392460741, '色彩': 0.12409038761092896, '世间': 0.18888249529919593, '欢笑': 0.050377170853215976, '选择': 0.06444326221759296, '沾湿': 0.13352559090174942, '起来': 0.0845180267560427, '经历': 0.12616245714507396, '小时候': 0.044857635061158724, '失去': 0.05236725016973628, '歌唱': 0.09501118261648268, '分享': 0.05812477489419511, '收起': 0.0915149943221848, '誓言': 0.05988821730341018, '我会': 0.057893640349250965, '不变': 0.12622369920668572, '熄灭': 0.0791613178160737, '呐喊': 0.13320154266821363, '看见': 0.0854926451902643, '坚持': 0.08213062695901673, '意志': 0.1188937276195136, '美学': 0.1435834973386806, '浮动': 0.13450943469637847, '填满': 0.06039295853670237, '天使': 0.16317731845659758, '找到': 0.05533519004787966, '微笑': 0.0799090440777227, '怀着': 0.4817498228002652, '丢弃': 0.13322161964784338, '跟随': 0.09197164245106097, '地图': 0.07341861667659995, '倒流': 0.07515309019779545, '心情': 0.40510507626640513, '加速': 0.16020612316413707, '时代': 0.299255975193261, '映出': 0.058190874872291284, '收获': 0.12902702145794429, '飞舞': 0.13454804385716426, '重重障碍': 0.07306626680915267, '脚步': 0.11339400407789377, '相遇': 0.07486958598052014, '延伸': 0.11401423021177887, '就算': 0.23310398624372167, '旋律': 0.19062549166169998, '梦想': 1.0, '拥抱': 0.20056370347498786, '释放': 0.08048707411918865, '分界点': 0.11445040093643048, '超越': 0.08754528438684966, '水平线': 0.12663559447803469, '地平线': 0.1021244005469806, '忘却': 0.13322161964784338, '发展': 0.05521593346271129, '思念': 0.1296081980642235, '中将': 0.1730725099154214, '漫历': 0.14999796242367477, '照耀': 0.13450943469637847, '抓住': 0.1081902273317158, '大海': 0.2191369911522112, '梦幻': 0.08878413441578677, '没错': 0.06908130733179857, '变迁': 0.08388306680969282, '绽开': 0.0970297226758736, '背影': 0.04489925975654794, '响起': 0.09348462612242271, '传承': 0.08343950722719029, '泪水': 0.2043342791423508, '寄托': 0.15140800018240286, '出发': 0.1376622319882071, '安排': 0.09570513284670208, '凝视': 0.09058874193734022, '目标': 0.20253971299175438, '想法': 0.13322161964784338, '盘旋': 0.04653128171301495, '浪花': 0.14292308695167863, '赢得': 0.13454804385716426, '摸索': 0.13352559090174942, '命运': 0.17767531296473504, '要紧': 0.07100381557014668, '同伴': 0.13322161964784338, '相信': 0.06780937693484108, '到达': 0.11990597718546447, '起航': 0.17121317788528045, '伙伴': 0.1021244005469806, '鼓起': 0.08326947015393454, '角逐': 0.13450943469637847, '得到': 0.139130325974439, '热情': 0.16974545588616355, '咒文': 0.0755227913516226, '追逐': 0.12956507425075023, '吝惜': 0.044375524671743924, '旗帜': 0.22318864743628655, '不会': 0.136742080156981, '紧握着': 0.07074596658159177, '传递': 0.08318907791061766, '知道': 0.049014975541075576, '避开': 0.11925067678883694, '失败': 0.19864619215021206, '直到': 0.16170953592115245, '开辟': 0.11502344884527459, '驶向': 0.08949640367673918, '超乎': 0.17571155584916723, '航海图': 0.17530963330220897, '星空': 0.07085050507113418, '足迹': 0.11380925226394865, '憧憬': 0.13136516727228634, '信号': 0.1345775449622126, '停息': 0.14813550567788228, '抑制': 0.0823736383036949, '力争上游': 0.15985443423198126, '希望': 0.3064348996750364, '探求': 0.10037115703978353, '浪潮': 0.11205492596248597, '奔驰': 0.04647451827818632, '迷惑': 0.10853833347078598, '疾速': 0.09289401344883545, '重拾': 0.13450943469637847, '双手': 0.11833008801272633, '继续': 0.26128426151029494, '前进': 0.38049616332706393, '海洋': 0.07764780435427948, '力量': 0.22448970728817977, '迈进': 0.07788425716172835, '海贼王': 0.05988821730341018, '奔向': 0.1050116694918882, '仰望': 0.11375613415335455, '开创': 0.04909483864698758, '忘怀': 0.1178931622715251, '伴随': 0.1881308832052442, '直率': 0.0819811725519203, '迈向': 0.09805414857074332, '等待': 0.05312061493282433, '追赶': 0.23590910145448465, '橙色': 0.19827470012221343, '飞溅': 0.14517190902077373, '填入': 0.10713343097770893, '寻找': 0.341410398721581, '羁绊': 0.13454804385716426, '愿望': 0.11502105997392056, '描绘': 0.04882446831721362, '号角': 0.18892935090190913, '深渊': 0.11341295672924022, '传说': 0.10453681102617361, '胸膛': 0.10826393677032255, '追忆': 0.13454804385716426, '改变': 0.1105923128490412, '起跑': 0.07840202504448608, '成为': 0.2958892859451614, '投入': 0.054739663860643786, '谜题': 0.13450943469637847, '旅途': 0.13166250912547978, '高声': 0.178643850709469, '追求': 0.1715459745440232, '总会': 0.13242770285698083, '遥望': 0.050377170853215976, '畏惧': 0.05048971733869129, '刻下': 0.10563678032609539, '面对': 0.19682389784566295, '流下': 0.10423811536600736, '逃脱': 0.04488557389782134, '奔跑': 0.08204660421218422, '火种': 0.1411150676880229, '冒险': 0.5005306993202343, '世界': 0.5449287709811719, '能够': 0.25882968219047386, '碎片': 0.13709646143068321, '信念': 0.11795116869385924, '未知': 0.08221194482386406, '吹响': 0.1779165442702793, '全部': 0.13392040723985732, '孩子': 0.13811401117842068, '获得': 0.06780937693484108, '预感': 0.16639206740929596, '把握': 0.08675073217837388, '示人': 0.1026344593871126, '听说': 0.05312061493282433, '冲出': 0.13224882644548555, '没有': 0.15159970579125204, '喜宴': 0.17379403916878816, '才能': 0.12972776044573475, '时候': 0.17420500418671414, '人们': 0.10319997520144626, '为止': 0.052150373830141754, '抬头': 0.11467512436536162, '无限': 0.06764346188867, '出航': 0.03865274219069975, '故事': 0.13392040723985732, '可能': 0.07390594415565045, '引导': 0.16732685717721082, '情绪': 0.12968877267733753, '内心': 0.1475787080533443, '单凭': 0.12542873282600936, '仿效': 0.0918818019595783, '方向': 0.1629842877398635, '想象': 0.09265141828602656, '太阳': 0.20931270320049486, '举起': 0.07341861667659995, '熟悉': 0.12327709678857283, '日子': 0.08479628778416956, '回忆': 0.13352559090174942, '来自': 0.09467283342394821, '片长': 0.07540537390616804, '绝望': 0.09314642277073719, '阻挠': 0.07790059908360082, '追梦': 0.09309586423204035, '鼓励': 0.10880965048592321, '阻挡': 0.17223247845464154, '蔓延': 0.17439976351747224, '征途': 0.15601230856847134, '集起': 0.0904380138460612, '航线': 0.12392209071853239, '终能': 0.13392040723985732, '困扰': 0.12606024257520246, '展开': 0.17772773888330856, '带领': 0.07912571036131048, '不了': 0.16113705986038165, '起始': 0.09330731354358968, '地方': 0.16598627575218824, '踏上': 0.13236658985957564, '描述': 0.07626512494851125, '启程': 0.10245516018260722, '放飞': 0.1598542189807057, '双臂': 0.09340867759406857, '心灵': 0.3305662079948827, '眼神': 0.08399973860720229, '笑颜': 0.13085137132492453, '狂欢': 0.11807469241626582, '铭刻': 0.19068475937471777, '看到': 0.054296059984562176, '大家': 0.18077773704285963, '船舵': 0.10845934179932064, '完成': 0.1227002236449499, '驱使': 0.14999738505133325, '出现': 0.13115377751750223, '跨越': 0.1331441398565992, '高涨': 0.136124054847588, '风帆': 0.11119913692251271, '漂浮': 0.1274242316646285, '起飞': 0.10309000992149217, '相识': 0.13352559090174942, '音符': 0.16639206740929596, '迎风': 0.13392040723985732, '勇气': 0.1507813084829896, '空荡': 0.10791710727689573, '跃动': 0.0829313414107292, '天空': 0.5285292408817545}

    2.使用wordcloud生成云图

    这里还需要一张底图用于生成云图,这里使用海贼王中乔巴的图片

    Python实现海贼王的歌词组成词云图

     

    from PIL import Image, ImageSequence
    import numpy as np
    import matplotlib.pyplot as plt
    from wordcloud import WordCloud, ImageColorGenerator
    
    # 初始化图片
    image = Image.open('./images/tony_src.png')
    graph = np.array(image)
    
    # 生成云图,这里需要注意的是WordCloud默认不支持中文,所以这里需要加载中文黑体字库
    wc = WordCloud(font_path='./fonts/simhei.ttf',
        background_color='white', max_words=1000, mask=graph)
    wc.generate_from_frequencies(keywords)
    image_color = ImageColorGenerator(graph)
    # 显示图片
    plt.imshow(wc)
    plt.imshow(wc.recolor(color_func=image_color))
    plt.axis("off") # 关闭图像坐标系
    plt.show()
  • 相关阅读:
    Java下的tinylog日志打印
    rmi的调用
    linux下hex转ascii
    CSP攻略
    ThinkPHP5代码执行的简单分析
    MySQL UDF(User Defined Function)提权
    与邮件协议相关的端口
    常见哈希算法的密文格式
    ThinkPHP 5.0.x 反序列化漏洞 PoC
    Tomcat AJP协议文件包含漏洞(CVE-2020-1938)
  • 原文地址:https://www.cnblogs.com/hhh188764/p/13055370.html
Copyright © 2020-2023  润新知