キカガク(KIKAGAKU)で「テキスト分類」を学ぶ

Photo by Icons8 Team on Unsplash

今回は、キカガクで「テキスト分類(TensorFlow)」を学んだ。

学習内容

自然言語は今までのデータとは異なり、固定の長さのデータではなく、データごとに長さが異なるため、学習の際には固定の長さの数値に落とし込む必要がある。

文章を品詞ごとに分割する形態解析、単語を数値化する手法の一つである Bag of Words を使って自然言語の特徴量変換を行う。

MeCab で形態素解析

文章を単語毎に区切る方法のことを 形態素解析 (morphological analysis) と呼ぶ。
MeCab を使用しての形態素解析を行う。

形態素解析の実装

Tagger クラスをインタンス化する。
-Ochasen は形態素解析の出力方法のこと。
文章の分割には parse() メソッドを使用する。
分割されたテキストデータはエスケープシーケンスを取り除き、単語ごとに抽出を行う処理を施す必要がある。

名詞の抽出

入力変数は各記事(文書)、目的変数はニュースサイト名(ラベル)とする。
各記事(文書)を数値化し、ニュースサイト名に分類する。

この問題設定の場合、名詞が特徴となるため、形態素解析で名詞を抽出する。
特定の文字列でテキストデータを分けるときは、split() メソッドを使用する。
品詞が名詞の単語のみを抽出し、リストに格納する。

自然言語の特徴量変換

基礎的なテキストデータのエンコーディング方法(ベクトル化)の種類

  • Bag of Words (Count encoding)
  • tf-idf
  • One-hot encoding
  • Word2Vec

Bag of Words の概要

Bag of Words (以下 BoW)とは、単語の出現回数によって単語を数値に変換する方法。

BoW の実装

BoW の実装は scikit-learn を用いる。
scikit-learn を用いる場合、テキストデータは単語ごとに半角スペース区切りになっている必要がある。

join() メソッドを用いることでリストの要素を繋げられる
エンコーディングは CountVectorizer クラスを使用する。
インスタンス化後に fit_transform() メソッドを使用すると、単語毎に ID が割り振られ、ID ごとの出現回数を元にベクトル化が行われる。
vocabulary_ 属性にはエンコーディングされた重複なしの単語とその ID を確認できる。
エンコーディング後の数値は toarray() メソッドを使用して取得する。

文書分類の実装

実際のデータセットを用いて、文書分類の実装を行う。

入力変数・目的変数の作成

テキストファイルごとに BoW を用いてエンコーディングを行う。
また、テキストファイルごとにどのカテゴリの文書なのかを示す目的変数の作成も行う。

glob を用いてファイルの読み込みを行う。
取り出したこの 1 テキストファイルが入力変数になる。
このテキストデータからこの記事がどのカテゴリに属するのかの分類を行う。

各ディレクトリに対応する要素番号を分類に使用するラベルとして使用する。
enumerate() を使うことで、for 文を用いて繰り返しを実行する際に要素番号も併せて取得することができる。
全てのディレクトリ・テキストファイルを読み込み、同時にラベル付けも行う。

文章から名詞のみを抽出

前に作成した名詞抽出用の関数を使用して、文書全体で使用されている名詞を全て word_collect というリストに格納していく。

それぞれのテキストデータに対し名詞抽出を行う関数を適用し、リストに追加する前に半角スペース区切りの文字列に変換を行う。

BoW に変換

全ての名詞を使用して辞書を作成した場合、使用される単語量が膨大になる(約 5 万単語)ことが想定されるため、エンコーディング時に引数 min_df を指定し、出現頻度が指定した値以下のものは取り扱わない設定を行う。

モデルの定義と学習

ニューラルネットワークを実装する。
モデルの定義・学習・評価を行い、文書分類がどの程度の精度で行うことができているのか次の手順で確認する。

  1. 学習用データセットとテスト用データセットに分割
  2. モデルの定義
  3. モデルの学習
  4. モデルの評価

ソースコード



実行結果

Fig.1 損失

Fig.2 正解率


Posted in  on 7/30/2020 by rteak |