pythonでWordCloudやってみた

前回Mecab形態素解析して単語の出現数を出すとこまでやりましたが、本来はWordCloudを作ってみたいというのがあったので、前回のプログラムを改修して
WordCloud出力機能を付けてみました。

やり方自体は以下のサイト見れば幾らでも書いてあるのでがっつりコピペで仕上げました。巨人の肩に乗って仕上げるのが一番いいんですよこういうのは

◆参照サイト
http://mmtomitomimm.blogspot.com/2018/12/word-cloud.html
http://pynote.hatenablog.com/entry/python-wordcloud
https://biosciencedbc.jp/nbdc-blog/1068-20181219-00
http://www.dskomei.com/entry/2018/04/11/001944
https://teratail.com/questions/167701
http://syu-m-5151.hatenablog.com/entry/2016/12/19/001736
https://www.suzu6.net/posts/111-amcharts-word-cloud/
http://memopy.blogspot.com/2017/10/python.html
http://irukanobox.blogspot.com/2018/12/python.html

◆追加手順
1.フォントのインストール
    今回はUbuntu18.04のサーバなのでフォントがないから追加インストール
  IPAフォントにしました。

$ sudo apt install -y fonts-ipaexfont

◆ソースコード
 前回のファイル出力部分にWordCloudのpng出力機能を追加しました。
 なのでそこまで大きく変更はありません。(wordcloud用の関数追加位)

import collections
import csv
from operator import itemgetter
import requests
import sys
import traceback

import matplotlib.pyplot as plt
import MeCab
from wordcloud import WordCloud

def create_wordcloud(txt,out_file):
    """
    テキストを受取ってWordCloudを生成する。
    """
    try:
        # フォントパス指定。
        fpath = "/usr/share/fonts/opentype/ipaexfont-mincho/ipaexm.ttf"
        # ストップワード
        stop_words = [ u'てる', u'いる', u'なる', u'れる', u'する', u'ある', u' こと', u'これ', u'さん', u'して', \
                 u'くれる', u'やる', u'くださる', u'そう', u'せる', u'した',  u'思う',  \
                 u'それ', u'ここ', u'ちゃん', u'くん', u'', u'て',u'に',u'を',u'は',u'の', u'が', u'と', u'た', u'し', u'で', \
                 u'ない', u'も', u'な', u'い', u'か', u'ので', u'よう', u'']
        wordcloud = WordCloud(background_color="white",font_path=fpath, width=900, height=500, \
                              stopwords=set(stop_words)).generate(txt)
        wordcloud.to_file(out_file+'.png')
    except Exception as e:
        t, v, tb = sys.exc_info()
        print(traceback.format_exception(t,v,tb))
        print(traceback.format_tb(e.__traceback__))

def word_tokenaize(doc):
    """
    Mecabを使用して与えられたテキストを解析する
    名詞のみを取り出してリストに格納する

    """
    try:
        tagger = MeCab.Tagger(" -d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd")
        tagger.parse("")
        node = tagger.parse(doc)
        results = []
        lines=[]
        lines=node.split('\n')
        for item in lines:
           cw = item.split('\t')[0]
           if len(item) > 5:
              ps = item.split('\t')[1].split(',')[0]
              if  ps == '名詞':
                  results.append(cw)
        return results
    except Exception as e:
        t, v, tb = sys.exc_info()
        print(traceback.format_exception(t,v,tb))
        print(traceback.format_tb(e.__traceback__))

def main():
    """
    主処理
    第1引数から入力ファイル、第2引数から出力ファイルを取得する
    word_tokenaizeで解析した単語の解析結果を加工する。
    加工データは単語数を降順でソートしたCSVとWordCloudのpngファイルとして出力される。
    """
    try:
        o = []
        r = []
        csvlist = []
        input_file = sys.argv[1]
        output_file = sys.argv[2]

        for line in open(input_file, 'r'):
            r = word_tokenaize(line)
            o.extend(r)
        result = collections.Counter(o)
        create_wordcloud(' '.join(o),output_file)

        f = open(output_file + '.csv', 'w')
        writer = csv.writer(f, lineterminator='\n')
        for word, cnt in sorted(result.items(),key=lambda x: x[1], reverse=True):
            writer.writerow([word,cnt])
            print(word, cnt)
        f.close
    except Exception as e:
        t, v, tb = sys.exc_info()
        print(traceback.format_exception(t,v,tb))
        print(traceback.format_tb(e.__traceback__))

if __name__ == '__main__':
   main()

まぁ試しによそのWebページからテキスト部分だけテキストに落してみてどんなワードが埋め込まれているかを分析してみるというのも面白いかもしれません。
とりあえず前回Cabochaも入れていますが特に使ってないですね。まぁけど類似度測定とかTF-IDFとかやれれば、どこかから雇ってもらえるのかなぁと甘い夢を見つつ。
今回は終了です。

コメント

このブログの人気の投稿

証券外務員1種勉強(計算式暗記用メモ)

GASでGoogleDriveのサブフォルダとファイル一覧を出力する

マクロ経済学(IS-LM分析)