本教程基於Python3,使用Jupyter上進行調試開發。
涉及的Python基礎包括:
變量和函數的定義和使用
列表和字典等數據結構的使用
條件和循環語句,if、for等
模塊的導入和使用,import語法
需要安裝以下依賴庫:
jupyter - 交互式筆記本
matplotlib - Python2D繪圖庫
jieba - Python中文分詞組件
pillow - Python圖像處理庫
wordcloud - Python詞雲庫
目標
從海賊王的歌詞中提取出關鍵詞,然後生成喬巴形狀的雲圖,最後效果如下:
1. 事先我已準備好15首海賊王的歌詞文本文件, 放在本地的data目錄下。
ls data
BON VOYAGE.txt free will.txt 向著陽光.txtJungle P.txt memories.txt 心的地圖.txtRun!Run!Run!.txt share the world.txt 未來航海.txtShining Ray.txt 全新世界.txt 永久指針.txtbelieve.txt 冒險世界.txt 瘋狂彩虹.txt
2. 原始數據準備OK後,先實現一個函數循環讀取data目錄下的所有文件
import osdef 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.txtloading ./data/BON VOYAGE.txtloading ./data/free will.txtloading ./data/Jungle P.txtloading ./data/memories.txtloading ./data/Run!Run!Run!.txtloading ./data/share the world.txtloading ./data/Shining Ray.txtloading ./data/全新世界.txtloading ./data/冒險世界.txtloading ./data/向著陽光.txtloading ./data/心的地圖.txtloading ./data/未來航海.txtloading ./data/永久指針.txtloading ./data/瘋狂彩虹.txtdone 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.cacheLoading 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, ImageSequenceimport numpy as npimport matplotlib.pyplot as pltfrom 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()