Chạy và chỉnh sửa mã từ hướng dẫn trực tuyến này
Chạy mã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()

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:

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()

Ổ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.

# 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()

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()

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()

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?





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.
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:
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:
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
numpylà 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ệnpandasđể phân tích dữ liệu.Mô-đun
oscủ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,
matplotliblà thư viện cơ bản làm nền cho nhiều thư viện khác nhưseabornhoặcwordcloudmà bạn sẽ dùng trong hướng dẫn này. Thư việnpillowcho 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.wordcloudcó thể hơi khó cài đặt. Nếu bạn chỉ cần vẽ word cloud cơ bản, thìpip install wordcloudhoặcconda install -c conda-forge wordcloudlà đủ. 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: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:
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_csvcủa pandas để nạp dataframe. Lưu ý tham sốindex_col=0nghĩa là chúng ta không đọc tên hàng (chỉ mục) như một cột riêng.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.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.
Đ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:
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.
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:
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õ
?functionvà chạy để xem toàn bộ thông tin.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:
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_wordvàbackground_color.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_fileKhi tải vào, kết quả sẽ trông như sau:
Chắc bạn đã để ý tham số
interpolation="bilinear"trongplt.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.
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: