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フォントにしました。
◆ソースコード
前回のファイル出力部分にWordCloudのpng出力機能を追加しました。
なのでそこまで大きく変更はありません。(wordcloud用の関数追加位)
まぁ試しによそのWebページからテキスト部分だけテキストに落してみてどんなワードが埋め込まれているかを分析してみるというのも面白いかもしれません。
とりあえず前回Cabochaも入れていますが特に使ってないですね。まぁけど類似度測定とかTF-IDFとかやれれば、どこかから雇ってもらえるのかなぁと甘い夢を見つつ。
今回は終了です。
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とかやれれば、どこかから雇ってもらえるのかなぁと甘い夢を見つつ。
今回は終了です。
コメント