荷物持ちでも構わない

文系大学4年生からデータサイエンティストを目指して頑張りつつ、書きたいことを書きたいときに書きたいだけ書く、ルール無用雑記ブログ。

MENU

KHCoderのベイズ学習でツイートの属性を機能的/情緒的に分類した

以前、RとKHCoderを使ってSHARP公式ツイッターのツイートをクラスタリングする記事を書いた。

このときは「教師なし学習」による分類だったので、自分の思い通りのクラスターを作ることができなかったが、今回は、単純ベイズ分類器(ナイーブベイズフィルター)による「教師あり学習」に挑戦してみようと思う。

最終目標は、いろいろな企業公式アカウントのツイートを、「機能的なツイート」と「情緒的なツイート」の2つに分類すること。

「教師なし学習」で分類した前回の記事はこちら↓

www.messyer813.com

ナイーブベイズフィルターによる「教師あり学習」をやってみよう

前回の記事では、ウォード法による階層的クラスター分析を使ってクラスタリングした。

しかしこの方法だと、出てくる単語の頻度のみで分類されてしまうため、なかなか自分の思い通りのクラスターを作ることができない。

というのも、ウォード法による階層的クラスター分析は、いわゆる「教師なし学習」のため、分類の基準となるものを全く与えずにソフトに任せることになり、分析者の意向は全く反映されないからだ。

そこで今回は、単純ベイズ分類器(ナイーブベイズフィルター)を使って学習データを先に与えてやり、その学習データに沿ってツイートのクラス分類を行う、「教師あり学習」に挑戦してみようと思う。

今回も使うツールはRとKHCoder。

KHCoderについての解説は省くので、気になる人はこのブログの「テキストマイニング」カテゴリから過去記事を遡って読んでほしい。

Rでツイートを取得しKHCoder用に前処理を行う

以前の記事でも説明したことなのでこの辺の説明も省いていくけれども、今回も例によってRでSHARP公式のツイートをスクレイピングする。

このとき、n = 2000で指定しているはずなのだが、なぜか362件しか取得できなかった。

原因についての情報求む。

で、スクレイピングしたツイートをCSVで出力し、エクセルの正規表現検索アドインを使って余計なユーザーID(@〇〇〇〇)やURLなどを削除していく。

ここまでは以前の記事と同じ。

学習データ作成のためにツイートごとに機能的か情緒的かの分類をする

ここからが前回までとは違うところ。

教師あり学習によってクラス分類を行うために、まずは学習データを手動で作成してやる必要がある。

そのため、KHCoder用に前処理を行ったSHARP公式ツイートのデータに対し、ツイート一つ一つに対して、機能的か、情緒的か、その他(判別不能)の分類を手作業で行っていく。

ちなみにこのとき、機能的なツイートと情緒的なツイートの定義としては、

機能的なツイート = 商品やイベントの紹介など自社に関する情報を含むもの

情緒的なツイート = 広報としての機能は全くない、運用担当者の個人的なツイート

として分類を行う。

ツイートの文面だけでは内容がよくわからないものはその他に分類し、機能的な要素と情緒的な要素を併せ持つツイートは、機能的なツイートとして分類する。

そして、機能的なツイート=1、情緒的なツイート=2、その他=3として数字を割り振っていく。

その作業を終えてできたものがこれ。

f:id:messyer813:20180910125306p:plain

完全に主観による分類だが、手作業で学習データを作ってやる工程がなければ次に進めないのだから仕方ない。

 

そして、この学習データを、SHARPだけでなくタニタ公式アカウントでも同じように作成した。

f:id:messyer813:20180910125754p:plain

ちなみにタニタの場合もSHARPと同じようにn=2000で取得しているはずなのだが、なぜか58ツイートしか取得できなかった。

理由はよくわからない。情報求む。

KHCoderのベイズ学習機能を使って学習データを作成する

ここからがKHCoderの出番となる。

プロジェクトとしてまずはSHARP公式のツイートデータを開き、前処理を行う。

f:id:messyer813:20180910130036p:plain

 

前回はここからクラスター分析にかけていたが、今回はベイズ学習による分類を行う。

「ツール」→「文書」→「ベイズ学習による分類」→「外部変数から学習」を選択する。

f:id:messyer813:20180910130420p:plain

学習する外部変数として、あらかじめエクセルで割り振った番号を指定し、品詞による語の取捨選択は、否定助動詞と形容詞(非自立)以外すべてにチェックを入れる。

交差妥当化については正直理解できていないのだが、分類が3つなのでなんとなく3で指定する。

これで「OK」をクリックすると、KHCoderで学習データを作成することができる。

