TF-IDFを求めてWordCloudをつくるプログラム(4)
こんにちは。前回に続きプログラムの説明です。まだ半分残っているので、今回も枕の話はなしです。
Word Cloudを作る部分
92~120行目では、Word Cloudを作っています。
# --------------- 【分類ごとにワードクラウドの画像を作る】 ---------------
# wordcloudを組み込む
from wordcloud import WordCloud
# 分類ごとにワードクラウドを作成する
for category in documents:
# フォントを指定する
fpath = 'c:\windows\Fonts\KozGoPro-Light.otf'
# ワードクラウドで描画しない語のリスト
stop_words = [ 'てる' , 'いる' , 'なる' , 'れる' , 'する' , 'ある' ,
'こと' , 'これ' , 'さん' , 'して' , 'くれる' , 'やる' ,
'くださる' , 'そう' , 'せる' , 'した' , 'できる' ,
'それ' , 'ここ' ,
'ちゃん' , 'くん' , '' ,
'て' , 'に' , 'を' , 'は' , 'の' , 'が' , 'と' ,
'た' , 'し' , 'で' , 'ない' , 'も' , 'な' , 'い' , 'か' ,
'ので' , 'よう' ,'' ]
# ワードクラウドを指定する
wordcloud = WordCloud(background_color="white" ,
font_path=fpath ,
width=1024 , height=674 , ranks_only = True ,
stopwords=set(stop_words)).generate( ','.join(word_list[category]) )
# 画像ファイル(png)として、ファイルに出力する
wordcloud.to_file( './' + category + '.png' )
95行目では、Word Cloudを作るためのライブラリをインポートしています。標準ライブラリではないので、インストールしていなければ、pipコマンドでインストールする必要があります。
98行目では、カテゴリーごとにWord Cloudを作るようループさせています。
101行目では、Word Cloudで使うフォントを指定しています。フォントの形式はotfかttfだけが使えます。このプログラムはWindows7で実行しました。Windows7が持っている小塚ゴシックとしています。私が使っているWindows10では、この形式のフォントが見つかりませんでした。どうしたらよいのでしょう。
104~111行目では、ストップワードをリストで指定しています。名詞・動詞・形容詞は意味がある言葉が多数を占めますが、必ずしも意味があるといえないところが難しいといえます。名詞では「こと」、動詞では「する」「いる」のような形態素が出現しますが、これらの形態素は文章上補助的な役割の語なので、特徴語としては扱いたくありません。とりあえずデフォルトで104~111行目として用意しました。生徒の中には出来上がったWord Cloudを見て、不要な語を追加しているグループもありました。
114~117行目では、Word Cloudで必要なパラメータを設定して、Word Cloudを作っています。ここで指定しているパラメータは、背景色(background_color)を白、フォント(font_path)を101行目で変数fpathに代入した小塚ゴシックに、画像サイズを幅(width)を1024ピクセル、高さ(height)を674ピクセルに、単語のランク(ranks_only)を使って、ストップワード(stopwords)を変数stop_wordsのリストの要素としています。これらのパラメータを用いて、カテゴリーごとの形態素をを用いて作成しています。他にも多数のパラメータがありますが、Word Cloudの詳細な説明は、ドキュメントを参考にしてください。
120行目では、先に作成したWord Cloudをpng形式の画像ファイルとして出力しています。ファイル名は「カテゴリー名.png」です。
IDFを求める部分
123~132行目では、IDFを求めています。
# --------------- 【idf を求める】 ---------------
# 対数(log)を使えるようにする
import math
idf = { } # idf を記録する変数を初期化
# idf を求める(log(全文書数/語を含む文書数) )
for word in word_documents:
idf[word] = math.log( count_all / word_documents[word] ,10 )
126行目では、対数を使えるようにmathライブラリをインポートしています。これは標準ライブラリなのでとくに問題ないと思います。
128行目では、IDFの計算結果を記録する変数を初期化しています。
131・132行目では、形態素ごとにIDFを計算しています。IDFの計算式は、\(\log{(全文書数 / 単語tが出現する文書数)}\)でした。この計算式と同じ式が132行目に書かれています。ここで、対数の底は10にしています。
TF-IDFを計算する部分
135~146行目では、TF-IDFを計算しています。
# --------------- 【tf-idf を求める】 ---------------
tfidf = { } # tf-idf を代入する変数を初期化
# カテゴリーごとにtf-idfを計算する
for category in word_list:
tfidf[category] = { } # カテゴリごとに初期化
# tf-idf を計算( tf-idf = tf * idf )
for word in word_list[category]:
tfidf[category][word] = tf[category][word] * idf[word]
137行目では、TF-IDFの計算結果を記録する変数を初期化しています。
140行目では、カテゴリーごとにTF-IDFを求めるようにループしています。
142行目では、TF-IDFの計算結果を記録する変数を初期化しています。
145・146行目では、カテゴリー内のすべての形態素に対してTF-IDFを計算しています。TF-IDFの計算式は、\(\rm{tfidf}(t,d)=\rm{tf}(t,d)\times\rm{idf}(t)\)でした。これと同じ式が146行目に書かれています。
あと20行余りですが、力尽きました。ここまでで求めたTF-IDFを、出力する部分を次回説明します。回数マシマシな感じがしますが、確実に次回で最終回です。それではまた。
ディスカッション
コメント一覧
まだ、コメントがありません