Chuyển đến nội dung chính

Hướng dẫn tạo WordCloud trong Python

Học cách thực hiện Phân tích Khám phá Dữ liệu cho Xử lý Ngôn ngữ Tự nhiên bằng WordCloud trong Python.
· 11 phút đọc

Khám phá cùng AI

Chạy và chỉnh sửa mã từ hướng dẫn trực tuyến này

Chạy mã

Word Cloud là gì?

Nhiều lần bạn có thể đã thấy một đám mây chứa rất nhiều từ với kích thước khác nhau, biểu thị tần suất hoặc mức độ quan trọng của mỗi từ. Đó gọi là Tag Cloud hay word cloud. Trong hướng dẫn này, bạn sẽ học cách tạo word cloud trong Python và tùy chỉnh theo ý muốn. Công cụ này hữu ích khi khám phá dữ liệu văn bản và giúp báo cáo của bạn sinh động hơn.

Luyện tập tạo WordCloud trong Python với bài tập thực hành này.

Trong hướng dẫn này, chúng ta sẽ dùng bộ dữ liệu đánh giá rượu vang từ trang Wine Enthusiast để học:

  • Cách tạo word cloud cơ bản từ một hoặc nhiều tài liệu văn bản
  • Điều chỉnh màu sắc, kích thước và số lượng văn bản trong word cloud
  • Đổ khuôn word cloud theo bất kỳ hình dạng nào bạn chọn
  • Đổ khuôn word cloud theo bất kỳ mẫu màu nào bạn chọn

Khi nào nên dùng Word Cloud

Cần nhớ rằng dù word cloud hữu ích để trực quan hóa các từ phổ biến trong một văn bản hoặc tập dữ liệu, chúng thường chỉ hữu dụng như cái nhìn tổng quan ở mức cao về các chủ đề. Chúng tương tự biểu đồ cột nhưng thường bắt mắt hơn (dù đôi khi khó diễn giải hơn). Word cloud đặc biệt hữu ích khi bạn muốn:

  • Nhanh chóng nhận diện những chủ đề hoặc đề tài quan trọng nhất trong một lượng văn bản lớn
  • Hiểu cảm xúc chung hoặc giọng điệu của một bài viết
  • Khám phá các mẫu hoặc xu hướng trong dữ liệu chứa thông tin văn bản
  • Truyền đạt ý chính hoặc khái niệm theo cách trực quan, hấp dẫn

Tuy nhiên, hãy lưu ý rằng word cloud không cung cấp ngữ cảnh hay hiểu biết sâu hơn về các từ và cụm từ được dùng. Vì vậy, chúng nên được sử dụng cùng với các phương pháp khác để phân tích và diễn giải dữ liệu văn bản.

Yêu cầu tiên quyết

Để bắt đầu tạo word cloud trong Python, bạn cần cài các gói sau:

Thư viện numpy là một trong những thư viện phổ biến và hữu ích nhất để xử lý mảng và ma trận đa chiều. Nó cũng thường được dùng cùng thư viện pandas để phân tích dữ liệu.

Mô-đun os của Python là thư viện tích hợp sẵn, nên bạn không cần cài đặt. Để đọc thêm về xử lý tệp với mô-đun os, hướng dẫn đọc và ghi tệp trong Python của DataCamp sẽ hữu ích.

Về trực quan hóa, matplotlib là thư viện cơ bản làm nền cho nhiều thư viện khác như seaborn hoặc wordcloud mà bạn sẽ dùng trong hướng dẫn này. Thư viện pillow cho phép đọc ảnh. Pillow là một wrapper cho PIL - Python Imaging Library. Bạn sẽ cần thư viện này để đọc ảnh làm mặt nạ (mask) cho word cloud.

wordcloud có thể hơi khó cài đặt. Nếu bạn chỉ cần vẽ word cloud cơ bản, thì pip install wordcloud hoặc conda install -c conda-forge wordcloud là đủ. Tuy nhiên, phiên bản mới nhất với khả năng đổ khuôn đám mây theo bất kỳ hình dạng nào cần cài đặt theo cách khác như dưới đây:

git clone https://github.com/amueller/word_cloud.git
cd word_cloud
pip install .

Bộ dữ liệu:

