人類在數字化浪潮中面臨著怎樣的抉擇?如何把握數字時代的機遇和挑戰?科技日新月異,人類生活日益便捷,你是愕然還是亢奮?機器人越來越人性化,你是恐懼焦慮還是心生歡喜?人類是否可以始終制霸選擇權中的”最後一英裡”?數據可以成為財富嗎?大數據、算法、區塊鏈、人工智能、物聯網……
面對越來越繁雜的日常生活,每天人都要接受大量的文字信息。伴隨著信息流,錯綜復雜,無休無止。如何准確且快速提取出事物的本質、物質的核心,從而領悟最終含義成了一個關鍵和問題。一天我靈機一動,於是運用所學知識編寫了一款 Python 程序以實現了目標。
這是一款生成詞雲圖的程序。給定一段文章,經過該程序的智能運算,可以自動提取出該文章內的關鍵詞,生成僅僅由文字和顏色組成的圖片。圖片裡文字有大有小,在不同位置表示該詞語出現的頻率不同。**字越大表明出現頻率越高,那麼也就越重要。**下面是使用該程序創建生成的幾張詞雲圖:
從上面的示例圖片可以看出,整個詞雲圖的背景為單一色彩,文字顏色卻豐富多彩。你可以在輸入框內以十六進制的格式寫上你想要的顏色以生成制定顏色背景(詳細信息見下文附錄)。
右側是一個單選選項。遮罩圖片的意思是:詞雲圖將依照遮罩圖片主體圖形的形狀大小和顏色來生成相應的文字。比如遮罩圖片(除了白色背景)是一朵紅色的花:
那麼最終圖片上的文字顏色就是紅色、黃色、綠色的(花瓣、花蕊、葉片上的顏色)。這是使用了《愛蓮說》的賞析評價的文章生成的。
這意味著文字將不會按照圖片的形狀來生成,也沒有那上面的顏色,由程序根據背景顏色自動生成。背景黑則文字白,背景白則文字黑。
定制性更強。圖片上的主體是什麼,這一串文字就沿著它邊緣填滿(如上圖)。
將需要處理的文本保存至 .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()
參考鏈接 & 來源:十六進制顏色碼
作者:DawnNeon
若要轉載請標明出處:https://blog.csdn.net/Dawn_Neon/article/details/126126184