文章をTF-IDFのデータベースに変換

このプログラムではlivedoorニュースコーパスを利用する。

スポーツ、IT、映画、ライフの4つに分けたデータベースを生成する。

f:id:hanamichi_sukusuku:20210216185539p:plain

実行結果

genre.pickleというファイルにTF-IDFに文章を変換したデータを格納し保存する。

tfidfモジュール内で生成した単語辞書、テキストをIDで表現したデータ、全文章での単語の出現頻度のデータも保存。

 

ファイル読み込み

y =
x =

# ディレクトリ内のファイル一覧を処理 --- (*1)
def read_files(path, label):
print("read_files=", path)
files = glob.glob(path + "/*.txt")
for f in files:
if os.path.basename(f) == 'LICENSE.txt': continue
tfidf.add_file(f)
y.append(label)

# ファイル一覧を読む --- (*2)
read_files('text/sports-watch', 0)
read_files('text/it-life-hack', 1)
read_files('text/movie-enter', 2)
read_files('text/dokujo-tsushin', 3)

read_files()関数に事前にlivedoorニュースコーパスからtextディレクトリに作成しておいたそれぞれのファイルのパスとラベルにする値を渡す。

glob.glob()でファイルの中身のテキストファイル名を全て取得。

os.path.basename()では引数に渡したパスからファイル名を取得してくれる。LICENSE.txtの場合はcontinue。

tfidf.add_file()は自作したモジュールから関数を使用している。

hanamichi-sukusuku.hatenablog.com

上記のリンクでモジュールを作成している。

tfidf.add_file()

def add_file(path):
  '''テキストファイルを学習用に追加する''' # --- (*6)
  with open(path, "r", encoding="utf-8") as f:
   s = f.read()
   add_text(s)

引数で受け取ったパスのファイルを読み取り用で開き、read()で読み込む。

add_text()ではテキストをIDリストに変換してくれる。

tfidf.add_file()関数を実行すると単語辞書、テキストをIDで表記したデータを生成してくれる。

モジュールの詳細は上記リンク。

y.append()でラベルデータ作成。

 

TF-IDFベクトルデータをxに格納

x = tfidf.calc_files()

tfidf.calc_files()ではTF-IDFの手法で文章中に出現した単語の出現頻度を重要も考慮した形でのデータに変換し呼び出し元に返す。同時に関数で全テキストデータでの単語の出現頻度のデータも生成している。

このxの中身を確認すると

f:id:hanamichi_sukusuku:20210216192046p:plain

TF-IDFでの単語の重要度を考慮した形でのデータになっている。

 

データの保存

pickle.dump([y, x], open('text/genre.pickle', 'wb'))
tfidf.save_dic('text/genre-tdidf.dic')
print('ok')

pickle.dump()でラベルデータ、TF-IDFベクトルに変換したテキストデータをtextディレクトリにgenre.pickleという名前のファイルを作成し保存。

tfidf.save_dic()では引数に指定したパスに単語辞書、テキストをIDで表現したデータ、全文章での単語の出現頻度のデータ(一つのファイルで複数回同じ単語が出現しても足し合わせない。一度でも複数でもその単語をキーとする値は1)を保存する。