東京在住ですが、なぜかグランフロント大阪で開催されたPyCon mini Osakaで登壇して来ました。
osaka.pycon.jp
前日から大阪に乗り込んでました。(久しぶりの大阪オフィスだった。)
スライド
発表内容は以下のスライドになります。
(画像がぼやけていてすまない・・・)
最初はCNNやTensorFlowの基礎的な説明をして後半からCharacter-Level CNNについて話しました。
Character-Level CNN
Character-Level CNNのところを説明します。
今回は、テキストからネガティブかポジティブかを判断するタスク(いわゆる感情分析のネガポジ)をこなす分類器を作ることを考えます。
結果から言うと、オリジナル論文*1では上手く行かずに、違うアーキテクチャで上手く行きました。
なぜ文字レベルなのか?
文字レベルで自然言語処理をするというのは珍しいと思いますが(大体は単語レベルで区切る)、そのメリットは
・前処理がいらない(日本語なら分かち書きが必要ない)
・タイポやスペルミスが多い文書でも有効(レビュー,チャットなど)
・文書じゃない物にも適応できる(URL, Tex, プログラミングコードなど)
などが挙げられます。
論文
上手くいったアーキテクチャですが、
Joshua Saxe, Konstantin Berlin: eXpose:A Character-Level Convolutional Neural Network with Embeddings For Detecting Malicious URLs, File Paths and Registry Keys(https://arxiv.org/abs/1702.08568)
を参考にしました。
内容はCharacter-Level CNNを使って悪意あるURLやファイルパスを検出するという内容です。
かなり丁寧に書かれていてわかりやすい論文でした。
構成・アーキテクチャ
処理の流れとしては
①文字を低次元に埋め込む
②カーネルサイズが違う複数のCNNに入れて特徴を出力
③特徴を一つに結合
④全結合層に通して分類
です。
①の埋め込みは、(文字 × 埋め込み次元)行列を埋め込み層として用意して、対応する文字の行ベクトルだけを更新します。
②については論文に書いてる図を借りると次のようになります。
様々なWindowで文字のCooccurrence(共起性)を学習してると考えられます。
③特徴を一つに結合、④全結合層に通して分類はそのままの意味です。
TensorFlowで実装してTensorboardのグラフに書くと以下のようになります。
日本語のデータセット
日本語のデータセットとして最近公表されたばかりのchABSA-dataset*2を使いました。
上場企業の有価証券報告書をベースに作成されたデータセットで、特徴としては「何が」ポジティブ/ネガティブだったのかと言う情報を含んでいます。
これで、「何が」のネガティブとポジティブの数を比べて多い方を文書全体の感情としました。
その結果、訓練データとテストデータを合わせて2830文書が対象となりました。
誤字・脱字に対する強さ
面白いのがここからで、わざと誤字・脱字をしてちゃんとネガポジを判定できるか試してみました。
「増加傾向」を「加向」とか、「減少傾向」を「減向」にしても問題なく判定できています。
なので、ここでテストデータの文書の文字を適当な文字に変換した際にどのくらい精度が下がるのかグラフを書いてみました。
50文字をランダムな文字に置き換えても精度が8割以上あるのは驚きです。(1つの文書は大体300文字程度なので役1/6が適当な文字と言うこと)
これをMecabを使って単語レベルで区切ってCNNで学習させたword-level CNNでも試しました。
50文字も変えると精度は0.5なので全く判別出来てないことになります。
終わりに
カンファレンスで発表するのは初めてでしたが、発表練習をするのを忘れていたので時間配分がちょっと不安でしたが、まあまあ時間ぴったりに終わったのでよかったです。
カンファレンスは楽しかった。
コードはここに置いてます。
GitHub - Tdual/char_level_cnn: Character level CNN
ツイッターやっているのでフォローお願いします。
↓今すぐフォローすべきキラキラ アカウント
じゃあの。
*1: Xiang Zhang, Junbo Zhao, Yann LeCun: Character-level Convolutional Networks for Text Classification (https://arxiv.org/abs/1509.01626)