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を、出力する部分を次回説明します。回数マシマシな感じがしますが、確実に次回で最終回です。それではまた。

Posted by 春日井 優