Hướng dẫn này sử dụng bộ dữ liệu đánh giá rượu vang từ Kaggle. Tập này rất phù hợp để học vì không có giá trị thiếu (đỡ mất thời gian xử lý) và có nhiều văn bản (đánh giá rượu), dữ liệu phân loại và số.

Tạo Word Cloud trong Python: Chuẩn bị 

Cài đặt các thư viện cần thiết

Trước tiên, bạn nạp tất cả thư viện cần dùng:

# Start with loading all necessary libraries
import numpy as np
import pandas as pd
from os import path
from PIL import Image
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
import matplotlib.pyplot as plt
% matplotlib inline
c:\intelpython3\lib\site-packages\matplotlib\__init__.py:
import warnings
warnings.filterwarnings("ignore")

Nếu bạn có hơn 10 thư viện, hãy tổ chức theo nhóm (như thư viện cơ bản, trực quan hóa, mô hình, v.v.). Viết chú thích trong mã sẽ giúp mã sạch và dễ theo dõi.

Nạp dữ liệu vào dataframe 

Bây giờ, dùng read_csv của pandas để nạp dataframe. Lưu ý tham số index_col=0 nghĩa là chúng ta không đọc tên hàng (chỉ mục) như một cột riêng.

# Load in the dataframe
df = pd.read_csv("data/winemag-data-130k-v2.csv", index_col=0)
# Looking at first 5 rows of the dataset
df.head()


dataset

Bạn có thể in ra một số thông tin cơ bản về bộ dữ liệu bằng cách dùng print() kết hợp với .format() để có bản in gọn gàng.

print("There are {} observations and {} features in this dataset. \n".format(df.shape[0],df.shape[1]))

print("There are {} types of wine in this dataset such as {}... \n".format(len(df.variety.unique()),
                                                                           ", ".join(df.variety.unique()[0:5])))

print("There are {} countries producing wine in this dataset such as {}... \n".format(len(df.country.unique()),
                                                                                      ", ".join(df.country.unique()[0:5])))
There are 129971 observations and 13 features in this dataset.

There are 708 types of wine in this dataset such as White Blend, Portuguese Red, Pinot Gris, Riesling, Pinot Noir...

There are 44 countries producing wine in this dataset such as Italy, Portugal, US, Spain, France...
df[["country", "description","points"]].head()
 countrydescriptionpoints
0ItalyAromas include tropical fruit, broom, brimston...87
1PortugalThis is ripe and fruity, a wine that is smooth...87
2USTart and snappy, the flavors of lime flesh and...87
3USPineapple rind, lemon pith and orange blossom ...87
4USMuch like the regular bottling from 2012, this...87

Tạo nhóm để so sánh thuộc tính

Để so sánh giữa các nhóm của một thuộc tính, bạn có thể dùng groupby() và tính các thống kê tóm tắt.

Với bộ dữ liệu rượu vang, bạn có thể nhóm theo quốc gia và xem thống kê tóm tắt cho điểm số và giá của tất cả quốc gia, hoặc chọn ra những quốc gia phổ biến và đắt đỏ nhất.

# Groupby by country
country = df.groupby("country")

# Summary statistic of all countries
country.describe().head()


dataset

Đoạn này chọn 5 quốc gia có điểm trung bình cao nhất trong tổng số 44 quốc gia:

country.mean().sort_values(by="points",ascending=False).head()
countrypointsprice
England91.58108151.681159
India90.22222213.333333
Austria90.10134530.762772
Germany89.85173242.257547
Canada89.36965035.712598

Vẽ dữ liệu

Bạn có thể vẽ số lượng rượu theo quốc gia bằng phương thức plot của Pandas DataFrame và Matplotlib. Nếu chưa quen với Matplotlib, hãy xem nhanh hướng dẫn Matplotlib của chúng tôi.

plt.figure(figsize=(15,10))
country.size().sort_values(ascending=False).plot.bar()
plt.xticks(rotation=50)
plt.xlabel("Country of Origin")
plt.ylabel("Number of Wines")
plt.show()


graph

