程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

大數據時代從繁亂冗雜中精准提取核心文本信息 × Python Tkinter 生成詞雲圖

編輯:Python

背景

人類在數字化浪潮中面臨著怎樣的抉擇?如何把握數字時代的機遇和挑戰?科技日新月異,人類生活日益便捷,你是愕然還是亢奮?機器人越來越人性化,你是恐懼焦慮還是心生歡喜?人類是否可以始終制霸選擇權中的”最後一英裡”?數據可以成為財富嗎?大數據、算法、區塊鏈、人工智能、物聯網……

面對越來越繁雜的日常生活,每天人都要接受大量的文字信息。伴隨著信息流,錯綜復雜,無休無止。如何准確且快速提取出事物的本質、物質的核心,從而領悟最終含義成了一個關鍵和問題。一天我靈機一動,於是運用所學知識編寫了一款 Python 程序以實現了目標。

簡介

這是一款生成詞雲圖的程序。給定一段文章,經過該程序的智能運算,可以自動提取出該文章內的關鍵詞,生成僅僅由文字和顏色組成的圖片。圖片裡文字有大有小,在不同位置表示該詞語出現的頻率不同。**字越大表明出現頻率越高,那麼也就越重要。**下面是使用該程序創建生成的幾張詞雲圖:

特點

  • 界面簡潔
  • 操作簡便
  • 使用 Python Tkinter 原生編譯而成,性能優良
  • 全過程個性化制定操作
  • 圖片豐富多彩,內容充實

使用方法和步驟

輸入背景顏色

從上面的示例圖片可以看出,整個詞雲圖的背景為單一色彩,文字顏色卻豐富多彩。你可以在輸入框內以十六進制的格式寫上你想要的顏色以生成制定顏色背景(詳細信息見下文附錄)。

選擇是否使用遮罩圖片

右側是一個單選選項。遮罩圖片的意思是:詞雲圖將依照遮罩圖片主體圖形的形狀大小和顏色來生成相應的文字。比如遮罩圖片(除了白色背景)是一朵紅色的花:

那麼最終圖片上的文字顏色就是紅色、黃色、綠色的(花瓣、花蕊、葉片上的顏色)。這是使用了《愛蓮說》的賞析評價的文章生成的。

禁用遮罩圖片

這意味著文字將不會按照圖片的形狀來生成,也沒有那上面的顏色,由程序根據背景顏色自動生成。背景黑則文字白,背景白則文字黑。

啟用遮罩圖片

定制性更強。圖片上的主體是什麼,這一串文字就沿著它邊緣填滿(如上圖)。

  • 注意:遮罩圖片背景必須是白色,不能是透明的!

讀取詞雲圖片

將需要處理的文本保存至 .txt 純文本文件裡。 然後點擊按鈕讀取。

讀取遮罩圖片

如果禁用了遮罩圖片,則不需要點擊此按鈕,直接點生成。啟用才要。程序支持兩種圖片格式:.jpg 和 .png。再次重申,.png 圖片不能為透明背景!

生成

直接點擊生成按鈕。處理時間較長,請耐心等待。處理完後,彈窗要求保存。找到目標文件夾後保存即可。

源碼

