Shiftの杉山です。今回は個人情報が含まれた文章に対してFlairを用いることで、どれくらい個人情報を固有表現として抽出することができるのかを検証します。背景(NDAを結んだ上での)データの第三者提供時やDBに個人情報を残したくない顧客側の要望など、個人情報をマスキングする必要があるシーンは多くあると思います。こちらの記事ではフランスでの判例公開時における個人情報マスキングの必要性が述べられています。弊社が提供しているAIメッセンジャーというAIチャットボットサービスでも、お客様の本人確認などを行うために個人情報を入力していただくケースがありますので、そのようなデータの取り扱いに際して個人情報を抽出・削除したいというニーズを抱えています。そこで、最終的には自動化したい考え現時点の機械学習の技術でどれくらいの制度が出るのか検証してみようと思います。Flairとはここで、今回使用するFlairについて簡単に説明します。Embeddingを用いることで固有表現抽出に強みを持ち、提案当時には多くの固有表現抽出タスクでSOTAを獲得しました。最新の手法を手軽に実行できるのが特徴で、BERT族などのモデルも宣言的に実装することができます。Face/transformers)予備実験で行った日本語の固有表現抽出においても高精度であったため今回はこちらを採用することにしました。インストールや実装面ではこちらの記事が大変参考になりました。準備Flairはあくまでも固有表現抽出の実装を提供するフレームワークなので、個人情報を固有表現として扱うにはそのための学習データを作成する必要があります。そこで、今回はAIメッセンジャーの対話データに対してアノテーションを行い、データを作成しました。アノテーションにはTIS様からOSSで出されているdoccanoを用いました。(使いやすいUIで最高です!)今回対象とした対話データを確認したところ、個人情報として以下の8項目が含まれていましたので、それぞれに対してIREXのIOB2タグ形式でアノテーションを行いました。(かなり少ないですが)140の対話データにアノテーションを行ったところ、各タグの頻度分布は以下のようになりました。今回対象とした対話データを確認したところ、個人情報として以下の8項目が含まれていましたので、それぞれに対してIREXのIOB2タグ形式でアノテーションを行いました。実装はこちらの記事の通りなのですが、一応記載しておきます。test:14のように分割して検証を行いました。GPU)で15時間ほどで終わりました。testデータでの結果は以下の通りです。固有表現抽出の評価にはB-やI-まで見る/見ない、や認識領域の完全一致/分割単位など様々な方法がありますが、Flairのコードを確認したところB-などを除くタグ+領域の完全一致で評価しているようです。0.2500MICRO_AVGのf1-scoreで0.5とそこそこ良い結果が出ていますが、個人情報のマスキング用途にそのまま用いるには頼りない数値となりました。簡単そうなTelのtpが0になってしまったのですが、これはZipCodeが似た系列(TelはXXX-XXXX-XXX、ZipCodeはXXX-XXXX)を持つためそちらに寄ってしまったと考えられます。(実際ZipCodeのfpが高い)実際のデータを使っているため適用例をお見せすることはできないのですが、一例として以下の例文に対して予測を行ってみたいと思います。Shiftの杉山です。スクランブルスクエアで、2019/12/18生まれです。モデルの適用時には、文章ではなく学習時と同じ分割のスペース区切りで渡す必要があります。今回はMeCab+neologdで分割して学習したため、入力をそのように整形して予測します。Shiftの杉山です。スクランブルスクエアで、2019/12/18生まれです。model.predict(sentence)print(sentence.to_tagged_string())適用結果はこのようになりました。