Trong số 44 quốc gia sản xuất rượu vang, Mỹ có hơn 50.000 loại trong bộ dữ liệu đánh giá, gấp đôi quốc gia đứng ngay sau là Pháp - đất nước nổi tiếng về rượu. Ý cũng sản xuất nhiều rượu chất lượng, với gần 20.000 loại có đánh giá.

Khám phá dữ liệu

Giờ hãy xem biểu đồ của cả 44 quốc gia theo loại rượu được chấm điểm cao nhất, sử dụng cùng kỹ thuật vẽ như trên:

plt.figure(figsize=(15,10))
country.max().sort_values(by="points",ascending=False)["points"].plot.bar()
plt.xticks(rotation=50)
plt.xlabel("Country of Origin")
plt.ylabel("Highest point of Wines")
plt.show()


graph

Australia, Mỹ, Bồ Đào Nha, Ý và Pháp đều có rượu đạt 100 điểm. Nếu để ý, Bồ Đào Nha xếp thứ 5 và Australia xếp thứ 9 về số lượng rượu trong bộ dữ liệu, và cả hai đều có ít hơn 8000 loại.
Đó là một chút khám phá để làm quen với bộ dữ liệu mà bạn sẽ dùng hôm nay. Giờ chúng ta sẽ đi vào món chính: word cloud.

Thiết lập Word Cloud cơ bản trong Python

Bắt đầu

Word cloud là kỹ thuật cho thấy những từ nào xuất hiện thường xuyên nhất trong văn bản cho trước. Chúng ta có thể dùng một thư viện Python để hỗ trợ. Việc đầu tiên bạn có thể muốn làm trước khi dùng bất kỳ hàm nào là kiểm tra docstring của hàm để xem mọi tham số bắt buộc và tùy chọn. Để làm vậy, gõ ?function và chạy để xem toàn bộ thông tin.

?WordCloud
Init signature: WordCloud(font_path=None, width=400, height=200, margin=2, ranks_only=None, prefer_horizontal=0.9, mask=None, scale=1, color_func=None, max_words=200, min_font_size=4, stopwords=None, random_state=None, background_color='black', max_font_size=None, font_step=1, mode='RGB', relative_scaling=0.5, regexp=None, collocations=True, colormap=None, normalize_plurals=True, contour_width=0, contour_color='black')
Docstring:     
Word cloud object for generating and drawing.

Parameters
----------
font_path : string
    Font path to the font that will be used (OTF or TTF).
    Defaults to DroidSansMono path on a Linux machine. If you are on
    another OS or don't have this font; you need to adjust this path.

width : int (default=400)
    Width of the canvas.

height : int (default=200)
    Height of the canvas.

prefer_horizontal : float (default=0.90)
    The ratio of times to try horizontal fitting as opposed to vertical.
    If prefer_horizontal < 1, the algorithm will try rotating the word
    if it doesn't fit. (There is currently no built-in way to get only
    vertical words.)

