【Python】Word Cloud で相談事項を可視化してみた

何の記事???

Word Cloud はご存知でしょうか??
amueller さんが作成した 単語の出現頻度を可視化する python のライブラリです。実際にアウトプットとなる画像はみた方も多いのではないでしょうか?

github.com

word cloud
word cloud のデモ画像

最近メンティーから相談をいただけることが多くなりとても嬉しい反面、きちんとお答えできているかな?と思い回答やいただいたご質問を振り返ることが多くなってきています。

そこで、一度メンティーの方々からのご相談事項を可視化してみたら何か見えてくるかなぁと思い、word cloud の紹介の意味も込めて記事にしたいと思います!!(各メンティーの相談事項及びプライバシーは侵害しないように生データは一切公開しません。)


必要なライブラリの準備

Word Cloud のインストール

まずは今回紹介する Word Cloud をインストールしましょう。

pip3 install wordcloud

形態素解析エンジンのインストール

次に形態素解析用エンジンをインストールしましょう。
形態素解析とは簡単にいうと文章を単語ごとに分割することで、検索エンジンなんかでも利用されている技術です。

実際にどういうものかというと下記をご覧ください。
「僕は昨日ラーメンを食べた。」という文に対して、「僕」「は」「昨日」「ラーメン」「を」「食べ(る)」「た」「。」に見事に分割されていますね。

これは良い例で新しい単語に対応させるには、違う辞書を使ったりします。僕が学生の時にニュースを形態素解析したことがあるのですが、そのとき「トランプ大統領」は「トランプ」「大統領」と分割された思い出があります。

一方最新の辞書を使うと「トランプ大統領」と一つの名詞として認識されます。

僕は昨日ラーメンを食べた。
僕 名詞,代名詞,一般,*,*,*,僕,ボク,ボク
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
昨日  名詞,副詞可能,*,*,*,*,昨日,キノウ,キノー
ラーメン    名詞,一般,*,*,*,*,ラーメン,ラーメン,ラーメン
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
食べ  動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。 記号,句点,*,*,*,*,。,。,。

さて、形態素解析の概要はご理解いただけたでしょうか。
今回は、mecab という形態素解析エンジンをインストールして使いましょう。

brew install mecab mecab-ipadic git curl xz
pip3 install mecab-python3


プログラムの作成

それではプログラムを書いていきましょう。

まずは必要なライブラリをインポートしてあげます。

# ライブラリのインポート
import matplotlib as plt
from wordcloud import WordCloud
import MeCab as mecab

次にデータとなるローカルファイルを読み込み、形態素解析を行い必要な単語リストを作成するメソッドを作ります。

先ほどの「僕は昨日ラーメンを食べた。」でもわかる通り、助詞や助動詞はあまり意味をなさない上に頻出してしまうので今回は「名詞、形容詞、動詞」に絞りました。

def create_word_list(filepath):
    # ファイルをオープンする
    data = open(filepath, "r")
    # mecab のインスタンス生成
    m = mecab.Tagger ("-Ochasen")
    # 返却用変数
    word_list = []
    # 一行ずつ読み込む
    for line in data:
        # ノードの作成
        node = m.parseToNode(line)
        # ノード分回す
        while(node):
            # ヘッダーとフッターは空文字のため扱わない
            if len(node.surface) > 0:
                # 品詞が「動詞、形容詞、名詞」だったら
                if node.feature.split(",")[0] in ["動詞", "形容詞","名詞"]:
                    word_list.append(node.surface)
            # 次のノードに進める
            node = node.next
            # ノードが None 型だったらループから抜ける
            if node is None:
                break
    # 返却
    return word_list

それでは Word Cloud を作成していきましょう。stopwords というのは、除外ワードのことで一般的な意味を持つものや今回関係ないものをセットすることで対象から外します。
フォントを指定する必要がありますが、もし日本語用フォントが入っていなかったらインストールしてください。(ちなみの僕は下記サイトのものを入れました。)

https://ipafont.ipa.go.jp/old/ipafont/download.htmlipafont.ipa.go.jp

def create_wordcloud(text):
    # フォントのパス
    fpath = "./ipam.ttc"
    # 除外ワード
    stop_words = ["いい", "感じ", "あっ", "使っ", "あり", "やっ", "する", "いる", "なっ", "でき", "よう", "てる", \
    "思っ", "さん", "こと", "ところ", "ため", "ところ", "みよ"]
    # wordCloud のインスタンス生成
    word_cloud = WordCloud(background_color="white", font_path=fpath, stopwords=set(stop_words), width=900, height=500).generate(text)
    # png ファイルに出力
    word_cloud.to_file("./result.png")

これで Word Cloud を使って png ファイルに出力できるようになりました。

最後に、呼び出しを書いて完了です!!

word_list = create_word_list("./data.txt")
create_wordcloud(text = ' '.join(word_list))

プログラム全部は github に乗せているので、自分も動かしたい!!という方はご参考ください。

https://github.com/shawkoike/python/tree/master/word_cloudgithub.com

成果物

最終的なアウトプットは以下のようなものが得られました!!

相談事項の可視化
相談事項の可視化

プログラミングの項目が多いかと思いきや意外に「開発、地方、東京、案件」というワードが目立ちますね。

本当にメンティーが求めていることは、プログラミング云々というよりもこれからのロードマップなんですね。「地方、東京」が目立ちますがロードマップに関連して地方からの転職について求められていることが多いですね。

これから僕が仕入れる情報も明確化されてよかったです。


最後に

今回は簡単な辞書で形態素解析をやったことや、無理やり stopwords を作成したので今度は辞書を変えたりもうちょっと精度の良いものが出せたら嬉しいなと思います。

それではまた次回〜