如何使用Python制作詞云?wordcloud庫參數(shù)詳解

python制作詞云的核心在于wordcloud庫,其關(guān)鍵參數(shù)包括font_path、background_color、width、height、max_words、stopwords、mask等。要生成詞云,首先需安裝wordcloud、matplotlib和jieba庫;其次對(duì)中文文本進(jìn)行分詞處理;接著創(chuàng)建wordcloud對(duì)象并設(shè)置相關(guān)參數(shù);最后使用matplotlib顯示結(jié)果。自定義字體通過font_path參數(shù)實(shí)現(xiàn),確保中文字體正常顯示;背景圖片則通過mask參數(shù)加載圖片數(shù)組實(shí)現(xiàn)形狀控制。常見挑戰(zhàn)如中文亂碼可通過正確配置字體解決,停用詞問題可通過自定義stopwords集合過濾無關(guān)詞匯,從而提升詞云的聚焦性和美觀性。

如何使用Python制作詞云?wordcloud庫參數(shù)詳解

python制作詞云,核心在于wordcloud庫。它能將文本數(shù)據(jù)轉(zhuǎn)化為視覺上引人注目的圖像,直觀展示詞頻,讓你一眼就能抓住文本的重點(diǎn)。這東西用起來比想象中要簡單,但要做出彩,還是得花點(diǎn)心思。

如何使用Python制作詞云?wordcloud庫參數(shù)詳解

解決方案

要制作詞云,你需要先安裝必要的庫:wordcloud、matplotlib(用于顯示圖片)以及jieba(處理中文文本,因?yàn)樗J(rèn)不分詞)。

如何使用Python制作詞云?wordcloud庫參數(shù)詳解

# 如果你還沒安裝,先運(yùn)行這行 # pip install wordcloud matplotlib jieba  from wordcloud import WordCloud import matplotlib.pyplot as plt import jieba # 用于中文分詞  # 1. 準(zhǔn)備文本數(shù)據(jù) text = """ 詞云是一種非常酷的數(shù)據(jù)可視化方式,它能把大量文本數(shù)據(jù)中的高頻詞匯以大小不同的字體展現(xiàn)出來, 詞頻越高,字體越大。我個(gè)人覺得,這不僅僅是技術(shù),更是一種藝術(shù)。 比如,你分析用戶評(píng)論,或者讀一份冗長的報(bào)告, 詞云能幫你快速抓住核心關(guān)鍵詞,省去了逐字逐句閱讀的麻煩。 當(dāng)然,要做好一個(gè)詞云,選詞、去停用詞、字體選擇,甚至背景圖,都挺有講究的。 有時(shí)候,一個(gè)好的詞云設(shè)計(jì),比純粹的數(shù)據(jù)表格更能打動(dòng)人。 它不僅僅是展示數(shù)據(jù),更是在講述一個(gè)故事。 """  # 2. (可選)中文文本分詞 # 如果是英文,這一步可以跳過。中文必須分詞,否則詞云會(huì)把每個(gè)漢字當(dāng)成一個(gè)詞。 seg_list = jieba.cut(text, cut_all=False) # 精確模式分詞 text_after_segmentation = " ".join(seg_list)  # 3. 創(chuàng)建WordCloud對(duì)象并生成詞云 # 這里可以設(shè)置一些基本參數(shù),后面會(huì)詳細(xì)講。 wordcloud = WordCloud(     font_path='SimHei.ttf', # 確保你有這個(gè)字體文件,或指定你系統(tǒng)里的其他中文字體     background_color="white", # 背景顏色     width=800, # 圖片寬度     height=600, # 圖片高度     max_words=200, # 最多顯示的詞數(shù)     margin=2, # 詞語之間的距離     random_state=42 # 隨機(jī)狀態(tài),保證每次生成的詞云形狀一致 )  wordcloud.generate(text_after_segmentation) # 生成詞云  # 4. 顯示詞云圖片 plt.figure(figsize=(10, 8)) # 設(shè)置圖片大小 plt.imshow(wordcloud, interpolation='bilinear') # 顯示圖片 plt.axis("off") # 不顯示坐標(biāo)軸 plt.show()