mask : nd-array or None (default=None)
    If not None, gives a binary mask on where to draw words. If mask is not
    None, width and height will be ignored, and the shape of mask will be
    used instead. All white (#FF or #FFFFFF) entries will be considered
    "masked out" while other entries will be free to draw on. [This
    changed in the most recent version!]

contour_width: float (default=0)
    If mask is not None and contour_width > 0, draw the mask contour.

contour_color: color value (default="black")
    Mask contour color.

scale : float (default=1)
    Scaling between computation and drawing. For large word-cloud images,
    using scale instead of larger canvas size is significantly faster, but
    might lead to a coarser fit for the words.

min_font_size : int (default=4)
    Smallest font size to use. Will stop when there is no more room in this
    size.

font_step : int (default=1)
    Step size for the font. font_step > 1 might speed up computation but
    give a worse fit.

max_words : number (default=200)
    The maximum number of words.

stopwords : set of strings or None
    The words that will be eliminated. If None, the build-in STOPWORDS
    list will be used.

background_color : color value (default="black")
    Background color for the word cloud image.

max_font_size : int or None (default=None)
    Maximum font size for the largest word. If None, the height of the image is
    used.

mode : string (default="RGB")
    Transparent background will be generated when mode is "RGBA" and
    background_color is None.

relative_scaling : float (default=.5)
    Importance of relative word frequencies for font-size.  With
    relative_scaling=0, only word-ranks are considered.  With
    relative_scaling=1, a word that is twice as frequent will have twice
    the size.  If you want to consider the word frequencies and not only
    their rank, relative_scaling around .5 often looks good.

    .. versionchanged: 2.0
        Default is now 0.5.

color_func : callable, default=None
    Callable with parameters word, font_size, position, orientation,
    font_path, random_state that returns a PIL color for each word.
    Overwrites "colormap".
    See colormap for specifying a matplotlib colormap instead.

regexp : string or None (optional)
    Regular expression to split the input text into tokens in process_text.
    If None is specified, ``r"\w[\w']+"`` is used.

collocations : bool, default=True
    Whether to include collocations (bigrams) of two words.

    .. versionadded: 2.0

colormap : string or matplotlib colormap, default="viridis"
    Matplotlib colormap to randomly draw colors from for each word.
    Ignored if "color_func" is specified.

    .. versionadded: 2.0

normalize_plurals : bool, default=True
    Whether to remove trailing 's' from words. If True and a word
    appears with and without a trailing 's', the one with trailing 's'
    is removed and its counts are added to the version without
    trailing 's' -- unless the word ends with 'ss'.

Attributes
----------
``words_`` : dict of string to float
    Word tokens with associated frequency.

    .. versionchanged: 2.0
        ``words_`` is now a dictionary

``layout_`` : list of tuples (string, int, (int, int), int, color))
    Encodes the fitted word cloud. Encodes for each word the string, font
    size, position, orientation, and color.

Notes
-----
Larger canvases will make the code significantly slower. If you need a
large word cloud, try a lower canvas size, and set the scale parameter.

The algorithm might give more weight to the ranking of the words
then their actual frequencies, depending on the ``max_font_size`` and the
scaling heuristic.
File:           c:\intelpython3\lib\site-packages\wordcloud\wordcloud.py
Type:           type

Bạn có thể thấy tham số bắt buộc duy nhất cho đối tượng WordCloud là text, còn các tham số khác đều là tùy chọn.

Bắt đầu với đầu vào đơn giản

Hãy bắt đầu với ví dụ đơn giản: dùng mô tả của quan sát đầu tiên làm đầu vào cho word cloud. Ba bước gồm:

  • Trích xuất bài đánh giá (tài liệu văn bản)
  • Tạo và sinh ảnh word cloud
  • Hiển thị đám mây bằng matplotlib
# Start with one review:
text = df.description[0]

# Create and generate a word cloud image:
wordcloud = WordCloud().generate(text)

# Display the generated image:
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()

wordcloud

Tuyệt! Bạn có thể thấy bài đánh giá đầu tiên nhắc nhiều đến hương vị sấy khô và hương thơm của rượu.

Thay đổi các tham số tùy chọn của word cloud

Bây giờ, hãy đổi một số tham số tùy chọn của word cloud như max_font_size, max_word và background_color.

# lower max_font_size, change the maximum number of word and lighten the background:
wordcloud = WordCloud(max_font_size=50, max_words=100, background_color="white").generate(text)
plt.figure()
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()

wordcloud

Có vẻ dùng max_font_size ở đây không phải ý hay. Nó làm khó nhận ra khác biệt về tần suất từ. Tuy nhiên, làm nền sáng hơn giúp đám mây dễ đọc.

Nếu bạn muốn lưu ảnh, WordCloud cung cấp hàm to_file

# Save the image in the img folder:
wordcloud.to_file("img/first_review.png")
<wordcloud.wordcloud.WordCloud at 0x16f1d704978>

Khi tải vào, kết quả sẽ trông như sau:

wordcloud

Chắc bạn đã để ý tham số interpolation="bilinear" trong plt.imshow(). Điều này giúp ảnh hiển thị mượt hơn. Để biết thêm về lựa chọn này, hướng dẫn các phương pháp nội suy cho imshow là tài nguyên hữu ích.

Kết hợp dữ liệu

Bây giờ bạn sẽ gộp tất cả đánh giá rượu thành một văn bản lớn và tạo một đám mây “đồ sộ” để xem những đặc điểm nào phổ biến nhất.

