TF-IDFを求めてWordCloudをつくるプログラム(5)

テキストマイニング

自然光の中でコーディング

こんにちは。これまで4回にわたり、TF-IDFを求めてWord Cloudをつくるプログラムを説明してきました。今回が最終回になります。

計算結果を出力する部分

149~173行目では、前回説明した部分で計算したTF-IDFを出力しています。

# --------------- 【tf-idf をエクセルに出力する】 ---------------
 
from openpyxl import Workbook
 
filename = "tf-idf.xlsx"
book = Workbook()
 
# カテゴリーごとにtf-idfをファイルに出力する
for category in word_list:
 
    sheet = book.create_sheet(category)
    sheet['A1'] = '形態素'
    sheet['B1'] = 'tf'
    sheet['C1'] = 'idf'
    sheet['D1'] = 'tf-idf'
    
    # tf-idf が大きい順に並び替えて出力する
    keys = sorted( tfidf[category].items() , key = lambda x:x[1] , reverse = True )
    for i , word in enumerate(keys):
        sheet.cell(row=i+2,column=1).value = word[0]
        sheet.cell(row=i+2,column=2).value = tf[category][word[0]]
        sheet.cell(row=i+2,column=3).value = idf[word[0]]
        sheet.cell(row=i+2,column=4).value = tfidf[category][word[0]]
 
book.save('tf-idf.xlsx')

プログラムでは、計算したTF-IDFをExcelに出力させることにしました。Matplotlibというライブラリを使えば、グラフを描いて出力することもできるのですが、単に数値の大小だけではなく、出力された言葉の意味を取りながら重要性を判断する必要があると考えました。ストップワードを増やして、再度プログラムを実行することにより修正することもできますが、限られた授業時間で発表資料を完成させるためには、Excel上で操作した方がよいと判断しました。カテゴリーごとに計算結果のシートを作り、形態素・TF・IDF・TF-IDFをそれぞれ出力しています。グラフはそのデータをもとに、生徒がExcelを使って描くことにしました。

151行目では、openpyxlというライブラリをインポートしています。これによりExcelとしてデータを出力できるようになります。標準ライブラリではないので、インストールしていなければ、pipコマンドでインストールする必要があります。

153行目では、出力先のファイル名を変数filenameに入れて・・・というはずでしたが、結果として使っていませんでした。何をやっているんでしょうね。

154行目では、空のExcelファイルを作成し変数bookとして記憶しています。

157行目では、カテゴリーごとに出力するようループさせています。

159行目では、カテゴリー名がシート名となる新しいシートを作成しています。

160~163行目では、カラム名「形態素」「TF」「IDF」「TF-IDF」をA1~D1のセルに出力しています。

166行目では、TF-IDFが降順になるようにソートしています。引数が3つあるので、それぞれの引数について説明します。1つ目の引数ではソートするデータを与えています。tfidf[category].items()により、TF-IDFの計算結果を(キー,バリュー)のタプルとして、それらを要素とするリストに変換して与えています。バリューであるTF-IDFの値を降順で並べ替え、キーである形態素を使うため、2つの値のタプルにしています。実際どうなるかというと、
[ ( '果物’, 0.04 ) , ( 'ケーキ’ , 0.19 ) , ( 'ビタミン’ , 0 ) , ('赤い’ , 0.04) ]
となります。2つ目の引数ではソートキーを与えています。TF-IDFの値でソートするので、TF-IDFの値はタプルの2つ目の要素でありx[1]を指定しています。3つ目の引数はソート順を降順にするため、reverse = True としています。

167行目では、for i , word in enumerate(keys):により、インデックス番号を変数iに、リストの要素を変数wordで受け取りループしています。ループ1回目では、i=0,word=( 'ケーキ’ , 0.19 )を受け取っています。

168~171行目では、セルに値を出力しています。168行目ではA列のi+2行目に形態素を、169行目ではB列のi+2行目にTFを、170行目ではC列のi+2行目にIDFを、171行目ではD列のi+2行目にTF-IDFを出力しています。

173行目では、変数bookに出来上がったExcelを'tf-idf.xlsx’というファイル名で保存しています。本当ならば、book.save(filename)とすべきでした。

以上でプログラムをひととおり確認しました。無理やり書いている部分があったり、不要な行が残っていたりして書き直したい感じがします。

授業で説明した部分

これまで5回にわたってプログラムの全行について説明しましたが、授業ではこんな説明をしていません。ポイントになる行に絞りました。

53行目で形態素解析し、82行目で形態素の数を数え、90行目でTFを求め、132行目でIDFを求め、146行目でTF-IDFを求めているという程度にしました。プログラムを書くよりもプログラムを活用して問題の発見や解決に活用することを重視しました。

今月はテキストマイニングの記事だけで終わってしまいました。授業では次に機械学習の1つである単純ベイズ分類器について扱いましたが、それを書くのに少し間が空くかもしれません。その時には、この記事にリンクを追記します。それではまた。

Posted by 春日井 優