詞云制作:Python wordcloud庫的核心參數(shù)有哪些?

wordcloud庫的強(qiáng)大之處,很大程度上就體現(xiàn)在它那一大可調(diào)節(jié)的參數(shù)上。這些參數(shù)就像是畫家的調(diào)色板,能讓你把控最終詞云的方方面面。我個(gè)人覺得,理解并靈活運(yùn)用這些參數(shù),是把詞云從“能用”變成“好用”的關(guān)鍵。

立即學(xué)習(xí)Python免費(fèi)學(xué)習(xí)筆記(深入)”;

  • width 和 height: 這倆參數(shù)決定了你詞云圖片的尺寸。默認(rèn)是400×200。調(diào)大一點(diǎn),比如800×600甚至更高,詞語排布會(huì)更疏朗,細(xì)節(jié)也能看得更清楚。我通常會(huì)根據(jù)最終用途來定,比如要打印出來,肯定得大點(diǎn)。
  • background_color: 顧名思義,背景顏色。可以是顏色名(如”white”, “black”),也可以是十六進(jìn)制顏色碼。個(gè)人偏好白色或淺灰色,這樣詞語的對(duì)比度高,看著舒服。當(dāng)然,如果你想玩點(diǎn)花樣,深色背景配亮色字體也挺酷。
  • max_words: 詞云里最多顯示多少個(gè)詞?這個(gè)參數(shù)控制了詞云的“密度”。詞越多,詞云可能就越擁擠。我覺得200-500個(gè)詞比較合適,太多了反而容易讓人眼花繚亂。
  • stopwords: 停用詞表。這是個(gè)非常重要的參數(shù)!它接受一個(gè)集合(set)類型的數(shù)據(jù),里面是你不想在詞云中出現(xiàn)的詞,比如中文的“的”、“是”、“了”,英文的“a”、“the”、“is”等等。我發(fā)現(xiàn)很多時(shí)候,默認(rèn)的停用詞表根本不夠用,總有些你不想看到的詞混在里面,手動(dòng)添加進(jìn)去就清爽多了。你可以自己定義一個(gè)set,比如my_stopwords = {“的”, “是”, “了”, “我”},然后傳給它。
  • font_path: 字體路徑。這個(gè)對(duì)中文詞云來說簡直是生命線! 如果不指定一個(gè)包含中文字符的字體,你的詞云里就全是小方塊。你需要提供一個(gè)TTF字體文件的路徑,比如windows系統(tǒng)下的SimHei.ttf(黑體)或者msyh.ttc(微軟雅黑)。linux或macos用戶也需要找到對(duì)應(yīng)的中文字體文件。
  • mask: 遮罩圖片。這是個(gè)高級(jí)玩法,能讓你的詞云呈現(xiàn)出特定形狀。你需要提供一個(gè)灰度圖或帶透明通道的圖片(比如PNG),詞云會(huì)根據(jù)圖片的非透明部分來填充詞語。這個(gè)我后面會(huì)專門講,因?yàn)橛闷饋碛悬c(diǎn)小技巧。
  • colormap: 顏色映射。它決定了詞云中詞語的顏色方案。matplotlib提供了很多內(nèi)置的colormap,比如’viridis’, ‘plasma’, ‘inferno’等等。如果你不指定,它會(huì)隨機(jī)生成顏色。我喜歡嘗試不同的colormap,看看哪種最能突出主題或者最符合我的審美。
  • max_font_size 和 min_font_size: 控制詞語字體大小的上下限。如果你覺得有些詞太小看不清,或者最大的詞占了太多空間,可以調(diào)整這兩個(gè)參數(shù)。
  • random_state: 隨機(jī)種子。如果你希望每次運(yùn)行代碼生成的詞云形狀和排布都一模一樣,就設(shè)置一個(gè)整數(shù)值。這在調(diào)試和復(fù)現(xiàn)結(jié)果時(shí)特別有用。

