■イベント Sansan Builders Stage 2021 https://jp.corp-sansan.com/engineering/buildersstage2021/
■登壇概要 タイトル: 継続して改善する固有表現抽出 登壇者:技術本部 DSOC 研究開発部 Data Analysisグループ シニアリサーチャー 高橋 寛治
▼Sansan Engineering https://jp.corp-sansan.com/engineering/
STAGE 3研究開発部 Data Analysisグループ SESSION TAG⾼橋 寛治⾃然⾔語処理継続して改善する固有表現抽出
View Slide
技術本部 DSOC 研究開発部 Data Analysisグループシニアリサーチャー⾃然⾔語処理に関連する研究開発に従事。MLOpsやチームリーダとして研究開発の推進も⾏う。@kanji250tr⾼橋 寛治
継続して改善するための取り組み事例を紹介する。初期の作成者以外も取り組める状態で改善されていることをここでは「継続して改善」として紹介する。継続して改善する固有表現抽出⽬次- ⽬次- 固有表現抽出とは- 改善するための要素- 学習データ- モデルの検討/学習とハイパパラメータ設定- 前処理/後処理- 次の改善を定める試⽤と実運⽤- まとめ
固有表現抽出とは
⾃然⾔語で記述されたテキスト中に含まれている組織名や⼈名、⽇付表現など、定義に従ったチャンク(かたまり)のことを固有表現と呼ぶ。固有表現抽出とは、固有表現をテキスト中から抽出することである。固有表現抽出固有表現抽出とはSansan株式会社 の ⾼橋寛治 が 2021年10⽉06⽇ に本発表を⾏います。組織名 ⼈名 ⽇付
固有表現かどうかを判定するために、⽂脈が必要となる。⼤きく分けて、ルールベース(辞書と規則)と機械学習による⽅法がある。以下は、⽂脈を考慮する必要性を⽰す。固有表現抽出の解き⽅固有表現抽出とはSansan が提供する名刺管理サービス Sansan では、…組織名 組織名
⼊⼒⽂をトークン列とし、そのトークン列に対する分類問題として解く。⼤規模な⾔語モデルBERTによる固有表現抽出固有表現抽出とは⼊⼒ 名刺 管理 サービス の Sansan 株式会社 が出⼒ O O O O B-組織名 I-組織名 OIOB2(Inside-outside-beginning)という表現を利⽤• B:固有表現の先頭• I:2トークン以上で構成される固有表現の先頭以外の単語• O:固有表現以外のトークン
⼤規模な⾔語モデルBERTによる固有表現抽出固有表現抽出とはBERT(word_embeddings:119,547, position_embedings:512, output:768)[CLS] Sansan 株 式 会 社 が 提 供 する 名 刺 管 理 サービス 。 [CLS]Sansan株式会社が提供する名刺管理サービス。[CLS] Sansan 株 式 会 社 が 提 供 する 名 刺 管 理 サービス 。 [CLS][CLS] Sansan 株 式 会 社 が 提 供 する 名 刺 管 理 サービス 。 [CLS]Dense(768×n) n=2(BかI)×固有表現タグの種類数+1(O)エンコードされた表現埋め込み表現サブワード固有表現タグB-組織名 O O O O O O O O O O O O O O
クラウド名刺管理サービス「Sansan」において、企業の動向をお知らせするために、ニュース記事中の企業名を抽出しキーとしてニュース配信に活⽤する。固有表現抽出のサービス利⽤例固有表現抽出とは
改善するための要素
以下は誤りの例である。出⼒をいかに正解に近づけるかが、抽出精度を⾼めるという⽬標に対しての課題となる。固有表現抽出では適合率と再現率が評価指標として⼀般的に⽤いられる。固有表現抽出の誤り改善するための要素⼊⼒ Sansan 株式会社 の ⾼橋 寛治 が 本⽇出⼒ O O O B-⼈名 I-組織名 O O正解 B-組織名 I-組織名 O B-⼈名 I-⼈名 O Oデータの追加や辞書による後処理で対処できるかもしれない系列をより考慮するモデルにより対処できるかもしれない
固有表現抽出の性能を構成する要素を⼤きく分けると次の要素となる。- 学習データの作成- 実験や前処理/後処理といった試⾏錯誤- 次の改善を定める試⽤と実運⽤初期作成者以外が改善できるようにするために、各要素についてガイドラインや設計といった仕組みを整備し、継続した改善を続けることが理想である。改善するための要素改善するための要素
学習データの作成は通常、処理対象とするテキストと同様のテキスト(同じドメイン)を対象に、固有表現タグを⼿作業で付与する。学習データの作成には時間を要するため、効果的に作成するために実践している⼯夫を3点紹介する。- アノテーションガイドラインの作成- 仮のタグ付け結果の利⽤- 能動学習の利⽤学習データの作成改善するための要素 > 学習データの作成
スプレッドシートでの作業が定着しているため、スプレッドシートで扱いやすいアノテーションガイドラインを作成する。迷った場合には、仮の答えとともに備考に記⼊する。備考については、依頼者が確認し答えることで、次回以降のアノテーションに活かす。下にスプレッドシートに記載したガイドラインを⼀部⽰す。アノテーションガイドラインの作成IOB2タグの例固有表現の説明改善するための要素 > 学習データの作成
学習データがある程度作れたらモデルを学習しその結果を元にアノテーションを⾏う。具体的には、モデルの出⼒の修正作業がアノテーション作業となる。右図のD列に対して修正を⾏う。モデルの仮出⼒があれば作業が楽になる*。仮のタグ付け結果の利⽤*固有表現抽出ではないが、分類問題において同様の⽅法を試した際に作業時間の削減を確認した⾼橋 寛治, 奥⽥ 裕樹, 要望分析のための投稿テキストのカテゴリ分類⽀援,第14回テキストアナリティクス・シンポジウム, 2019改善するための要素 > 学習データの作成
モデルが効率良く学習できるデータを選定する能動学習を適⽤する。BERTベースのモデルに対応するために、バッチ能動学習を利⽤した。BERTベースの固有表現抽出で有効なことは確認済みである*。能動学習の利⽤*橋本 航, ⾼橋 寛治, BERTを⽤いた固有表現抽出におけるバッチ能動学習, 第203回ICS研究発表会ラベルあり学習データセットでモデル学習ラベルなしデータに対して能動学習アルゴリズムを適⽤しデータをまとめて選択アノテータにラベルをつけてもらう新たにラベル付けされたデータを学習データに追加するバッチ能動学習のサイクルB=20改善するための要素 > 学習データの作成
学習データをもとに、モデルの検討/学習やハイパパラメータの設定、また前処理や後処理など、性能を向上させるために、様々な検討が必要である。その試⾏錯誤を⾏いやすくするための⼯夫について紹介する。- モデルの検討/学習とハイパパラメータの設定- 前処理/後処理試⾏錯誤を⾏いやすくする改善するための要素
.├── Dockerfile├── README.md├── dataset│ └── wikipedia├── models│ └── Wikipedia├── onener… ├── __init__.py├── cli.py├── model├── transformer└── utils実験およびモデル書き換えの容易さを重視し、誰でも改善を可能とする。実験環境(モデルの検討/学習とハイパパラメータ設定)改善するための要素 > 試⾏錯誤を⾏いやすくする- 構成を統⼀し着⼿を容易にする- データセットやモデルのディレクトリを指定- モデルの記述を統⼀し、読み書きのしやすさを担保する- Transformersライブラリをベースに拡張- 学習とハイパパラメータは再現できるよう最終的に記録する- チューニングは各⾃におまかせ- 最終的な実⾏⼿順やハイパパラメータをシェルスクリプトに記述上記の取り組みを実践し、これまでに4⼈が改善に取り組む。また互いにコードレビュー可能な状態である。
メンテナンスの例• 事象:基本的に略称で呼ばれる企業のニュースが届かない• 対応:略称を展開する処理を追加実運⽤上発⽣する個別の事象に対応するための処理を⾏う。理想の対応は、データの追加とモデルの再学習だが、早急な対応が求められるため、規則処理による対処が多い。規則処理はだんだんと複雑になりメンテナンスが煩雑になる。それを回避するためのコーディング例を紹介する。前処理/後処理コードのイメージ前処理や後処理は、命名しオブジェクトとして注⼊することで、可読性を⾼めるdef ner_factory():ner = NERService()ner.add_preprocessor(UnicodeNormalizer())ner.add_postprocessor(StopOrganizationFilter())logger.info(ner.get_steps()) # ステップが表⽰されるreturn ner改善するための要素 > 試⾏錯誤を⾏いやすくする
実際に試したり、使ったりすることで、出⼒に関する問題点や改善要望が出てくる。モデルを納品して終わりではなく、運⽤し継続して改善することが求められる。例えば、モデルを集中的に改善する段階では、評価結果と試⽤により改善したい点が出てくる。実稼働時には、定量的な観測結果や利⽤者からの要望を元に、改善したい点が出てくる。試⽤や実運⽤で実践している事例を紹介する。- 試⽤のしやすさ- 実運⽤でのフィードバック次の改善を定める試⽤と実運⽤改善するための要素
事例1:パッケージ化で、数⾏で試せる$ pip install “git+ssh://xxx/OneNER”$ pip install “git+ssh://xxx/OneNER#subdirectory=models/wikipedia”$ pythonIn [1]: from onener.transformer.ner import BertNERTaggerIn [2]: import onener_model_WikipediaIn [3]: tagger = BertNERTagger(onener_model_Wikipedia.model_path)In [4]: tagger.predict(“解析対象の⽂を渡す”)評価結果に加えて、応⽤先タスクで試⽤することにより、課題が⾒えてくる。試⽤をしやすくし、課題を集めるための試⾏回数を増やすために、試⽤のしやすい仕組みを作る。試⽤のしやすさ事例2:API化し、試せる推論エンドポイントをSageMaker上で構築し、AWS SDKから利⽤可能とするAmazon SageMakerAWS SDK改善するための要素 > 次の改善を定める試⽤と実運⽤
利⽤者からのフィードバック例フィードバック:サービス名のSansanしか書かれていないのに、Sansan株式会社のニュースとして配信されている。対応:サービス名と社名が同⼀の場合は、法⼈格がある場合のみ抽出するようルールを追加する。定性的な利⽤者からのフィードバックと定量的な性能観測の実施結果をもとに、固有表現抽出に関する課題を洗い出す。また、改善結果はすぐにデプロイできるように、デプロイパイプラインが構築されている。実運⽤でのフィードバック⽉次で⾏う性能観測性能観測:記事をサンプリングし、抽出された項⽬の正しさを⼈⼿で確認する。対応:頻出する誤りを類型化し、改善に取り組む。改善するための要素 > 次の改善を定める試⽤と実運⽤
まとめ
継続して改善するための取り組み事例について紹介した。- 学習データの作成- 実験や前処理/後処理といった試⾏錯誤- 次の改善を定める試⽤と実運⽤それぞれの要素について、初期作成者以外が改善できるようにするために、ガイドラインや設計といった仕組みを整備した。これらの要素は2回⽬以降もスムーズに取り組みやすい状態となっているため、継続した改善ができる。継続して改善する固有表現抽出まとめ
シニアリサーチャー Twitter@kanji250tr34779592122EightVirtual Card⾼橋 寛治