アスキーアート、いわゆるAAとは、広い意味でいえば文字で作られた絵です。 元々は95個の表示可能ASCII文字を使用したテキストアートのみを指していましたが、 技術の発展とともにパソコンで使える文字も増え、今ではAAを作ろうと思えば何万種類の文字が使えます。
AAは文字で作られているので、普通の文章と区別するのは意外と容易ではありません。 特にAAがよく使われているインターネットでは、言語とアスキーアートの境界線が微妙なケースが多いです。 文字の種類の多さとインターネットの表現の幅広さを考慮し、 手動でAAを識別するルールを作るのは困難だと思われます。
今回は、ニコニコ動画のコメントを中心にマルチラベリングのタスクを行いました。 ラベルはAAを含む4種類を定義し、与えられた文章に対してラベルを予測するニューラルネットワーク「AAちゃん」を開発しました。
モデルを読み込んで任意の文章を入力してみてください。 「AA置き場」や「AAコピペ」を検索してみたら面白いものがあるかもしれません。
解析結果では、それぞれのラベルの確率によって文字の色が変わります。 結果が出たら、下のスライダーでコントラストを調整できます。 一番確率が高いラベルの色が明るくなります。
AA
顔文字
絵文字
テキスト
Suzuki[1]が複数行の入力からAAを含む行を検出する手法を提案しました。 しかし著者が使った特徴量は一行以上の文章に対して計算したものであり、 今回の文字単位のタスクには適していませんでした。 さらに、今回のタスクでは、コメントは独立したユニットとして扱っており、 複数行の長い文章から数行を検出する著者のタスクとは趣旨が違いました。
AAちゃんは4つの「テキストカテゴリー」を探し出せるように学習しました。テキストカテゴリーは以下のように定義しました:
と、今回の課題にあたって定義しました。 また、この記事ではあまり言及しませんが、5つ目の「弾幕」というカテゴリーもあります。 しかし定義が曖昧かつ他のカテゴリーと重複する部分が多かったので、最終的に無視することにしました。
::+。゚:゜゚。❤ ❤ ❤ ❤:*:+。::。;:: .:*:+;❤ ❤ ❤。゚:。*. 。゚:゜❤ ❤:゚。゚ 。 ゚、❤ ❤・*゚: *:+。゚’❤ ❤、+。゚:* ゚:゚*。:゚+:。❤ ❤。。゚:゜゚。*。 +。::。゚: +。:。゚+❤ ❤。゚:゚*:。:゚+:。*: :*゚。:。*:+。゚*:。:゚:*+。❤:*:゚:。:+゚。*:+。::。゚+:
□□□■□□□□□□□□□□□□□□■□■□□□□□□□□□□□□□□□■□□□□ ■■■■■■■■■□□■□□□□□■■□■□□■■■■■□□□□□□□□■□□□□ □□□■□□□□□□□■□□□□□■□□□□□□□□■□□□□□□□□□■□□□□ □□■■■■■■□□□■□■■■■■■■□□□□□■□□□□□□□□□□■■■■■ □■□■□□■□■□□■□□□□□■□□□□□□■■■■■□□□□□□□■□□□□ ■□□■□□■□□■□■□□□□□■□□□□□■□□□□□■□□□□□□■□□□□ ■□□■□■□□□■□■□□□□□■□□□□■□□□□□□□■□□□□□■□□□□ ■□□■□■□□□■□■□□□□□■□□□□□□□□□□□□■□□□□□■□□□□ ■□□■■□□□□■□■□□□□□■□□□□□□□■■□□□■□□■■■■■□□□ □■■■□□□□■□□■□□□□■□□□□□□□■□□■□■□□■□□□■□■■□ □□□□□■■■□□□□□□■■□□□□□□□□□■■■■□□□□■■■□□□□■
♫彡。.:・¤゚♫彡。.:・¤゚♫彡。.:・¤゚♫彡。.:・*゚ *・゚゚・*:.。..。.:*゚:*:・* ✩ * ・* ✩ * ・*゚・*:.。.*.:*・゚.:*・゚* ☆彡.。.:*・☆彡.。.:*・☆彡.。.:*・・* ✩ * ・* ✩ * ・* ☆彡.。.:*・☆彡.。.:*・☆彡.。.:*・゚・*:.。.*.:*・゚.:*・゚* ☆.。.:*・°☆.。.:*・°☆.。.:*・°☆.。.:*・°☆*:.. ゚*。:゚ .゚*。:゚ .゚*。:゚ .゚*。:゚ .゚*。:゚゚*。:゚ .゚*。:゚ .゚*。:゚ .゚*。:゚ .゚*。:゚ ☆.。.:*・°☆.。.:*・°☆.。.:*・°☆.。.:*・°☆*:.. ☆彡.。.:*・☆彡.。.:*・☆彡.。.:*・*・゚゚・*:.。..。.:*゚:*: ゚・*:.。.*.:*・゚.:*・゚*・* ✩ * ・* ✩ * ・**・゚゚・*:.。..。.:*゚:*: ☆.。.:*・°☆.。.:*・°☆.。.:*・°☆.。.:*・°☆*:.. ♫彡。.:・¤゚♫彡。.:・¤゚♫彡。.:・¤゚♫彡。.:・*゚
(`・∀・)
( *´ω`* )
ヾ(๑◕▽◕๑)ノ
💩
☂
🙄
ニコニコのコメントを対象にしたAAデータを作成しました。
まずはニコニコ動画のコメントログ(2007年〜2018年)から数十万件のコメントをサンプリングしました。 収集した各コメントに対して、1つ以上のラベルを付与しました。 例えば、以下のようなコメントは
キタワァ*・゜・*:.。..。.:*・゜(n‘∀‘)η゚・*:.。. .。.:*・゜・* !!
キタワァ
というテキストもあり、(n‘∀‘)η
という顔文字も含む上、間にAAに当てはまる装飾もあることから、aa,kaomoji,text
という3つのラベルを振りました。
そしてそれらのラベルがコメントのどの部分に対応しているかの情報はデータセットには含まれていません。
今回の実験ではコメントとラベルからどこにそのラベルがあるかを学習します。
データを大量に作るために、モデルを学習しながら半自動で作りました。 まずは少量のデータに手動でラベルをつけて、そのデータで簡単な分類モデルを学習しました。 そのモデルで新しいデータのラベルを予測して、モデルが自信がない予測だけを手動で直しました。 こうして増やしたデータでさらに強いモデルを学習して、この過程を繰り返して数十万コメントのデータを作りました。
モデルを学習したデータは事故で消えてしまいましたが、作り直したデータは以下のリンクからダウンロードできます。
上記のファイルはデータが入ったall_annotated.tsv
と説明書のREADME
の2つのファイルが収納されているzipです。
データ形式は以下の通りです:
id group_id vpos command message label 0 sm8896-0 0 shita pink かーたぐーるまー text 1 sm8896-0 0 None うどんげは俺の嫁 text 2 sm8896-0 0 None されど鈴仙は俺の嫁 text 3 sm8896-1 0 None (´・ω・`)こんなえがかきたい。。。 kaomoji,text ...
それぞれのコメントに一意のIDが振られ、本文とテキストカテゴリーに加え、
今回の実験で使われなかった項目もいくつかあります。vpos
はコメントの再生時間でcommand
は色、位置などのコマンドです。group_id
とは、動画IDと動画内のグループ番号から構成されるIDであり、
複数コメントをまたぐAAをまとめられる様に用意しました。
基本的に、同じラベルを持って連続しているなら同じグループと見なされるので、
連続しているテキストも内容に関わらずグループ化されてしまうので要注意です。
AAちゃんは上の図の通りの畳み込みニューラルネットワークです。 他のニューラルネットワークでもよくある「アテンション」(注意機構)を使用していますが、 少し変わった使い方をしています。
アテンションは普段、ネットワークの一部の入力に重みをつけるために使います。 例えば入力が文章の場合、1つの入力はいくつかの「文字」や「単語」という要素から構成されます。 しかし、その全ての要素が同じくらい重要なわけではありません。
アテンションは重要であろう要素に高い重みをつけて、そこにネットワークを注目させます。 どの要素が重要なのかは、明示的にネットワークに教えません。 ネットワークが与えられた課題を解く過程で、自然にアテンションの重みも学習できると思われます。
実際の実験結果を見ると、確かに人間が見ても納得できるような重みを学習してくれるケースが多いです。 例えば機械翻訳の場合、"l'homme"(その男)を出力するとき、 原文の"the man"のアテンション重みが他の単語より高くなります[2]。 画像解析の場合、写真に犬が写っていると判断するとき、犬がいる部分に高い重みを置きます[3]。
しかし同様に解釈しにくいケースもあります。 Clarkら[4]では複数のアテンションを使った言語モデルを解析しました。 その結果、文法の規則に沿ったアテンションもあれば、 句読点にほとんどの重みを置いた、一見意味がなさそうなアテンションもありました。 JainとWallace[5]でさらにアテンションの解釈性について疑問を述べました。 なにせ、予測さえ正しければ、アテンションの重みが人間にとって解釈可能である必要性がありません。
そのためAAちゃんでは、アテンションは重みとして使いません。 代わりに、アテンションの出力をほぼそのまま予測として使います。 各ラベルにそれぞれのアテンションを用意して、 各文字のアテンション出力をその文字がそのラベルである確率として解釈します。
学習時、モデルに与えられた課題は「それぞれのテキストカテゴリーの存在を予測せよ」です。 つまり、このコメントにどのラベルが振られているかを当てます。 アテンションの出力はそれぞれの文字がそれぞれのラベルに当てはまる確率なので、 ほぼそのままラベルの存在の予測にも使えます。 こうすることで、ある程度は解釈可能なアテンションを保証します。
普通のアテンションと同様、どこに注目すべきかはモデルに任せています。 ラベルの存在の予測という課題を通して、ラベルの場所も予測できるようになると期待しました。 その結果は上のデモで確認できます。 どうでしょう?それぞれのテキストカテゴリーの場所をだいたい当てることができましたか?
今回はAAなどのカテゴリーの存在と場所を予測できるニューラルネットワークを開発しました。 学習データに文字位置レベルでのアノテーションをしませんでしたが、 アテンションを使ってそれも学習できました。 データも公開してありますので、興味のある方は遊んでみてください。