import numpy
import math
import jieba
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
import webbrowser
from tkinter import *
from tkinter import messagebox, filedialog
from PIL import Image, ImageTk
import tkinter.filedialog
string = ""
img_info = ""
img_color = ""
is_mask_on = False
def open_url_cnblogs(event):
webbrowser.open("https://www.cnblogs.com/DawnNeon")
def open_url_csdn(event):
webbrowser.open("https://blog.csdn.net/Dawn_Neon")
def about():
wd_about = Toplevel()
wd_about.resizable(False, False)
wd_about.title("生成詞雲圖")
wd_about.geometry("450x250")
Label(wd_about, width=100, font=("黑體", 40),
text="生成詞雲圖").pack(pady=10)
Label(wd_about, font=("Times New Roman", 15),
text="Copyright 2020-2022 DawnNeon").pack()
Label(wd_about, font=("Times New Roman", 15),
text="Version Beta 0.1, Aug 2 2022").pack()
Label(wd_about, font=("Times New Roman", 13),
wraplength=450, text="From the bottom of my heart, \
I thank all those who gives me much help like the brightest stars \
even in the darkest time!").pack()
lb_refrences1 = Label(wd_about,
text="幫助 & 支持: https://www.cnblogs.com/DawnNeon",
fg="blue",
cursor="star",
font=("微軟雅黑", 9, "underline"))
lb_refrences2 = Label(wd_about, text="https://blog.csdn.net/Dawn_Neon",
fg="blue",
cursor="star",
font=("微軟雅黑", 9, "underline"))
lb_refrences1.pack()
lb_refrences2.pack()
lb_refrences1.bind("<Button-1>", open_url_cnblogs)
lb_refrences2.bind("<Button-1>", open_url_csdn)
def get_article_content():
try:
global string
file_name = filedialog.askopenfilename(
title="請選擇一個 txt 文本文檔",
filetypes=(("文本文檔", "*.txt"),))
with open(file_name, "r", encoding="utf-8") as f:
content = f.read()
string = " ".join(jieba.lcut(content))
except:
messagebox.showerror("警告", "文件錯誤")
return
def is_mask():
try:
dic = {
0:False, 1:True}
global is_mask_on
is_mask_on = dic.get(var.get())
except:
messagebox.showerror("警告", "操作失敗")
def get_image():
try:
if is_mask_on:
img_name = filedialog.askopenfilename(
title="請選擇一張遮罩圖片",
filetypes=(("PNG圖片,不透明", "*.png"), ("JPG圖片", "*.jpg")))
img = Image.open(img_name)
global img_info, img_color
img_info = numpy.array(img)
img_color = ImageColorGenerator(img_info)
else:
messagebox.showinfo("提示", "無需讀取遮罩圖片!")
return
except:
messagebox.showerror("警告", "讀取遮罩圖片出錯!")
return
def create_pic():
try:
with open("all_stopwords.txt", "r", encoding="utf-8") as f_all_sw:
raw_sw = f_all_sw.readlines()
except:
messagebox.showerror("警告", "讀取停用詞時出錯!")
return
sw = set()
for i in raw_sw:
sw.add(i.strip())
bg_color = en_bg_color.get()
messagebox.showinfo("提示", "圖片生成過程中可能有卡頓或假死,請稍等片刻!\n點擊確定開始生成")
if is_mask_on:
obj_pic = WordCloud(
background_color=bg_color,
repeat=True,
max_words=500,
stopwords=sw,
font_path="msyh.ttc",
color_func=img_color,
mask=img_info)
else:
obj_pic = WordCloud(
background_color=bg_color,
repeat=True,
max_words=500,
stopwords=sw,
font_path="msyh.ttc")
obj_pic.generate(string)
# 選擇詞雲圖保存路徑
try:
result_path = filedialog.asksaveasfilename(
title="請選擇保存路徑",
filetypes=(("PNG圖片", "*.png"),))
result_name = result_path.split("/")
obj_pic.to_file(result_path + ".png")
except:
messagebox.showerror("警告", "保存詞雲圖時出錯!")
return
messagebox.showinfo("提示", "詞雲圖大功告成!")
root = Tk()
root.title("生成詞雲圖")
fm_top = Frame()
fm_middle = Frame()
fm_down = Frame()
fm_top.pack(fill="both", expand=True)
fm_middle.pack(fill="both", expand=True)
fm_down.pack(fill="both", expand=True)
Label(fm_top, text="背景顏色", font=("微軟雅黑", 14)).pack(
fill="both",
expand=True,
side="left",
padx=5,
pady=5)
en_bg_color = Entry(fm_top, font=("微軟雅黑", 14))
en_bg_color.pack(
fill="both",
expand=True,
side="left",
padx=5,
pady=5)
var = IntVar()
Radiobutton(fm_top, text="禁用遮罩圖片", variable=var, value=0, command=is_mask).pack(fill="both",
expand=True,
side="left",
padx=5,
pady=5)
Radiobutton(fm_top, text="啟用遮罩圖片", variable=var, value=1, command=is_mask).pack(fill="both",
expand=True,
side="left",
padx=5,
pady=5)
Button(fm_middle, text="讀取詞雲文章", font=("微軟雅黑", 16), command=get_article_content).pack(
fill="both",
expand=True,
side="left",
padx=5,
pady=5)
Button(fm_middle, text="讀取遮罩圖片", font=("微軟雅黑", 16), command=get_image).pack(
fill="both",
expand=True,
side="left",
padx=5,
pady=5)
Button(fm_down, text="生成", font=("微軟雅黑", 18), command=create_pic).pack(
fill="both",
expand=True,
side="left",
padx=5,
pady=5)
menubar = Menu(root)
menubar.add_command(label="關於", command=about)
root.config(menu=menubar)
root.mainloop()

附錄:十六進制顏色碼對照表