text = " ".join(review for review in df.description)
print ("There are {} words in the combination of all review.".format(len(text)))
There are 31661073 words in the combination of all review.
# Create stopword list:
stopwords = set(STOPWORDS)
stopwords.update(["drink", "now", "wine", "flavor", "flavors"])

# Generate a word cloud image
wordcloud = WordCloud(stopwords=stopwords, background_color="white").generate(text)

# Display the generated image:
# the matplotlib way:
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()
wordcloud

Có vẻ black cherry và full-bodied là những đặc điểm được nhắc đến nhiều nhất, và Cabernet Sauvignon là giống phổ biến nhất. Điều này phù hợp với thực tế rằng Cabernet Sauvignon “là một trong những giống nho vang đỏ được biết đến rộng rãi nhất thế giới. Nó được trồng ở gần như mọi quốc gia sản xuất rượu vang lớn, trong nhiều kiểu khí hậu khác nhau từ Thung lũng Okanagan của Canada đến Thung lũng Beqaa của Lebanon”.[1]

Trực quan hóa word cloud trong Python

Giờ hãy “rót” những từ này vào một chiếc ly (hoặc thậm chí là một chai) rượu vang!

Để tạo hình dạng cho word cloud, trước hết bạn cần tìm một tệp PNG làm mặt nạ. Dưới đây là một hình đẹp có sẵn trên internet:

mask

Không phải mọi ảnh mặt nạ đều có cùng định dạng nên có thể cho ra kết quả khác nhau, khiến hàm WordCloud hoạt động không đúng. Để đảm bảo mặt nạ của bạn dùng được, hãy xem nó ở dạng mảng numpy:

wine_mask = np.array(Image.open("img/wine_mask.png"))
wine_mask
array([[0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       ...,
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0]], dtype=uint8)

Cách thức của chức năng masking yêu cầu mọi phần màu trắng của mặt nạ phải là 255 chứ không phải 0 (kiểu số nguyên). Giá trị này biểu thị “cường độ” điểm ảnh. 255 là trắng tinh, trong khi 1 là đen. Ở đây, bạn có thể dùng hàm dưới để chuyển đổi mặt nạ nếu mặt nạ của bạn có định dạng như trên. Lưu ý nếu nền mặt nạ của bạn không phải 0 mà là 1 hoặc 2, hãy điều chỉnh hàm cho phù hợp.

Trước tiên, bạn dùng hàm transform_format() để đổi số 0 thành 255.

def transform_format(val):
    if val == 0:
        return 255
    else:
        return val

Sau đó, tạo một mặt nạ mới cùng kích thước với mặt nạ hiện có và áp dụng hàm transform_format() cho từng giá trị ở mỗi hàng của mặt nạ trước.

# Transform your mask into a new one that will work with the function:
transformed_wine_mask = np.ndarray((wine_mask.shape[0],wine_mask.shape[1]), np.int32)

for i in range(len(wine_mask)):
    transformed_wine_mask[i] = list(map(transform_format, wine_mask[i]))

Bây giờ bạn đã có một mặt nạ mới đúng định dạng. In ra mặt nạ đã chuyển đổi là cách tốt nhất để kiểm tra hàm có hoạt động ổn không.

# Check the expected result of your mask
transformed_wine_mask
array([[255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       ...,
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255]])

Với mặt nạ đúng, bạn có thể bắt đầu tạo word cloud theo hình dạng đã chọn. Lưu ý trong hàm WordCloud có tham số mask nhận mặt nạ đã chuyển đổi bạn vừa tạo. contour_width và contour_color đúng như tên gọi, là các tham số chỉnh đường viền của đám mây. Chai rượu của bạn ở đây là rượu vang đỏ, nên “firebrick” có vẻ là lựa chọn hợp lý cho màu viền. Để có thêm lựa chọn màu, bạn có thể xem bảng mã màu này.

# Create a word cloud image
wc = WordCloud(background_color="white", max_words=1000, mask=transformed_wine_mask,
               stopwords=stopwords, contour_width=3, contour_color='firebrick')

# Generate a wordcloud
wc.generate(text)

# store to file
wc.to_file("img/wine.png")

# show
plt.figure(figsize=[20,10])
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()
wordcloud

