コードあり!単語の頻出度がわかるWordCloudを使って文章を画像化してみた

PythonのWordCloudを使って、以下のような単語の頻出度を画像化してみました。

画像化するフローを紹介します!

 

 

大きい文字ほど、出現回数が多い単語です。

 

作ったプログラムの概要

Mysqlに保存した文章データを1件ほど読み込んで、形態素分析します。

形態素分析で分けた文字列の品詞は、「名詞」「形容詞」だけに限定しています。文書の中で、どんな単語を使っているか着目しているためです。

形態素分析で分解された文字列をwordcloud使って、頻出単語の出現状況を画像化してみました。出現回数が多い単語ほど、大きい文字列になります。

 

では、以下の文章で実験してみます。

 

ジェットコースター乗れない男性は、世界中にたくさんいる(はず)。僕も、ジェットコースターに乗ることができない。もしかしたら、観覧車すら乗れないかも。
ジェットコースターに乗れるか乗れないかで人生が狂うこともあるだろう。特に、デートのときジェットコースター乗れないと“へたれ”という汚名を着せられてしまう。
それは、男性にとって大変悲しいことである。しかし、ジェットコースターが苦手な男性にとって希望といえる記事「ジェットコースター生理学」を発見することができた。
ジェットコースター生理学によると男性は、生理的にジェットコースターが苦手であるという。
緊張する状況下に置かれたとき、男性は脳波が乱れてストレスを感じる。逆に、女性は緊張する状況下では冷静に観察でき、リラックスしながら状況を楽しめ、ストレス発散できるのだ。だから、男性がジェットコースター苦手なのは仕方ないことなのだ。友達にジェットコースター乗ることを誘われ、積極的に断わっても全く問題なし。
もしもあなたが、ジェットコースターに乗れるようになりたかったら「ジェットコースター生理学」を読んでみてください。ジェットコースター克服方法について記載されています。ここでは、その内容を触れません。
ジェットコースター苦手ばんざいーー!!

記事 ジェットコースター生理学
http://www.interq.or.jp/tokyo/ohata/yuuenchi/06data/60jet.htm

 

単語の回数をカウントしてみます。

その結果、以下のような結果になりました。

('ジェット', 15),
 ('コースター', 15),
 ('男性', 6),
 ('こと', 6),
 ('/', 5),
 ('苦手', 4),
 ('生理学', 4),
 ('.', 4),
 ('状況', 3),
 ('の', 3),
 ('とき', 2),
 ('記事', 2),
 ('的', 2),
 ('緊張', 2),
 ('下', 2),
 ('ストレス', 2),
 ('世界中', 1),
 ('たくさん', 1),
 ('はず', 1),
 ('僕', 1),
 ('観覧', 1),
 ('車', 1),
 ('人生', 1),
 ('デート', 1),
 ('汚名', 1),

 

出力された画像は以下の通り。

 

出現回数が多い「ジェット」「コースター」が一番大きい文字になっていることがわかります。次の多い文字が「男性」「こと」になっています。

 

分解された文字列の中に「/」などの記号のみ取り出されるケースもあるので、本来は精度を高めるには、前処理で雑音(記号など)を削除する必要があります。

 

今回は短い文章のため余白がたくさんありますが、

青空文庫にある文庫本を入れてみたら、文字がもっとぎっしりしたものになります。

実際に使ったプログラムを記載します。

 


'''
DB(Mysql)に保存した文章データから、形態素解析するサンプル。
取り出した語句についてWordCloudで可視化までする
'''

import re
import pickle
from janome.tokenizer import Tokenizer
import mysql.connector
from wordcloud import WordCloud


#文章データを読み込みます。
#この例では、mysqlから読み込み元のデータを持って来ています。
conn = mysql.connector.connect(
    host = 'localhost',
    port =  3306,
    user =  'root',
    password =  "",
    database = "BlogResearch",
)
cur = conn.cursor()
cur.execute('SELECT diary_data  from t_diary_logs where  id IN(124)')
datas = cur.fetchall()

#セパレータを「。」とする。
seperator = "。"
mixi_diary_origin = ""
for row in datas:
    data =   re.sub("[|  「」\n]", "", row[0]) # | と全角半角スペース、「」と改行の削除
    mixi_diary_origin += data

mixi_diary_list = mixi_diary_origin.split(seperator)  # セパレーターを使って文章をリストに分割する
mixi_diary_list = [x+seperator for x in mixi_diary_list]  # 文章の最後に。を追加

#この時点でデータの準備が終わりです
#ここから形態素分析に入ります
t = Tokenizer()

mixi_diary_words = []  #形態素分析したあとに出てきた語句を格納するリスト(この例では、名詞、形容詞のみの語句を取っています)
for sentence in mixi_diary_list:
    
    tokens = t.tokenize(sentence)
    words = []
    for token in tokens:
        # 品詞を取り出し
        partOfSpeech = token.part_of_speech.split(',')[0]
 
        if partOfSpeech == u'名詞'  or  partOfSpeech == u'形容詞' :
            #print (token.surface)
            words.append(token.surface)
    
    if len(words) > 0:
        mixi_diary_words.extend(words)
    


# In[2]:

#ここからWordCloudの処理
#mixi_diary_wordsは、WordCloudで使えるように2次元の配列(行列)になっているので、1次元の配列(ベクトル)に変換する
text = ""
for x in mixi_diary_words:
    text = text + x + " "

wordcloud = WordCloud(background_color="white",
    font_path="/System/Library/Fonts/ヒラギノ明朝 ProN.ttc",
    width=800,height=600).generate(text)

#画像ファイルに保存する
wordcloud.to_file("./wordcloud_sample.png")

#文字数をカウントする


# In[3]:

#折角なので文字数も求めてみる
from collections import Counter
c =  Counter(mixi_diary_words)
c.most_common()

 

まとめ

wordcloudは、面白いですね。

今回は、過去に書いた日記に対して頻出単語の画像化をしましたが、

これをアンケートやチャット、Twitterのツイートに使ってみたら面白い発見ができるかもしれないですね。

 

\IT未経験者からのサポートあり!転職サービス3選!!/

サービス名
未経験 未経験OK 未経験の転職専用 経験者向け
公開の求人数 ITエンジニア全体で1万件以上
ITエンジニア未経験で600件以上
未公開 5,000件以上
利用対象 全職種 IT特化 IT特化
特徴 ✓誰もが知る転職サービス
✓経歴を登録しておくとオファーが来る
✓企業担当者と条件交渉
✓スキルの身につく企業を紹介
✓IT専門のエージェントが対応
✓転職成功すると年収200万円以上の大幅アップがある
転職サポート内容
  • 求人検索
  • 企業担当者と交渉
  • 求人紹介
  • ライフプランのサポート
  • キャリア相談
  • 求人紹介
  • 提出書類の添削
  • 面接対策
公式サイト リクナビネクスト テックゲート レバテックキャリア
最新情報をチェックしよう!