前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 作者:一粒米飯 喜歡的朋友歡迎關註小編,除了分享技術文章之外還有很多福利,私信“學習資料”可以領取包括不限於Python實戰演練、PDF電子文檔、面試集錦、學習資料等。 本教 ...
前言
本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。
作者:一粒米飯
喜歡的朋友歡迎關註小編,除了分享技術文章之外還有很多福利,私信“學習資料”可以領取包括不限於Python實戰演練、PDF電子文檔、面試集錦、學習資料等。
本教程基於Python3,使用Jupyter上進行調試開發。
涉及的Python基礎包括:
- 變數和函數的定義和使用
- 列表和字典等數據結構的使用
- 條件和迴圈語句,if、for等
- 模塊的導入和使用,import語法
需要安裝以下依賴庫:
- jupyter - 互動式筆記本
- matplotlib - Python2D繪圖庫
- jieba - Python中文分片語件
- pillow - Python圖像處理庫
- wordcloud - 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 += '\n' print('done loading') return content # 讀取文件夾內容 content = read_content('./data') print('\n顯示內容的前面部分...\n') 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生成雲圖
這裡還需要一張底圖用於生成雲圖,這裡使用海賊王中喬巴的圖片
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()