英文代碼顏色描述十六進制LightPink淺粉紅#FFB6C1Pink粉紅#FFC0CBCrimson猩紅#DC143CLavenderBlush臉紅的淡紫色#FFF0F5PaleVioletRed蒼白的紫羅蘭紅色#DB7093HotPink熱情的粉紅#FF69B4DeepPink深粉色#FF1493MediumVioletRed適中的紫羅蘭紅色#C71585Orchid蘭花的紫色#DA70D6Thistle薊#D8BFD8plum李子#DDA0DDViolet紫羅蘭#EE82EEMagenta洋紅#FF00FFFuchsia燈籠海棠(紫紅色)#FF00FFDarkMagenta深洋紅色#8B008BPurple紫色#800080MediumOrchid適中的蘭花紫#BA55D3DarkVoilet深紫羅蘭色#9400D3DarkOrchid深蘭花紫#9932CCIndigo靛青#4B0082BlueViolet深紫羅蘭的藍色#8A2BE2MediumPurple適中的紫色#9370DBMediumSlateBlue適中的板巖暗藍灰色#7B68EESlateBlue板巖暗藍灰色#6A5ACDDarkSlateBlue深巖暗藍灰色#483D8BLavender熏衣草花的淡紫色#E6E6FAGhostWhite幽靈的白色#F8F8FFBlue純藍#0000FFMediumBlue適中的藍色#0000CDMidnightBlue午夜的藍色#191970DarkBlue深藍色#00008BNavy海軍藍#000080RoyalBlue皇家藍#4169E1CornflowerBlue矢車菊的藍色#6495EDLightSteelBlue淡鋼藍#B0C4DELightSlateGray淺石板灰#778899SlateGray石板灰#708090DoderBlue道奇藍#1E90FFAliceBlue愛麗絲藍#F0F8FFSteelBlue鋼藍#4682B4LightSkyBlue淡藍色#87CEFASkyBlue天藍色#87CEEBDeepSkyBlue深天藍#00BFFFLightBLue淡藍#ADD8E6PowDerBlue火藥藍#B0E0E6CadetBlue軍校藍#5F9EA0Azure蔚藍色#F0FFFFLightCyan淡青色#E1FFFFPaleTurquoise蒼白的綠寶石#AFEEEECyan青色#00FFFFAqua水綠色#D4F2E7DarkTurquoise深綠寶石#00CED1DarkSlateGray深石板灰#2F4F4FDarkCyan深青色#008B8BTeal水鴨色#008080MediumTurquoise適中的綠寶石#48D1CCLightSeaGreen淺海洋綠#20B2AATurquoise綠寶石#40E0D0Auqamarin綠玉\碧綠色#7FFFAAMediumAquamarine適中的碧綠色#00FA9AMediumSpringGreen適中的春天的綠色#00FF7FMintCream薄荷奶油#F5FFFASpringGreen春天的綠色#3CB371SeaGreen海洋綠#2E8B57Honeydew蜂蜜#F0FFF0LightGreen淡綠色#90EE90PaleGreen蒼白的綠色#98FB98DarkSeaGreen深海洋綠#8FBC8FLimeGreen酸橙綠#32CD32Lime酸橙色#00FF00ForestGreen森林綠#228B22Green純綠#008000DarkGreen深綠色#006400Chartreuse查特酒綠#7FFF00LawnGreen草坪綠#7CFC00GreenYellow綠黃色#ADFF2FOliveDrab橄榄土褐色#556B2FBeige米色(淺褐色)#F5F5DCLightGoldenrodYellow淺秋麒麟黃#FAFAD2Ivory象牙#FFFFF0LightYellow淺黃色#FFFFE0Yellow純黃#FFFF00Olive橄榄#808000DarkKhaki深卡其布#BDB76BLemonChiffon檸檬薄紗#FFFACDPaleGodenrod灰秋麒麟#EEE8AAKhaki卡其布#F0E68CGold金#FFD700Cornislk玉米色#FFF8DCGoldEnrod秋麒麟#DAA520FloralWhite花的白色#FFFAF0OldLace老飾帶#FDF5E6Wheat小麥色#F5DEB3Moccasin鹿皮鞋#FFE4B5Orange橙色#FFA500PapayaWhip番木瓜#FFEFD5BlanchedAlmond漂白的杏仁#FFEBCDNavajoWhite納瓦霍白#FFDEADAntiqueWhite古代的白色#FAEBD7Tan曬黑#D2B48CBrulyWood結實的樹#DEB887Bisque(濃湯)乳脂,番茄等#FFE4C4DarkOrange深橙色#FF8C00Linen亞麻布#FAF0E6Peru秘魯#CD853FPeachPuff桃色#FFDAB9SandyBrown沙棕色#F4A460Chocolate巧克力#D2691ESaddleBrown馬鞍棕色#8B4513SeaShell海貝殼#FFF5EESienna黃土赭色#A0522DLightSalmon淺鮮肉(鲑魚)色#FFA07ACoral珊瑚#FF7F50OrangeRed橙紅色#FF4500DarkSalmon深鮮肉(鲑魚)色#E9967ATomato番茄#FF6347MistyRose薄霧玫瑰#FFE4E1Salmon鮮肉(鲑魚)色#FA8072Snow雪#FFFAFALightCoral淡珊瑚色#F08080RosyBrown玫瑰棕色#BC8F8FIndianRed印度紅#CD5C5CRed純紅#FF0000Brown棕色#A52A2AFireBrick耐火磚#B22222DarkRed深紅色#8B0000Maroon栗色#800000White純白#FFFFFFWhiteSmoke白煙#F5F5F5Gainsboro亮灰色#DCDCDCLightGrey淺灰色#D3D3D3Silver銀白色#C0C0C0DarkGray深灰色#A9A9A9Gray灰色#808080DimGray暗淡的灰色#696969Black純黑#000000

參考鏈接 & 來源:十六進制顏色碼

寫在最後

作者:DawnNeon
若要轉載請標明出處:https://blog.csdn.net/Dawn_Neon/article/details/126126184


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved