34
38

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Power BI × Pythonで日本語ワードクラウド ~Pythonビジュアル編~

Last updated at Posted at 2018-09-06

"Word Cloud"を前に悄然とせし者に捧ぐ。
image.png

はじめに

Power BIで日本語テキストデータのワードクラウドを作ろうとした場合に,カスタムビジュアル"Word Cloud"を使用すると,上手く単語に分解されず,このように一部文章がそのまま表示されてしまいます。

image.png

/(^o^)\ナンテコッタイ

しかし,2018年8月のアップデートでPythonが使えるようになりました(※)ので,Pythonビジュアルを使用してワードクラウドを作成してみたいと思います。
※2018年9月現在,プレビュー版

環境構築

Power BIでPythonを使用する準備は
 Python × PowerBI データ分析事始め【データ準備編】 - Qiita
をご参照ください。

処理の流れ

  1. 全テキストデータを連結
  2. 形態素解析
  3. スペース区切りで再結合
  4. ワードクラウド生成

※2・3を行わないと,カスタムビジュアルを使った場合と同じ目に遭います。

実装

0. データ・ビジュアル準備

今回は自身のツイート履歴(CSV)をデータとして使用します。
データは予めPower BI上に取り込んでおきます。
image.png
[text]列がツイートの中身です。こちらをワードクラウドで可視化します。

Pythonビジュアルを配置し,[値]エリアに対象のデータ列を設定します。
image.png

データはPandasのDataFrameとして読み込まれます。

1. 全テキストデータを連結

ここからはPythonビジュアルのスクリプトエディターに記載していきます。
image.png

形態素分析を行うために,まず全テキストデータを結合します。

all_text= ""
for s in dataset.loc[:,'text'].values:
    all_text += s

2. 形態素解析

今回はjanomeを使って形態素解析を行います。もちろんMeCabでも構いません。

1で連結したテキストデータをtokenize()メソッドに渡します。

from janome.tokenizer import Tokenizer
tok = Tokenizer()
tokens = tok.tokenize(all_text)

3. スペース区切りで再結合

ワードクラウド上へ表示するにあたり,有意義な品詞(名詞/動詞/形容詞/副詞)の原型のみを半角スペース区切りで結合します。
token.part_of_speech.split(',')[0]が品詞,token.base_formが原型です。

words = ""
for token in tokens:
    if token.part_of_speech.split(',')[0] in ['名詞', '動詞', '形容詞', '副詞']:
        words = words + " " + token.base_form

4. ワードクラウド生成

以上の下準備が済んだら,いよいよワードクラウドを生成します。
amueller様のライブラリを使用するので,さほど難しいことはありません。

from wordcloud import WordCloud
wordcloud = WordCloud(background_color="white"
                     ,width=800
                     ,height=500).generate(words)

あとはプロットするだけです。

import matplotlib.pyplot as plt
plt.figure(figsize=(30,24))
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

では,ここまでの結果を表示してみましょう。
スクリプトエディター右上の[スクリプトの実行] image.pngを押下します。

はい。

image.png

豆腐一丁!

問題1. 文字化け

何もしないと日本語が文字化けしてしまいますので,フォントを指定してあげましょう。

from wordcloud import WordCloud
fpath = "C:/hogehoge/Fonts/YuGothM.ttc"   # 任意の日本語フォントのパスを指定
wordcloud = WordCloud(background_color="white"
                     ,font_path=fpath
                     ,width=800
                     ,height=500).generate(words)

再度スクリプトを実行します。

image.png
無事表示されました。

問題2. 無用な単語の表示

さて,無事表示されたものの,「https」や「する」など,無個性な単語がいくつか混じっています。
そんなときはストップワードを指定しましょう。

stop_words = [u'https', u'co', u'LINE', u'アカウント', u'YahooNewsTopics'
             ,u'news', u'linenews', u'Yahoo', u'ニュース', u'いる', u'する'
             ,u'ある', u'なる', u'れる', u'できる', u'ない', u'これ', u'こと'
             ,u'さん', u'られる', u'やる', u'てる']

wordcloud = WordCloud(background_color="white"
                      ,font_path=fpath
                      ,width=800
                      ,height=500
                      ,stopwords=set(stop_words)).generate(words)
image.png
なかなかいい感じになりました。
いいと思ったことをつぶやく傾向があるのですかね。(meって何だ…)

おまけ

マスキング

マスキングもできます。

せっかくなので,Twitterロゴでマスキングしてみましょう。

import numpy as np
from PIL import Image
twitter_logo = np.array(Image.open("/hogehoge/Twitter_Logo.png"))   # 任意の画像パスを指定

ついでに色もそれっぽくします。

def color_func(word, font_size, position, orientation, random_state, font_path):
    return 'deepskyblue'

表示すると・・・

wordcloud = WordCloud(background_color="white"
                     ,font_path=fpath
                     ,color_func=color_func
                     ,width=800
                     ,height=500
                     ,mask=twitter_logo
                     ,stopwords=set(stop_words)).generate(words)
image.png

できた!

スライサー

Power BI上で動作しているので,スライサーも使えます。

試しに[timestamp]列をスライサーに設定し,今年のツイートに絞って表示してみます。

image.png

ここでは,Pythonスクリプトを変更したわけではないので,再実行は不要です。
自動的に再描画されるので,少し待ちます。

image.png

表示されました。
あまり変わっていませんが,「tabilabo」の代わりに「メディア」が台頭してきましたかね。

まとめ

今回はPythonビジュアルを利用して,Power BI上で日本語ワードクラウドを表示してみました。
あくまで「Power BI上で日本語ワードクラウドを作成すること」が目的でしたので,テキストマイニングという観点ではイマイチな点もあるかと思いますが,ご容赦いただければ幸いです。

Power BI上で作成することで,他のチャートとの同時表示や分析対象の変更が手軽にできますので,アンケートの集計等に活用できるのではないかと思います。

以下,スクリプトです。

from janome.tokenizer import Tokenizer
import numpy as np
from PIL import Image
from wordcloud import WordCloud
import matplotlib.pyplot as plt

# 全テキストデータを連結
all_text= ""
for s in dataset.loc[:,'分析対象列名'].values:
    all_text += s

# 形態素分析
tok = Tokenizer()
tokens = tok.tokenize(all_text)

# 解析結果のうち,名詞/動詞/形容詞/副詞の「原型」のみをスペース区切りで結合
words = ""
for token in tokens:
    if token.part_of_speech.split(',')[0] in ['名詞', '動詞', '形容詞', '副詞']:
        words = words + " " + token.base_form

# ストップワード指定
stop_words = [u'https', u'co', u'LINE', u'アカウント', u'YahooNewsTopics'
             ,u'news', u'linenews', u'Yahoo', u'ニュース', u'いる', u'する'
             ,u'ある', u'なる', u'れる', u'できる', u'ない', u'これ', u'こと'
             ,u'さん', u'られる', u'やる', u'てる']

# フォントカラー指定
def color_func(word, font_size, position, orientation, random_state, font_path):
    return 'deepskyblue'

# ワードクラウド生成
fpath = "C:/hogehoge/Fonts/hoge.ttc"   # 任意の日本語フォントのパスを指定
twitter_logo = np.array(Image.open("/hogehoge/hoge.png"))   # 任意の画像パスを指定

wordcloud = WordCloud(background_color="white"
                     ,font_path=fpath
                     ,color_func=color_func
                     ,width=800
                     ,height=500
                     ,mask=twitter_logo
                     ,stopwords=set(stop_words)).generate(words)

# プロット
plt.figure(figsize=(24,15))
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

参考

34
38
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
38

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?