Voilà! Bạn đã tạo word cloud theo hình một chai rượu! Có vẻ mô tả rượu vang thường nhắc đến black cherry, hương trái cây và đặc tính full-bodied. Giờ hãy xem kỹ hơn các đánh giá theo từng quốc gia và vẽ word cloud theo lá cờ của mỗi nước. Dưới đây là một ví dụ bạn sẽ sớm tạo:

usa flag

Tạo Word Cloud theo mẫu màu

Bạn có thể gộp tất cả đánh giá của năm quốc gia có nhiều rượu nhất. Để tìm các quốc gia đó, bạn có thể xem biểu đồ quốc gia vs số lượng rượu ở trên hoặc dùng nhóm đã tạo để tìm số quan sát của mỗi quốc gia (mỗi nhóm) và sort_values() với ascending=False để sắp xếp giảm dần.

country.size().sort_values(ascending=False).head()
country
US          54504
France      22093
Italy       19540
Spain        6645
Portugal     5691
dtype: int64

Vậy bạn có 5 quốc gia hàng đầu: Mỹ, Pháp, Ý, Tây Ban Nha và Bồ Đào Nha. Bạn có thể đổi số lượng quốc gia bằng cách cho số bạn chọn vào head() như dưới đây

country.size().sort_values(ascending=False).head(10)
country
US           54504
France       22093
Italy        19540
Spain         6645
Portugal      5691
Chile         4472
Argentina     3800
Austria       3345
Australia     2329
Germany       2165
dtype: int64

Tạm thời, năm quốc gia là đủ.

Để lấy tất cả đánh giá của mỗi quốc gia, bạn có thể nối tất cả đánh giá bằng cú pháp " ".join(list), ghép mọi phần tử trong danh sách bằng khoảng trắng.

# Join all reviews of each country:
usa = " ".join(review for review in df[df["country"]=="US"].description)
fra = " ".join(review for review in df[df["country"]=="France"].description)
ita = " ".join(review for review in df[df["country"]=="Italy"].description)
spa = " ".join(review for review in df[df["country"]=="Spain"].description)
por = " ".join(review for review in df[df["country"]=="Portugal"].description)

Sau đó, bạn có thể tạo word cloud như đã nêu ở trên. Bạn có thể gộp hai bước tạo và sinh thành một như dưới đây. Việc ánh xạ màu được thực hiện ngay trước khi vẽ đám mây bằng hàm ImageColorGenerator từ thư viện WordCloud.

# Generate a word cloud image
mask = np.array(Image.open("img/us.png"))
wordcloud_usa = WordCloud(stopwords=stopwords, background_color="white", mode="RGBA", max_words=1000, mask=mask).generate(usa)

# create coloring from image
image_colors = ImageColorGenerator(mask)
plt.figure(figsize=[7,7])
plt.imshow(wordcloud_usa.recolor(color_func=image_colors), interpolation="bilinear")
plt.axis("off")

# store to file
plt.savefig("img/us_wine.png", format="png")

plt.show()
usa flag

Ổn đấy! Giờ lặp lại với đánh giá từ Pháp.

# Generate a word cloud image
mask = np.array(Image.open("img/france.png"))
wordcloud_fra = WordCloud(stopwords=stopwords, background_color="white", mode="RGBA", max_words=1000, mask=mask).generate(fra)

# create coloring from image
image_colors = ImageColorGenerator(mask)
plt.figure(figsize=[7,7])
plt.imshow(wordcloud_fra.recolor(color_func=image_colors), interpolation="bilinear")
plt.axis("off")

# store to file
plt.savefig("img/fra_wine.png", format="png")

#plt.show()

Lưu ý bạn nên lưu ảnh sau khi vẽ để có word cloud theo mẫu màu mong muốn.

france flag
# Generate a word cloud image
mask = np.array(Image.open("img/italy.png"))
wordcloud_ita = WordCloud(stopwords=stopwords, background_color="white", max_words=1000, mask=mask).generate(ita)

# create coloring from image
image_colors = ImageColorGenerator(mask)
plt.figure(figsize=[7,7])
plt.imshow(wordcloud_ita.recolor(color_func=image_colors), interpolation="bilinear")
plt.axis("off")

# store to file
plt.savefig("img/ita_wine.png", format="png")