如何為Python詞云添加自定義字體和背景圖片?

讓詞云從“標(biāo)準(zhǔn)版”升級(jí)到“定制版”,字體和背景圖片是兩個(gè)非常有效的途徑。特別是對(duì)中文詞云而言,字體選擇的重要性不亞于文本內(nèi)容本身。

如何使用Python制作詞云?wordcloud庫參數(shù)詳解

1. 自定義字體:告別方塊字

前面提到了font_path的重要性。沒有合適的字體,中文詞云就是一堆方塊,那感覺真是…一言難盡。所以,你需要確保你的系統(tǒng)里有可用的中文字體文件(.ttf或.ttc格式),然后把它的絕對(duì)路徑或者相對(duì)路徑傳給font_path參數(shù)。

Windows用戶通常可以在C:WindowsFonts目錄下找到字體文件,比如simhei.ttf(黑體)、msyh.ttc(微軟雅黑)。 macos用戶可以在~/Library/Fonts或/Library/Fonts找到。 Linux用戶則可能在/usr/share/fonts下。

# 假設(shè)你的中文字體文件在當(dāng)前目錄下,或者你提供了完整的路徑 font_path = 'SimHei.ttf' # 替換成你實(shí)際的字體文件路徑 # 或者 # font_path = 'C:/Windows/Fonts/simhei.ttf' # Windows示例 # font_path = '/System/Library/Fonts/STHeiti Light.ttc' # macOS示例  wordcloud = WordCloud(     font_path=font_path,     background_color="white",     width=800,     height=600     # ... 其他參數(shù) ).generate(text_after_segmentation)

2. 自定義背景圖片:塑造詞云的形狀

mask參數(shù)允許你用一張圖片來定義詞云的形狀。它會(huì)把詞語填充到圖片中非透明(或非白色)的區(qū)域。這功能簡直是創(chuàng)意無限的源泉!

你需要先用imageio或PIL(pillow)庫加載圖片,然后將其轉(zhuǎn)換為numpy數(shù)組。注意:圖片最好是黑白分明的,或者有透明背景的PNG圖。 詞云會(huì)根據(jù)圖片的亮度來決定詞語的填充區(qū)域,通常是白色區(qū)域不填充,非白色區(qū)域填充。如果你的圖片是彩色的,wordcloud會(huì)將其轉(zhuǎn)換為灰度圖處理。

from wordcloud import WordCloud, ImageColorGenerator import matplotlib.pyplot as plt import numpy as np from PIL import Image # 需要安裝 Pillow: pip install Pillow  # 假設(shè)你有一張名為 'heart.png' 的圖片作為遮罩 # 這張圖片最好是白色背景,黑色或彩色形狀的圖片,或者帶透明度的PNG mask_image_path = 'heart.png' # 替換成你的圖片路徑  # 加載圖片并轉(zhuǎn)換為NumPy數(shù)組 # Image.open().convert("RGBA") 可以確保圖片有透明通道,如果原始圖片沒有,它會(huì)添加一個(gè)。 # np.array() 將PIL圖片對(duì)象轉(zhuǎn)換為NumPy數(shù)組 mask = np.array(Image.open(mask_image_path))  # 準(zhǔn)備文本數(shù)據(jù)(同上) text = "..." # 你的文本數(shù)據(jù) seg_list = jieba.cut(text, cut_all=False) text_after_segmentation = " ".join(seg_list)  wordcloud_masked = WordCloud(     font_path='SimHei.ttf',     background_color="white",     mask=mask, # 將加載的圖片數(shù)組作為mask     max_words=500,     stopwords={"的", "是", "了", "我", "你", "我們", "他們"}, # 自定義停用詞     contour_width=3, # 詞云輪廓線寬度     contour_color='steelblue' # 詞云輪廓線顏色 )  wordcloud_masked.generate(text_after_segmentation)  # 如果你的遮罩圖片本身有顏色,并且你想讓詞云的顏色也從圖片中提取,可以使用 ImageColorGenerator # image_colors = ImageColorGenerator(mask) # plt.imshow(wordcloud_masked.recolor(color_func=image_colors), interpolation="bilinear")  plt.figure(figsize=(10, 8)) plt.imshow(wordcloud_masked, interpolation='bilinear') plt.axis("off") plt.show()

