Pythonと本と子供と雑談と

いつからはじめても遅くない

WordCloudの可視化をplotlyに。。失敗編

一昔前、グラフを作成するのは困難を極めました。ライブラリを使っていても何をやっているのかわかりませんでした。翻って昨今では、グラフを作成するのは簡単です。自分の見たいデータをちょいちょいっと渡し、エンターキーを「ターンッ」と押すとできます。そうなると人は、もっと動きのあるものをとかなんだか難しい要求を始めます。まぁ私も元々動くものを見ると飛びついてしまう族の出身なので、動いたらより良い派です。

なので、グラフも動いた方が良いと思っています。あと昨日久しぶりに経済指標などを眺めていたのですが、NY連銀なんかは、既に自社サイトにインタラクティブなグラフを取り入れていました。下はエンパイア指数へのリンクなのですが、2000年からのグラフをサイトに表示、マウスでグラフをコントロールでき、前回のSARSの時はどうだったかとか簡単に拡大してみることができます。

www.newyorkfed.org

一方、日銀はPDFを使った。(完)

www.boj.or.jp

前置きが長くなりましたが、WordCloudもインタラクティブに見たいということで、Plotlyで可視化してみました。しかし、いまいちでした。

WordCloudの作り方は下の記事にあります。

www.mazarimono.net

PlotlyでWordCloudを可視化する

DashのサンプルにWordCloudを可視化していたものがありました。ので、これを参考にしました。

github.com

まずは、WordCloudインスタンスがどんな感じでデータを持っているのか調べないといけません。属性を調べているとlayout_ というのがあったので、それを見てみるとデータがありました。

f:id:mazarimono:20200220114641p:plain
探していた君

これを可視化すればよいだけですね。というわけで、あとはデータをリストに入れてグラフにするだけですね。簡単。ということでやった見たのですが・・・。結果は下です(コードは最後に)。うーんどうも失敗感があります。まぁ文字を小さくすると、ちょっと被りはなくなりますが・・。文字が縦に出ている部分が問題なのかなぁとも思ったりしましたが、まぁこんな感じです。

f:id:mazarimono:20200220115436p:plain
アカン。。

まぁ、WordCloudはブログとかで見るのは面白いですが、実際データとしてみるのであれば、棒グラフなんかの方が良いので、それはできるので、それでよい感があります。

f:id:mazarimono:20200220120655p:plain
それを言ったら・・・

まとめ

PlotlyでWordCloudの可視化をというのは失敗に終わりました。まぁ、なんかがんばったらできそうな気がしますが、頑張るところでもなさそうだったからあきらめた感がありますが・・・。

本来やりたいところの課題としては、nagisaの使い方をしっかりと覚えたいところ。この辺りの処理で精度が変わりそうですね。あとは、最近AI人材様たちが使っておられるPytorchもがんばりたいところ。私としては、なにもがんばらずにできるKerasの方があっているなぁという気がしています。でも、将来AI人材様たちに使ってもらえるよう、頑張ってPytorchを学ぶのです!

↓読んでますが、アルゴリズムが分かりやすくてお勧めです。Pytorchの使い方はチュートリアルへ!

つくりながら学ぶ! PyTorchによる発展ディープラーニング

つくりながら学ぶ! PyTorchによる発展ディープラーニング

word_list = []
freq_list = []
fontsize_list = []
position_list = []
orientation_list = []
color_list = []

for (word, freq), fontsize, position, orientation, color in wordcloud.layout_[:50]:
    word_list.append(word)
    freq_list.append(freq)
    fontsize_list.append(fontsize)
    position_list.append(position)
    orientation_list.append(orientation)
    color_list.append(color)

# get position
x_arr = []
y_arr = []

for i in position_list:
    x_arr.append(i[1])
    y_arr.append(i[0])

new_freq_list = []
for i in freq_list:
    new_freq_list.append(i*80)

# 可視化
trace = go.Scatter(
        x=x_arr,
        y=y_arr,
        textfont=dict(size=new_freq_list, color=color_list),
        hoverinfo="text",
        textposition="top center",
        hovertext=["{0} - {1}".format(w, f) for w, f in zip(word_list, freq_list)],
        mode="text",
        text=word_list,
    )
layout = go.Layout(
        {
            "xaxis": {
                "showgrid": False,
                "showticklabels": False,
                "zeroline": False,
                "automargin": True,
                "range": [-300, 1000],
            },
            "yaxis": {
                "showgrid": False,
                "showticklabels": False,
                "zeroline": False,
                "automargin": True,
                "range": [-300, 1200],
            },
            "margin": dict(t=20, b=20, l=10, r=10, pad=4),
            "hovermode": "closest",
            "width": 800,
            "height": 600,
            
        }
    )
fig = go.Figure(data=trace, layout=layout)
fig.show()