![見出し画像](https://assets.st-note.com/production/uploads/images/57094748/rectangle_large_type_2_a2c526006141f8a30de83a94c82f716b.png?width=1200)
【自然言語処理】アノテーションがぐっと楽になる! お助けツールprodigyについて
こんにちは。メディア研究開発センター(以下、M研)の杉野です。今回は、機械学習の教師データ作成のためには欠かせない「アノテーション」についてのお話です。ここでは特に、自然言語処理のアノテーション支援ツール事情や、私たちが実際に使っている「prodigy」というツールについて紹介してみたいと思います。
しんどいから、ツールが必要
機械学習におけるアノテーションとは、モデルを訓練するための教師データを作成する作業のことです。より良い精度のためにはできるだけ多くのデータが必要なので、例えば、テキストを正解・不正解に分類するような単純作業を大量にこなさなければなりません。でも、スプレッドシート上でテキストにポチポチとラベルをつけていくような作業を数千、数万件とやるのは大変すぎますよね。かといって、大変だから外注しようと簡単にはいかないのがこの世界。実験過程にいちいち費用はかけられなかったり、アノテーターの習熟度のばらつきが心配だったり、ドメイン知識を持った特定の人にしかできないタスクという場合もあり、まずは自前でやるケースが大半ではないでしょうか。
そんな自前アノテーションの負荷を軽減するお助けツール、巷にはどんなものがあるのでしょうか。調べてみると、自然言語処理向けとしては主にdoccano・bratなどに言及した記事がたくさん出てきます。これらはフリーで使えるツールです(2021年7月16日時点)。
一方、私たちのチームで使っているprodigyをがっつり紹介した記事はあまり見かけません。有償のハードルはやはり高いのか、日本ではあまり浸透していないのかわかりませんが、1回購入でずっと使えて※、長い目で見ればコスパは良いという実感もあるので、この場で紹介してみたいと思います。
※無料アップグレードは12ヶ月、など制限もありますので詳細は公式サイトを確認ください。
prodigyとは
prodigyを提供しているのは、Explosionというソフトウェア会社です。同社が提供するspaCyという自然言語処理用ライブラリなら聞き覚えがあるという方も多いかもしれません。
prodigyで行えるアノテーションタスクや料金など、詳細は以下の通りです。
アプリタイプ: webアプリケーション
入出力データ形式: jsonl(ndjson)
料金(1回購入):personal:$390 company:$490
LICENSE:explosionが定めたライセンスに準拠
*2021年7月16日時点
どんな挙動なのかは、こちらのデモページを触ってみるとイメージが掴めるかと思います。
https://prodi.gy/demo
prodigyを使った実例
では実際に、prodigyを使ったモデル作成事例を紹介します。私たちM研では、朝日新聞社が保有する新聞記事データ(約30年分)を使って自然言語処理研究に取り組んでいます。昨年2020年には、優れた地図表現技術を持つ株式会社Storolyさんとの共同研究である「#COVID_19WordMap」を発表しました。
「#COVID_19WordMap」は、新型コロナ関連記事から抽出したキーワードを日本地図にマッピングし、コロナ禍における日本の状況の変化を可視化したものです。キーワードの色が記事内容のネガポジを表しており、感染者数が増加したというネガティブな記事なら青、マスクを寄贈したといったポジティブな記事ならオレンジと色分けされています。
このネガポジ判定モデル作成のために、「コロナ」を含む新聞記事3,770件の見出しに[positive][neutral][negative]の3値のラベル付けを行いました。その時のアノテーション画面がこちらです。
[positive][neutral][negative]の各ラベルに数字キーが割り当てられているので、アノテーターは記事見出しのネガポジを判断し、数字を選んで押すだけでサクサクと次の画面に進めます。慣れてくると、1件あたり3〜4秒くらいで次に進むことができます。
アノテーション画面立ち上げまでの流れをざっと説明すると、
①公式ドキュメントに従ってprodigyをインストール
②指定のフォーマットに整えたアノテーションデータのjsonlファイルを用意
③任意の番号でポートフォワードしたコンソール内でprodigyコマンドを実行
$ prodigy textcat.manual article_polarity ./kiji_midashi.jsonl --label positive,neutral,negative
コマンド構成(テキスト分類の場合)
[prodigy] [アノテーションタスクの種類] [結果を保存するための任意のデータセット名] [アノテーションするデータのパス] [分類するラベルの名前]
下記メッセージが出たら、the web server at ..以降のURLにアクセスすれば、アノテーション画面が立ち上がります(localhost:以降の番号とポートフォワード番号は揃えておく必要があります)。
✨ Starting the web server at http://localhost:8010 ...
Open the app in your browser and start annotating!
アノテーションに使うjsonlファイルは、タスク別に指定のKeyがあったりして、形式が間違っているとエラーになるので注意が必要です。
また、共通サーバーがあれば複数人でアノテーションを行うことも可能です。このモデルを作る際は、私が3種のポート番号で3人分のアノテーション画面を立ち上げ、他の2人はそれらにアクセスし、アノテーションを行いました。
こうして作成したデータを、訓練用2900件、検証用100件、テスト用770件に分け、朝日新聞社の過去記事データで事前学習したRoBERTaをファインチューニングすることで、高精度なネガポジ判定モデルが作成できました。
実はprodigyの機能としては、アノテーションして終わりではありません。出来上がったアノテーション済みデータセットを使い、先ほどのような短いprodigyコマンドでモデルの訓練までできてしまいます。1から新しいモデルを作るか、spaCyの事前学習モデルを指定してファインチューニングすることも可能です。この方法でモデル作成もしましたが、RoBERTaをファインチューニングしたモデルが精度において優っていたので、この時は最終的にそちらを使いました。
prodigyのイケてるところ
上記のように、アノテーション画面立ち上げからモデルの訓練まで簡単なコマンドで一気にやれてしまうprodigy。多機能な上、spaCyとの連携も充実しており、全てを使い切れてはいないのですが、特に気に入っている部分をご紹介します。
多彩なインターフェース機能
HTMLで画面を自由にデザインできる他、固有表現抽出や文の依存関係のラベリング、画像のバウンディングボックス指定など多様なアノテーションタスク用のインターフェース機能があります。私が特に気に入っているのがdiffとreviewです。
diffは、よく似た2つのテキストを重ね合わせ、差分をハイライト表示してくれる機能です。違いを見ながらラベル付けしなければならないようなタスクで役立っています。
これができるツールは他になかったため、prodigyを導入するきっかけとなりました。注意点は、入力データ形式の指定がある("added"と"removed"keyを使う)ことと、日本語の場合はトークン単位で差分をハイライトできるよう、トークンごとにスペースを入れたテキストを使う必要があることです。
またreviewは、複数人で同じサンプルをアノテーションする場合に、ラベルが不一致のものを可視化し、最終的にどのラベルにするかを後から決められる機能です。難易度が高く、人により判断がぶれがちなタスクで役立っています。
柔軟性(カスタムレシピ)
様々なアノテーションを行うコマンドをprodigyではレシピと呼んでいます。一部のレシピはソースコードが公開されており、それをカスタムして使うこともできます。カスタムレシピについても公式ドキュメントで説明されています。
(余談)Inesのタトゥー
prodigy開発者のInesはキュートな女の子ですが、仕事を頑張ったご褒美にtattooを増やしちゃったりするファンキーガールです(コメントにも注目)。prodigyアップデートのたびにtattooが増えてしまうのでは?とハラハラしながら見守っています。また公式ドキュメントやユーザーサポートのInesのコメントを読んでいると、この分野やアノテーションへの愛が感じられるのがいいです。
Treated myself to a new tattoo after a long time because I've been working hard and being productive. (I know it's not an actual Python snake, but still!)
— Ines Montani 〰️ (@_inesmontani) September 9, 2020
✨🐍🌸 pic.twitter.com/XbliWJ1nyY
より良いアノテーションとは
prodigyの公式ドキュメントのどこかで見かけたのですが「質の良いアノテーションのために大事なことは、アノテーターが集中できる状況をいかに作り出すか」だそうです。確かにprodigyの基本レシピはどれもシンプルなデザインで、アノテーターが何に集中すべきかが一目瞭然です。また、公式ドキュメントにはより良いアノテーション設計のヒントが散りばめられています。例えば「ラベル数が多いアノテーションはアノテーターを迷わせるので望ましくないが、どうしても減らせない場合は、質問を2段階にし、1回の選択肢を減らしてシンプル化する」など。大量の単純作業に集中してもらうために設計・運用を工夫したり、なんなら楽しくやれるくらいのノウハウを考えることは重要だなあと思います。
そのうち、ゲーム感覚でアノテーションできたり、たくさんこなすほど褒めてくれるようなツールってできないかな?とか、海や高原など環境の良いところで年に数回、大アノテーション合宿できないだろうかなどなど、妄想は膨らむばかりです。何かと疎まれがちなアノテーションだけに、私は味方であり続けたい(笑)。今後も、アノテーションの辛さを乗り越えるネタがあればご紹介したいと思います。
(朝日新聞メディア研究センター・杉野かおり)