我用contour_width和contour_color給遮罩加了個(gè)邊框,有時(shí)候這樣能讓形狀更突出,效果也挺不錯(cuò)的。

Python詞云生成中常見的挑戰(zhàn)與優(yōu)化技巧?

在實(shí)際操作中,你可能會(huì)遇到一些讓人撓頭的問題,比如中文亂碼、不想要的詞出現(xiàn),或者詞云形狀不盡如人意。這些都是很常見的挑戰(zhàn),但都有對(duì)應(yīng)的優(yōu)化技巧。

1. 中文亂碼問題:字體是根本

這是最常見也最讓人頭疼的問題。如果你在詞云中看到一堆小方塊而不是漢字,那基本可以確定是font_path沒設(shè)置對(duì),或者你指定的字體文件不包含中文字符集。

  • 解決方案: 確保你提供的font_path指向一個(gè)真實(shí)存在且支持中文的TTF或TTC字體文件。在Windows上,SimHei.ttf(黑體)是個(gè)不錯(cuò)的選擇;macOS用戶可能需要查找系統(tǒng)自帶的思源黑體或華文黑體。如果你不確定,可以去網(wǎng)上下載一個(gè)免費(fèi)的開源中文字體,比如“霞鶩文楷”或“得意黑”,然后指定其路徑。

2. 停用詞處理:讓詞云更聚焦

默認(rèn)的wordcloud庫自帶一些英文停用詞,但對(duì)于中文文本,或者某些特定領(lǐng)域的分析,你往往需要更定制化的停用詞表。那些高頻但無意義的詞,比如“的”、“是”、“了”、“一個(gè)”等等,如果不去掉,它們會(huì)占據(jù)詞云的大部分空間,掩蓋了真正有價(jià)值的信息。

  • 解決方案:
    • 自定義停用詞列表: 創(chuàng)建一個(gè)Python的set,把所有你想過濾掉的詞放進(jìn)去。
       my_stopwords = {"的", "是", "了", "我", "你", "他", "她", "它", "我們", "你們", "他們", "和", "或", "一個(gè)", "這種", "那種", "什么", "怎么", "如何", "這樣", "那樣", "可以", "會(huì)", "就是", "所以", "但是", "而且", "然而", "因?yàn)?quot;, "所以", "如果", "那么", "雖然", "但是", "并且", "或者", "除了", "為了", "關(guān)于", "對(duì)于", "已經(jīng)", "正在", "將會(huì)", "非常", "特別", "很", "比較", "更", "最", "都", "也", "還", "再", "又", "就", "才", "只", "總是", "常常", "往往", "總是", "有時(shí)候", "從來", "從不", "一定", "肯定", "大概", "可能", "也許", "當(dāng)然", "確實(shí)", "真的", "簡直", "根本", "一點(diǎn)", "一些", "很多", "許多", "很少", "很少", "多少", "每個(gè)", "所有", "各種", "一切", "任何", "任何", "自己", "別人", "大家", "各位", "先生", "女士", "小姐", "同志", "朋友", "老師", "學(xué)生", "醫(yī)生", "工人", "農(nóng)民", "解放軍", "警察", "記者", "律師", "工程師", "科學(xué)家", "藝術(shù)家", "運(yùn)動(dòng)員", "總統(tǒng)", "總理", "部長", "主席", "委員", "代表", "領(lǐng)導(dǎo)", "成員", "單位", "部門", "公司", "企業(yè)", "學(xué)校", "醫(yī)院", "銀行", "商店", "飯店", "賓館", "旅館", "酒店", "公寓", "住宅", "別墅", "農(nóng)村", "城市", "國家", "地區(qū)", "世界", "全國", "各地", "地方", "方面", "部分", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面", "方面

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊9 分享