はじめに
今回の記事では自然言語処理を用いて、日本語の文章を分類する方法をご紹介します。
具体的にはDov2Vec、Fasttext、AzureMachineLearningのAutoML機能を使用して分類タスクを解かせます。
目的
社用のメールアドレスに届く数多くのメールから「重要な情報」をピックアップしたいとします。
送信元のメールアドレスでの振り分けなどが考えられますが、それだけでは弾ききれないメールや、ユーザ登録する必要のあったサイトから送られてくる広告など、業務に関連を持たない不要なメールなども含まれてしまいます。
そこで、以下のようなシステムを構築しようと考えました。
特に重要だと考えられるメールを自動でフラグ付けすることで、業務改善を行います。
このような自然言語を扱う問題は単純なアルゴリズムのみで解決することは難しいため、AIを活用します。
※1.本記事はあくまで実装方法の一例を提示するものです
※2.100%の精度を出すことは難しく、重要な情報を見逃してしまった際の運用などの精度に関する問題は今回は考慮しないものとします
提案手法
前提
以前に書いた記事ではWord2Vecを用いて単語をベクトル化し、ベクトル化した単語をK-means法を用いてクラスタリングしました。
今回もこれと同じ考え方でAIタスクを解かせていこうと思います。
まず、実現する入出力は以下の通りです。
入力
* メールアドレスの文章出力
* 重要な文章かそうでないかのフラグ(0/1)
この入出力を直接に結び付けることはできません。
自然言語をコンピュータに理解させるためには、数値情報であるベクトルに変換してあげる必要があります。
数値に変換することさえできれば、その後の処理は決定木やランダムフォレスト、ニューラルネットワークなどの各手法によって「分類問題」として解かせることが可能になります。
具体的な手法
文章のベクトル化
前回の記事では単語をベクトル化する「Word2Vec」をご紹介しました。
今回のように任意長の文章をベクトル化するにあたっては、「Doc2Vec」と「FastText」の2手法を選択しました。
いずれも文章を任意の次元数のベクトルに変換することができます。
次元削減
自身でモデルを作成する場合は任意に調整が可能ですが、ネット上から既存の学習済みモデルを使用するような場合は、ベクトルの次元数を合わせてあげる必要があります。
今回はPCA(主成分分析)を用いて任意の次元数に調整を行うものとします。
例として、仮に自然言語から300次元のベクトルが得られるモデルがあったとします。 出力されたベクトルに対してPCAで事前に訓練したモデルを通すことで、特徴を可能な限り捉える形で任意次元のベクトルに次元削減します。
文章の2値分類
重要なメールかそうでないかのフラグは、日本語の文章に対して事前に人間が付与します。
上記で得られたn次元のベクトルと、付与したフラグを使って学習を行います。
n次元のベクトルを2値分類する手法は数多くありますが、今回はAuto MLによって最適な手法を選択しようと思います。
Auto MLとは複数の機械学習モデルやパラメータを自動選択して、最良のモデルを抽出してくれる機械学習手法の一つです。
今回はMicrosoft Azure Machine Learningのサービス「Automated ML」を用いてモデル選択を実施します。
こちらのサービスを使用する理由については後述します。
精度評価
精度評価における課題
2種類の機械学習手法を通すことで自然言語の分類を実現しますが、このような場合は評価が非常に難しくなります。
結果として分類することは可能ですが、精度が悪いことが分かっていても、入力はベクトル化モデル(Doc2Vec or Fasttext)を通して算出されたベクトルしか入力することができないので、下記の問題を切り分けて考えることができません。
- 自然言語の正規化・形態素解析など前処理の問題
- 文章ベクトル化モデルにおける問題
- ベクトル化された文章を分類するモデルにおける問題
- etc
評価手法
各モデルを訓練した後テストデータで精度評価を実施することは可能です。
イメージとしては以下の表をAccurecy(正解率)などで埋めていく形です。
要件によって適合率(Precision)を採用するなど指標を変更しますが、マトリクスの中で最も評価指標が良かったモデルを採用することで最適なモデルの組み合わせを選択できます。
これには一つ問題があり、これらのモデルを全て訓練すると非常に手間がかかってしまいます。
上記の表の場合は16個のモデルを訓練する必要があります。
そのため、分類問題のモデルについてAutoMLを使用します。
AutoMLでは学習データに対して最良のモデルを提示するようになっています。つまりは上記のメトリクスを横軸に対して自動で埋めてくれることと同義なので、結果的に最良スコアが自動選択できることになります。
学習に使用していないテストデータを別途用意して評価を実施します。
使用する環境
PCスペック
OS: Windows10
メモリー: 32GB
バージョン情報
Python: 3.7.7
fasttext: 0.9.2
gensim: 4.1.2 ※
spacy: 3.2.4
sklearn: 0.22.2.post1
※Wikipedia Dov2VecがGensim3.7.0でしか動かないため、ベクトル化時のみ3.7.0にバージョンダウンしました
外部モデル
- Fasttext wiki wordvectors (300 dim)
- Doc2vec 日本語wikipedia dbow300d (300dim)
使用データ
学習用データセット
- 業務メール
- 業務メールのデータセット 665件
- フラグ内訳
- 必要フラグ:171件
- 不要フラグ:494件
- 定型文内訳
- 定型 :415件(うち重複361件)
- 半定型:199件
- 非定型:51件
- フラグ内訳
- 業務メールのデータセット 665件
テスト用データセット
- 業務メールのデータセット 672件
- フラグ内訳
- 必要フラグ:194件
- 不要フラグ:478件
- 定型文内訳
- 定型 :344件(うち重複303件)
- 半定型:228件
- 非定型:100件
- フラグ内訳
※完全に一致するメール本文を「定型」、半分以上内容が一致するメールを「半定型」、それ以外を「非定型」とする
処理概要
前処理(正規化、形態素解析)
学習の際、メール本文に対して以下のような前処理を実施します
- 文字の正規化
- 全角->半角変換、半角カナを全角に統一するなど
- こちらのリポジトリを参考にしました
- Lemmaの適用
- 学習データ数が少ないことから、特徴を残したいために変換を行わずに実施しました
- 重複する定型文の削除
- 文字列の置き換え
- URLの正規化
- http://~~~~~ -> <URL>
- 数値
- 0 -> <数値>
- 100 -> <数値>
- 人名
- 田中太郎 -> <名前>
- 田中 -> <名前>
- 太郎 -> <名前>
- URLの正規化
日本語文章のベクトル化
以下の4モデルで実施しました
- 業務メールの学習用データセット
- Dov2Vec 50次元
- FastText 50次元
- Wikipediaデータセットで作成されたモデル
- Dov2Vec 300次元
- PCAで50次元に削減
- FastText 300次元
- PCAで50次元に削減
- Dov2Vec 300次元
文章ベクトルの分類
Automated MLによって自動的にアルゴリズム・パラメータの組み合わせから最良のモデルを決定します。
以下のスクリーンショットが実行結果の一例です。
AutoMLでは学習の際に評価指標を任意に選択することができます。
今回は適合率を重視するため、加重平均適合率を選択して学習を行わせました。この値が最も高い値を示すモデルを最良のモデルであると仮定します。
ここで作成したモデルはACIやAKSでデプロイすることも、ダウンロードしてローカル環境で使用することもできます。
この辺りは以下のリファレンスを参考にしてください。
結果
評価は正解率と適合率で比較することで行います。
今回はDoc2Vec,Fasttextのモデルがそれぞれ2つずつあるため、合計4つの評価結果を比較検討します。
全データに対しての正解率・適合率は以下の通りです。
最も高い値を赤字で、低い値を青字で表現しています。
また、定型・半定型・非定型それぞれの正解率・適合率は以下の通りです。
いずれのモデルも性能に大きな差はない結果となりました。
これより、ベクトル化器の性能によってデータ数とアルゴリズムによって大きな差が出ないことが分かりました。
また、より複雑な特徴を持っている非定型文ほど適合率が低い結果となりました。
半定型文については80%程度の適合率を示しており、特徴を捉えていることが分かります。
まとめ・今後の方針
本記事では自然言語処理から分類問題を解く方法について手順の解説を行いました。 また、実際のデータを用いて学習と評価までを実施しました。
今回の試行の結論としては以下の2点となります。
- ベクトル化モデルの性能によって推論結果に大きな差はつかなかった
- 非定型文の適合率は50%程度と低かった
現在の課題としては、非定型文の学習データを増やして分類モデルの性能を上げることとであると考えます。
以上です。