AWS Docs の単語を TensorFlow projector で可視化してみた

AWSは自身のサービスドキュメントをOSSで公開しています。[github/awsdocs](https://github.com/awsdocs) 

自社のメイン商材がAWSであることもあって、このドキュメントの情報は利用価値が高いと以前から注目しておりました。今回はこのドキュメントを利用したQA Botなど、応用タスクの元となるコーパス構築を主目的とした埋め込み表現の獲得を行いました。

awsdocsに含まれる全てのレポジトリに含まれる段落要素からごく簡単な（ストップワード除去を伴う）形態素解析を実行し、抽出した単語から単語埋め込み表現（分散表現とも呼ばれたりするアレです）を獲得、可視化してみました。

抽出した結果は今ひとつなんですがとりあえずキリのよいところまで来たのでごく簡単にレポートしてみます。

# 成果物

こちら [https://projector.tensorflow.org](https://projector.tensorflow.org/?config=https://s3-ap-northeast-1.amazonaws.com/awsdocs-word2vec.hassaku.net/projector-config.json)

単語埋め込み表現のデータとして使用したのはこちら。

- [Tensorflow Projector - metadata](https://s3-ap-northeast-1.amazonaws.com/awsdocs-word2vec.hassaku.net/awsdocs-meta-10000.tsv)
- [Tensorflow Projector - vecters](https://s3-ap-northeast-1.amazonaws.com/awsdocs-word2vec.hassaku.net/awsdocs-meta-10000.tsv)

一例としてgifアニメーションとして録画したやつがあります。140MBくらいあるのでこの場で表示させるのは差し控えますが、こちらも合わせてシェアします。

[awsdocs-embedding-projecter.gif](https://s3-ap-northeast-1.amazonaws.com/awsdocs-word2vec.hassaku.net/awsdocs-embedding-projecter.gif)


# やったこと

まずはデータ抽出

1. [github/awsdocs](https://github.com/awsdocs) の全てのレポジトリをclone
2. レポジトリごとに繰り返す：
    1. レポジトリに含まれる全てのmarkdownを抽出
    2. "markdown" と "BeautifulSoup" を用いてパラグラフ要素のみを抽出
    3. パラグラフ要素のテキストをnltkを使って単語分割
    4. markdownのファイル名ごとでラベル付けして単語リストからなる「ドキュメント」を生成

次に、jupyterを使ってword2vecのモデル構築を行いました。

1. gensimを使ってword2vecモデルの構築
2. メタデータ(単語ベクトルに対応するラベル)と単語ベクトルを書き出したtsvを生成、S3(website hosting) にデータをアップロード
3. TensorFlow word embedding projector の設定ファイルを記述 (project_config.json) 
4. [projector.tensorflow.org](https://projector.tensorflow.org/) に2,3で生成したファイルをアップロードし、設定ファイルを読み込ませる

形態素解析のところを少し補足すると、nltkが持っている標準(?)のストップワード集、およびいくつかの簡単な記号(&など)の除去、あとドキュメントに「数字とコロン」だけからなる文字列が結構抽出されていたでそれらの正規表現、こいつらを全体のストップワードとして除去の対象にしています。

# タスクの実現方法・実装に関する情報

シェアできる状態にあるものを追記していきます。

## awsdocs 配下のレポジトリを取得

git clone で行いました。レポジトリは多数あるので、それらを全て取得するために簡単なワンライナーを書いて済ませています。

> github clone all repositories in organization

あたりで検索するといくつか出てきます。私は[こちら](https://gist.github.com/caniszczyk/3856584#gistcomment-1791448) を参考にしました。


# 所感

ぱっとみの所感は結構単語抽出にノイジーなものがたくさんあるなという印象でした。もうちょっとスクリーニングしたい。

ドキュメント自身のメタデータとなる情報もほぼ削ぎ落としているので、そのへんは考慮したいなとも思います。例えばURLのリンク関係なんかは情報量がありそうかつ今回落とした部分なので、グラフ的なアプローチの何かをやるならばそういう情報も必要になってくるのかなと。

次アクションとして以下のようなことを考えています。

- 自社の Tech QAチャンネルのポストに対して、「質問 or 回答かどうか」のフラグや質問トピックのタギングなどのアノテーションを行う
    - 生データをそのまま手作業で扱うのは工数と苦痛が半端ないので、アノテーションツールの選定もしくは開発もやる
- 今回作ったawsdocsのコーパスと翻訳APIを使って、Slackの任意のポスト（を英語翻訳して形態素解析したデータ）から、類似度の高いAWSドキュメントを推薦する
    - ES使えば機械学習的な要素なしでもできる
    - ただしAWSサービスの軸でマッチしてもあまり応用タスクとしての意義は薄そう。問題設定自体がイマイチっぽいのでなにかしら工夫は必要
    - （↑は、質問する時点で当事者からすればジャンルは自明であるケースがほとんどと考えられるので）

結局問題設定ありきかなという感じはしています。

# さいごに

TenfowBoardクッソ便利ですね。今回も利用しましたが、データをupすれば可視化を公開できるようにWebアプリが公開されていたのが非常に助かりました。可視化にかける時間を大幅に節約できました。本当はローカル環境で可視化やりたいのですが、Projectorのローカルインストールはなんか詰まってしまったのでいったん諦めました。結構頻発している問題のようです。。。TensorFlow自体にも慣れていきたい。

まだ応用タスクの問題設定がはっきり見えてないこともあり、ストップワードの定義や抽出すべき品詞などを含め、どのようこのデータを活用するのかは試行錯誤の余地だらけだと感じます。コーパスの構築が鉄板かなとは思いますがいかんせん応用タスクがまだ定まらないので次はそちらの考察を進めたいですね。

本当は自社Slackのtech QAチャンネルから抽出したデータに対する類似質問（あるいは近しいドキュメントリンク）の提示をやりたいのですが、回答生成に関する理論がまだまったく理解できておらず今後どうしていくかは不明です。

ソースなどは特に公開準備できてません。現時点で公開の目処はないです（できれば整備して公開できたらいいなとは思ってます。。）。