#plt.show()
italy flag

Tiếp theo là Tây Ban Nha:

# Generate a word cloud image
mask = np.array(Image.open("img/spain.png"))
wordcloud_spa = WordCloud(stopwords=stopwords, background_color="white", max_words=1000, mask=mask).generate(spa)

# create coloring from image
image_colors = ImageColorGenerator(mask)
plt.figure(figsize=[7,7])
plt.imshow(wordcloud_spa.recolor(color_func=image_colors), interpolation="bilinear")
plt.axis("off")

# store to file
plt.savefig("img/spa_wine.png", format="png")
#plt.show()
spain flag

Cuối cùng là Bồ Đào Nha:

# Generate a word cloud image
mask = np.array(Image.open("img/portugal.png"))
wordcloud_por = WordCloud(stopwords=stopwords, background_color="white", max_words=1000, mask=mask).generate(por)

# create coloring from image
image_colors = ImageColorGenerator(mask)
plt.figure(figsize=[7,7])
plt.imshow(wordcloud_por.recolor(color_func=image_colors), interpolation="bilinear")
plt.axis("off")

# store to file
plt.savefig("img/por_wine.png", format="png")
#plt.show()
portugal flag

Kết quả cuối cùng nằm trong bảng dưới đây để so sánh mặt nạ và word cloud. Bạn thích cái nào nhất?

usa flag
france flag
italy flag
spain flag
portugal fflag

Cách diễn giải Word Cloud

Vậy là chúng ta đã xem một số ví dụ về word cloud và cách tạo chúng trong Python. Tuy nhiên, cũng đáng để bàn về cách diễn giải dạng trực quan hóa dữ liệu này. Nói chung, kích thước của mỗi từ trong đám mây biểu thị tần suất hoặc mức độ quan trọng của nó trong văn bản. Thông thường, từ xuất hiện càng nhiều thì sẽ càng lớn trong word cloud.

Có vài điều cần lưu ý khi diễn giải word cloud: 

  • Chú ý kích thước từ: Như đã nói, kích thước của mỗi từ tương ứng với tần suất hoặc mức độ quan trọng trong văn bản. Vì vậy, các từ lớn thường có ý nghĩa hơn trong thông điệp tổng thể.
  • Tìm kiếm các mẫu: Có nhóm từ nào thường xuất hiện cùng nhau không? Điều này có thể cho thấy một chủ đề quan trọng trong văn bản.
  • Cân nhắc ngữ cảnh: Hãy nhớ word cloud chỉ biểu diễn các từ xuất hiện trong văn bản và không cung cấp thông tin về ý nghĩa hay cách chúng được dùng. Vì vậy, cần nghĩ đến ngữ cảnh văn bản và ý nghĩa cụ thể của các từ được sử dụng.
  • Cảnh giác với ngoại lệ: Đôi khi, một từ có thể rất lớn trong word cloud chỉ vì nó xuất hiện nhiều, dù không đặc biệt ý nghĩa hoặc liên quan đến thông điệp tổng thể. Hãy để ý các ngoại lệ như vậy và tập trung vào các từ và mẫu quan trọng nhất.

Tổng thể, word cloud là công cụ hữu ích để nhanh chóng trực quan hóa các chủ đề và ý tưởng chính trong văn bản. Tuy nhiên, hãy nhớ đây chỉ là một công cụ trong nhiều công cụ phân tích dữ liệu văn bản, và nên dùng cùng các phương pháp khác để có phân tích và hiểu biết sâu hơn.

Chúc mừng!

Bạn đã hoàn thành! Bạn đã học nhiều cách vẽ word cloud trong Python bằng thư viện WordCloud, hữu ích cho trực quan hóa bất kỳ phân tích văn bản nào. Bạn cũng học cách đổ khuôn đám mây theo bất kỳ hình dạng nào, với bất kỳ màu sắc bạn chọn. Nếu muốn luyện tập kỹ năng, hãy thử dự án của DataCamp: Các chủ đề “nóng” nhất trong Machine Learning

Nếu bạn quan tâm tìm hiểu thêm về Xử lý ngôn ngữ tự nhiên, hãy học lộ trình Natural Language Processing Fundamentals in Python.

Chủ đề

Liên quan