テキスト分析の大通り#10: ナイーブベイズテキスト分類、SQL編
今回は、前回作成したBOW, TF-IDFの指標化された文書データを用い、ナイーブベイズのテキスト分類モデルを構築していきます。文章に与えられている「若林」、「春日」のカテゴリーを判別するモデルを、学習用データを用いて作成していきます。
BOWを利用したモデル構築
まずは、モデル(テーブル)を作成するためのSQLを以下に示します。投入するデータは前回のBOWならびにTF-IDFの結果から、BOWの結果の方を利用しています。
src内ではまず、結果変数であるcatと、各単語(word)の総当たりを作成しています(a4)。そしてcatごとのbow集計を行い(a5)、それをa4に横付けします。また、単語のユニーク数をカウントしておきます。catごとの単語をカウントしているように見えますが、総当たりのため結果はともに同じ値となります。
次のprobbでは、各単語(tokenにリネーム)のcat(categoryにリネーム)に対する発生確率を計算します。分子にはbowに1を足した値、分母にはcatごとのbow合計にsrc内で計算した単語の発生件数を足した値をセットして、確率算出しています。
続いてprr。事前確率を計算します。token内に埋め込む文字列ASTER云々は決め事で、おまじないのようなものであると思ってください。カテゴリー内のbowの合計値を分子、全カテゴリーにおけるbowの合計値を分母にして事前確率を計算します。最終的にこのprrではカテゴリー分の行が作成されます(今回は2つのカテゴリー)。
最後のクエリーでは4つのブロックをunionで併合しています。最初は初期確率で、prrにおける確率合計値を1行でセットしています。token部分の文字列は決め事です。category部分には多項分類である旨を埋め込んでいます。確率は両カテゴリーの合計なので、1となるはずです。2番目はprrで計算した事前確率をそのまま持ってきています。3番目はtoken単位での確率です。ただしこれには各カテゴリーで出現しなかったtokenの確率は含まれておらず、最後の4番目にそれをセットしています。
作成されたモデルテーブルは以下のようになります。
文書数は若林、春日で同じですが、所属している単語の関係で、事前確率は若林の方が気持ち高いです。そしてこれは1件、0件だった単語に対して与えられた確率にも影響を与えています。各単語のカテゴリーへの所属確率は、カテゴリーにおいて単語が発生している場合のみで、それ以外の場合はMissing Tokenとしてまとめられた行でまとめられています。初期確率と事前確率を除き、カテゴリーに対する単語の確率の和(Missing Token部分は横持ちして歯抜けしている分をMissing Tokenにおける確率に掛け合わせる)は1になるようになっています。
BOWでのモデルを利用したスコア付与
続いてスコア付与です。SQLは以下。
これはTeradataが実装している、スコアリング用の関数を用いたSQLです。入力に2つのテーブル、すなわちモデルテーブルと、スコアリング用の入力データのテーブルを指定し、それ以外はパラメーターを与えるという単純なものです。若干ややこしいパラメーターがtopkですが、これは例えばカテゴリーが2つで、両方のカテゴリーに属するスコアを出したい場合には2、トップスコア、つまり判別結果だけでよい場合は1を与えます。カテゴリーが3つなら、3をセットすると各カテゴリーに属するスコアを出します。
そしてこれによる出力がこちらです。面倒くさがって学習に用いたデータも併せてスコアリングさせていますが、17番以降も適切に分類されているようです。正解は1から8までが若林、9から16が春日、17,18が若林、19,20が春日です。スコアとして表示されているのは対数尤度で、マイナスの場合、絶対値の小さい方が値が大きいです。
TF-IDFでのモデリング、スコアリング
次に、BOWではなく、TF-IDFを入力に用いた場合の学習をしていきます。といっても処理の流れは前述とほとんど同じで、入力列のみTF-IDFに変えています。なので説明は割愛します。
続いてスコア付与。こちらもSQLはほぼ同じです。
出力。こちらも問題なく分類されているようです。
今回は以上です。次回は同じ流れ(BOW, TF-IDFからナイーブベイズテキスト分類)をPythonのライブラリであるScikit-learnを用いて実行すべく、もとの単語シーケンスデータにひと手間加えます。
(TeradataやPython、およびPythonライブラリのインストールや環境構築、辞書登録、参考にしたページ等は以下にまとめています)
///
#analytics #bow #tf -idf #ナイーブベイズ #text #nlp #データ #分析 #teradata #sql