WordCloudで日本語を文字化けせずに表示する方法
記事概要
以下に該当する方に有用な記事になっております
- WordCloud を Streamlit in Snowflake で使いたい!
- 日本語を表示する場合, フォントファイルを指定しないと文字化けしてしまう...🥺
- Streamlit in Snowflakeでは, どのようにフォントファイル指定するのか知りたい!
動画でサクッと把握したい方は, こちらの [YouTube動画(2min)] をご覧ください
※ 以下, Streamlit in SnowflakeをSiSと表現します
WordCloudとは...
文章やテキストから単語の出現頻度にあわせて文字の大きさを変えて視覚化したグラフのことです
出典: 【テキストマイニング】WordCloud(ワードクラウド)とは
SiSでのWordCloudの基本構成
wordcloud_sample1.py
に記載されているコードが基本の構成になっています
fit_wordsの引数に, 文字列と数値がペアを渡してあげることで,
WordCloudの画像内で, 文字列が数値の値に応じた大きさで表現されます
import streamlit as st
from wordcloud import WordCloud
# WordCloudの設定
wc = WordCloud().fit_words({"A": 100, "B": 10, "C": 1})
# 画像データの生成
st.image(wc.to_array())
※ パッケージに「wordcloud」の追加が必要です
WordCloudの障壁
以下の wordcloud_sample2.py
のように, フォントを指定せずに
fit_wordsの引数に 日本語 の文字列を渡してしまうと,
結果の画像にあるように文字化けしてしまいます...
import streamlit as st
from wordcloud import WordCloud
# WordCloudの設定
wc = WordCloud().fit_words({"綾野": 100, "櫻木": 30, "影田": 40, "坂本": 1, "庄司": 50, "菊池": 20, "越川": 20, "白畑": 20)
# 画像データの生成
st.image(wc.to_array())
WordCloudでのフォント指定
以下の wordcloud_sample3.py
のように,
WordCloudの引数 font_path に フォントファイルの置き場所(パス)を渡すことで,
該当のフォントを使用して画像を生成することができるようになります
import streamlit as st
from wordcloud import WordCloud
# WordCloudの設定
wc = WordCloud(font_path = フォントファイルのパスを記載).fit_words({"綾野": 100, "櫻木": 30, "影田": 40, "坂本": 1, "庄司": 50, "菊池": 20, "越川": 20, "白畑": 20)
# 画像データの生成
st.image(wc.to_array())
Streamlit in Snowflakeの障壁
Snowflakeの場合, ファイルの置き場所としてはステージがあります。
しかし, 現状 font_pathの値として
ステージにアップロードしたフォントファイルのパスを指定しても
該当のフォントファイルを開くことができません...
(2023年12月20日時点)
import streamlit as st
from wordcloud import WordCloud
# WordCloudの設定
wc = WordCloud(font_path = f"@CITIBIKE.PUBLIC.FONTS/gomarice_mukasi_mukasi.ttf").fit_words({"綾野": 100, "櫻木": 30, "影田": 40, "坂本": 1, "庄司": 50, "菊池": 20, "越川": 20, "白畑": 20)
# 画像データの生成
st.image(wc.to_array())
WordCloudから呼び出すファイルはローカルに置いておく必要があります
解決策
内部ステージにアップロードしたフォントファイルを
Streamlit in Snowflakeの /tmp/フォルダ配下にコピー し,
そのファイルを引数とすることで日本語をキレイに実現できます
import io
from io import BytesIO
import streamlit as st
from wordcloud import WordCloud
# フォントファイルのパス (内部ステージ)
path = f"@CITIBIKE.PUBLIC.FONTS/gomarice_mukasi_mukasi.ttf";
# ファイルの読み込み
with session.file.get_stream(path, decompress=False) as f:
s = f.read()
# BytesIO: メモリ上でバイナリデータを扱うための機能
with BytesIO() as bs:
bs.write(s)
content = bs.getvalue()
# SiSの仮フォルダ領域への書き込み
with open(f"/tmp/bom-added-gomarice_mukasi_mukasi.ttf", "wb") as s:
s.write(content)
# WordCloudの設定
wc = WordCloud(font_path=f"/tmp/bom-added-gomarice_mukasi_mukasi.ttf").fit_words({"綾野": 100, "櫻木": 30, "影田": 40, "坂本": 1, "庄司": 50, "菊池": 20, "越川": 20, "白畑": 20)
# 画像データの生成
st.image(wc.to_array())
引用 / 参考リソース
フォントファイル
→ 昔々ふぉんと
参考サイト
- PythonのImageFontで使うフォントファイルをコード内に記述する
- Wordcloud - 🎈 Using Streamlit - Streamlit
- Pythonライブラリ(可視化):WordCloud
今さらながら自己紹介
Snowflake合同会社 SalesEngineerの櫻木優輝と申します。
私が作成したデモ動画が社内でバズり, 社内のFY23Q3のAwardを受賞しました。
「もっと社外に発信していこう」ということで,
これからSnowflakeのアレコレをわかりやすく発信していきますので,
皆様どうぞよろしくお願いいたします🙇♂️
すこし宣伝
2024年01月31日に開催されるBUILD Japanというイベントに登壇します!
「Snowflakeで完結!!
モデル開発からビジネス活用まで真のエンドツーエンド機械学習」
こちらのセッションめちゃめちゃ面白い内容になっているので
ぜひご参加くださいっ