質問: 文章の分類方法のメリットデメリットを教えてください。 ■インプット ・200文字程度の複数の日本語文章 ・分類先(恋愛、ホラー、サスペンスなど、予め10個程度定義) ■アウトプット 文章A -> 恋愛 文章B -> サスペンス 文章C -> ホラー 、、、 ■分類方法 ちょっと調べたところ下のような方法が、 機械学習周りが素人の自分(ただのRailsエンジニア)には簡単に実装できるという観点でいいのかなと思いました。 下記2点のメリットデメリットをお聞きしたいです。他にもよい方法があれば教えてくださると助かります。 1. 文章を形態素解析->TF-IDFで特徴語を抽出しそれをタグとする-> タグを手動で分類(恋愛、ホラー、サスペンスなど)。TFは自分で計算して、IDFは汎用的なものをつかうといいなど聞いたことが有ります。 2. ナイーブベイズ分類で分類(よく知らないのでざっくりですみません) ■補足 Railsで実装しているので、gemがあるとうれしいです
回答: TF-IDFを使うメリットは、 * それを計算するためにライブラリ(scikit-learn等)が使えるので、簡単に特徴量設計できる。 * これらの特徴ベクトルを使って訓練されたモデルが係数や特徴量の重要性を保持している場合、「予測にとって重要だった単語はどれか」といったことを見ることができる。 * ロジスティック回帰、ナイーブベイズ、決定木といった単純な機械学習アルゴリズムを適用できる。 という点があります。(他にもあると思いますが、思いつくものとして挙げました) ナイーブベイズを使うとのことなので、特徴量の重要性は以下のリンクの方法で取得可能です。 railsから使いたければ、railsからpythonを呼び出すのが比較的簡単です。 デメリットとしては、 * データが増えて単語が増えると特徴ベクトルの次元が増え、メモリ効率が悪い。 * 何らかの潜在的な情報(単語Aと単語Bは類似しているといった情報)は直接持っていない。 * 新しいデータが持っている新しい単語に対応するために学習を追加する場合、特徴ベクトルの再計算コストがかかる。 のような点があります。(他にもあると思いますが、思いつくものとして挙げました) 他の方法をあげるなら、以下のような方法もあります: * word2vecやtensorflow-hubのnnlmやuniversal sentence encoder, laserといったものを使って文章をtf-idfよりも低次元のベクトルで表してから、それをkerasで作成されたモデルなどに入力して学習する。 * sentencepieceを使って当該の文章セットから訓練されたBPEで、各文章をサブワード分割し (それらのサブワードをIDに変換して)、kerasで作成した典型的な文章分類モデル(Embedding, LSTM等のレイヤーからなるモデル)へ入力して学習する。 * BERTのような事前学習済み言語モデルをファインチューニングする。