f:id:messyer813:20180910131031p:plain

するとこのような学習データが得られた。

正解率68.4%が高いのか低いのか、Kappa統計量とはなんなのか、ベイズの知識がほぼゼロの僕にはなんのこっちゃわからないのだが、とりあえずSHARP公式ツイートを使った学習データを作ることはできた。

タニタ公式のツイートを使って学習データのベイズ更新を行う

先ほどのSHARP公式ツイートを使った学習データ作成とほぼ同じ手順で、タニタ公式のツイートを使って学習データを作成する。

さっきと違うのは、タニタ公式による学習データを使って、SHARP公式で作った学習データを更新するという部分だ。

実際にやってみる。

f:id:messyer813:20180910131557p:plain

さっきと同じように外部変数から学習を選択し、右上の「既存の学習結果ファイルに今回の内容を追加」にチェックを入れる。

この状態で「OK」をクリックすると、今回の内容を追加する学習結果ファイルを選択する画面が出るので、さっきSHARP公式で作った学習結果ファイルを選択する。

 

f:id:messyer813:20180910131814p:plain

タニタの場合、こんな結果が得られた。

正解率81.5%と大幅に向上したのはベイズ更新の結果なのか、それともたまたまなのか、ベイズの知識がなさすぎてそれすらわからないが、とりあえずSHARPとタニタのアカウント2つ分のベイズ学習データをKHCoder上で作成することはできた。

作成した学習データを元にツイートの自動分類を行う

ここまでで学習データの作成はおしまい。

次は、作成した学習データを元にして、ツイートの自動分類を行ってみる。

SHARPとタニタのときは自分で機能的/情緒的/その他という分類を手作業で行っていたが、今回はその工程を省き、作成した学習データに基づいて分類させる。

そして、この自動分類には、タカラトミー公式アカウントのツイートを使用する。

タカラトミー公式のツイートも同様にn=2000で取得したところ、550ものツイートを取得することができた。

理由はさっぱりわからない。

 

Rで取得したタカラトミーのツイートをKHCoderで読み込み、前処理まで終わらせる。

f:id:messyer813:20180910132512p:plain

取得できたツイートが多い分、出てきた語数も多くなっている。

550ツイートも手作業で分類していたら日が暮れてしまうので、これこそベイズ学習による自動分類にかけるにふさわしいと言える。

 

ベイズ学習による学習データを用いて自動分類を行うには、

「ツール」→「文書」→「ベイズ学習による分類」→「学習結果を用いた自動分類」を選択する。

f:id:messyer813:20180910132823p:plain

するとこんな画面が現れるので、先ほどSHARPとタニタで作った学習結果ファイルを選択し、変数名を適当に決めて、「OK」をクリックする。

 

f:id:messyer813:20180910132959p:plain

そうすると分類結果が出力されるので、今作った「タカラトミー分類」という分類結果ファイルを選択し、「出力」をクリックして、CSVとして出力する。

 

すると番号だけの殺風景なCSVが出てくるので、分類結果の列だけをコピーして、タカラトミー公式のツイートデータにペーストしてやる。

結果がこんな感じになる。

f:id:messyer813:20180910133326p:plain

一部を切り取っただけだが、確かに最初に定義した通り、自社製品に関する情報を含むツイートが1(機能的)、どうでもいいツイートが2(情緒的)として分類されていることがわかる。

SHARPとタニタの2つのアカウントで作っただけの少ない学習データでも、なかなかの精度でツイートを分類することが可能なようである。

さらに言えば、このタカラトミーの分類結果も学習データとしてベイズ更新していくことで、どんどん学習の精度が高まっていき、思い通りのクラス分類ができるようになっていくはずだ。

ベイズの知識がなさすぎるのでどこまであっているかわからないが、とりあえずナイーブベイズフィルターを使うことで、分析者である自分の意向を反映した教師あり学習ができるようになった。

まとめ

テキストマイニング記事も4記事目となったが、ついに教師あり学習を習得した。

そろそろ機械学習屋を名乗ってもいいんじゃなかろうか。

以前にも書いたかもしれないが、最近僕が必死になってテキストマイニングと機械学習について勉強しているのは、卒論の研究でこれらの知識が必要になるからなので、これからもいろいろ知識を吸収してブラッシュアップしていきたい。

今のところ、一応ほぼ自分の想定通りの分類ができるようにはなったが、アカデミックな世界で通用するとは到底思えないので、正解率やKappa統計量などの意味もちゃんと勉強して、論文として形にできるように理解を深めていこうと思う。

続きはまたいつか知識がアップデートできたときに。