エムスリーテックブログ

エムスリー(m3)のエンジニア・開発メンバーによる技術ブログです

キーフレーズを抽出して遊ぶ

AI・機械学習チームで2021年新卒の氏家です。 この記事はエムスリーAdvent Calendar 2021の23日目の記事です。 最近チームでスタンディング&ステッパーが流行っているのでその流れに乗ろうと試みましたが、スタンディングの時点で挫折してしまいました。

さて、今回のテーマは自然言語処理です!
AI・機械学習チームでは普段から自然言語処理をはじめとした機械学習を用いてプロダクトの開発・運用を行っています。 しかし、業務にあまり関係ない技術で遊びたい気持ちがあるのもまた事実。 そこで今回は、キーフレーズ抽出と呼ばれる技術に着目して、弊社に関連するデータに適用して遊んでみたいと思います。

キーフレーズ抽出とは

キーフレーズ抽出は、文書中からその文書をよく表現する句(フレーズ)を抽出する技術です。 ここでいうフレーズとは意味がひとまとまりの単語集合ですが、実際には名詞句が採用されることが多いようです。
例としてAI・機械学習チームの中村(@po3rin) によるエムスリーAdvent Calender一日目の記事の冒頭を見てみましょう。

www.m3tech.blog

最近検索エンジンの改善やアルゴリズムの変更などの効果を分析する機会が多くなってきたのですが、ABテストの効果検証でやらかしてしまい、改めてABテストについて復習しています。そこで「A/Bテスト実践ガイド」という本を読みました。この本で、私が陥った大量にクリックするユーザーやボットによって検定の結果が歪んでしまうユーザー内相関について学びました。今回は検索エンジンの評価を題材にABテストでのはまりポイントを私の失敗事例と共にまとめてみます。

この例では、「ABテスト」「ユーザー内相関」のようなフレーズを用意すれば端的に文書全体の話題を網羅できそうです。 キーフレーズ抽出はこのようなフレーズを自然言語処理技術を用いて抽出する手法です。 抽出されたキーフレーズは簡単な要約としても利用できますし、タグ付けや検索、後段タスクの特徴量としても役立てられる可能性があります。

使用した手法

今回用いる手法は自然言語処理分野のトップカンファレンスの1つであるEMNLP 2021に採択されたUnsupervised Keyphrase Extraction by Jointly Modeling Local and Global Context *1で提案されたものです。

この手法では事前学習済みの言語モデルを用いて教師なしでキーフレーズを抽出しています。 そのため、学習データがなくともBERTといった大規模言語モデルを用意するだけでキーフレーズを抽出できます。 元論文では英語の学術論文について評価を行っていますが、手法自体はそのドメインに特化しているわけではないので色々なテキストに使えそうです。 本記事では手法の詳細には踏み込みませんが、イメージしやすいようざっくりした説明だけ行います。

教師なしキーフレーズ抽出では主に以下の2つのアプローチが取られることが多く、今回の手法はこの2つを組み合わせた手法になっています。 具体的にはそれぞれ算出したスコアの積をとることで両方のアプローチを加味しています。

  • Embedding-based approach: 文書とフレーズそれぞれの埋め込み表現から、文書全体の意味に近いフレーズを抽出する
    f:id:kuroneko1259:20211221182547p:plain
    Embedding-based approach. 文書全体をよく表すフレーズの類似度が大きくなる(はず)
  • Graph-based approach: フレーズをノード、フレーズ同士の共起関係をエッジとしたグラフから、ネットワークの中心性などを用いて抽出する手法
    f:id:kuroneko1259:20211221190133p:plain
    Graph-based approach. 次数中心性を採用した場合、赤色のフレーズがキーフレーズとして抽出される

また、「文書の先頭と末尾には重要なフレーズがある*2」という観測のもと、フレーズが出現する位置によって重み付けを行うなどの工夫がされています。 手法の詳細を知りたい方は是非元論文を参照してください。

なお、論文に記載はありませんが、著者による実装が公開されています。 日本語での前処理を加えたものをGitHubに公開しておきます。 github.com

いざキーフレーズを抽出

さっそくキーフレーズ抽出を試していきます。
せっかくなので弊社に関連するテキストデータを使って、どの程度妥当なキーフレーズが抽出できるかを定性的にみていきます。

テックブログ

まずは冒頭の例にもでてきたお馴染みエムスリーテックブログです。 冒頭に例示した記事を入力したところ、抽出結果は以下の通りとなりました。 なお、全文はモデルに入り切らないため、冒頭と末尾5段落ずつ使用しています。

順位 フレーズ
1 検索_エンジン
2 AB_テスト
3 ユーザー_内_相関
4 AB_テスト_実践_ガイド
4 効果_検証
5 情報_検索_系
6 検索_エンジン
8 本日_紹介
9 私_自身
10 難し_さ

結果をみると、「私自身」といったノイズはありつつ、おさえるべきキーワードである「ABテスト」「ユーザー内相関」などは抽出できていそうです。

もうひとつくらい見てみます。 次の記事は、同じくAI・機械学習チームの北川(@kitagry)の「k8sのカスタムリソースで、CronJobの終了を検知してJobを実行する」です。

www.m3tech.blog

以下、記事の概要を抜粋します。

今日は趣味で作っているKubernetesのカスタムコントローラーの話をしようと思います。 今回作るものはあるCronJobの実行が終わった時に、実行されるJobを作成しようと思います。 ...

キーフレーズは「カスタムコントローラー」「Kubernetes」といったところでしょうか。 抽出されたキーフレーズは以下の通りです。

順位 フレーズ
1 k_8_s
2 カスタム_コントローラ
3 自動_バックアップ
4 カスタム_リソース
5 終了_Event
6 所有_関係
7 終了_時
8 Reconcile_処理
9 運動_不足
10 機械_学習_チーム

こちらも「k8s」や「カスタムコントローラ」など主だったフレーズは抽出できていそうです。 原文を参照していただきたいですが、「終了Event」や「Reconcile処理」なども十分キーフレーズとして良さそうです。 これらの専門用語は言語モデルが十分に事前学習できていないと考えられますが、グラフベース手法のおかげか、ある程度妥当な結果となっているようです。

一方で上位に来ている「自動バックアップ」や「機械学習チーム」は以下の冒頭2文で言及がありますが、明らかにこの記事のキーフレーズとは言えません。

これはエムスリー Advent Calendar 2021の8日目の記事です。前日は @AkiraGoto による、 そのEFSって自動バックアップでいいんでしたっけ? でした。AI・機械学習チームで2021年新卒の北川(@kitagry)です。

これは使用した手法が、「冒頭と末尾にあるフレーズにより重みを置く」ようにしている影響だと思われます。 実際の運用では、文書の特徴に合わせてハイパーパラメータや手法の細部を柔軟に変えていく必要がありそうです。

AskDoctors

次は趣向を変えてAskDoctorsで試してみます。
AskDoctorsは弊社が運営する、病気や健康の悩みを医師に相談できるサービスです。医師が回答しているため回答の質が高く、私もよく利用しています。

さて、AskDoctorsは患者様からの相談なので、患者が抱える症状や疾患、医薬品名などのフレーズがとりたいところです。 ノロウイルス? 熱 吐き気 関節痛がありますというタイトルの相談からキーフレーズを抽出してみます。

順位 フレーズ
1 8_度_2_分
2 関節_痛
3 焼き_牡蠣
4 筋肉_痛
5 日数_的
6 予防_接種
7 0_人
8 ノロ_ウイルス_以外
9 可能_性
10 ノロ_ウイルス

ある程度質問の概要が想像つきそうなフレーズが並んでいます。 牡蠣おいしいですけど怖いですよね... 最近牡蠣を食べてないので食べたくなってきました。

それはともあれ、「筋肉痛」だけでなく「吐き気」など同格で羅列していた症状も抽出したいところですが、今回は抽出されませんでした。 グラフベース手法の特性上、同一の共起クラスタ(ここでは症状など)内の複数フレーズは抽出しづらいことが予想されますし、各症状のすべてが文書ベクトルと類似するとは考えられないため、今回の手法では仕方なさそうです。
やはり一口にキーフレーズといっても実際は多様であり、抽出したい対象をよく分析して手法を組み立てる必要がありそうです。

キーフレーズを使った応用

キーフレーズは無事抽出できましたが、ただ抽出しただけではつまらないので、それらを使った応用を試してみます。

キーフレーズを使った応用としてまず思いつくのは類似文書検索でしょう。 キーフレーズは文書全体のトピックを端的に表しているはずなので、ノイズの多い文書全体を使って検索するよりもトピックに敏感な検索が可能になると期待できます。

さっそく、弊社テックブログの約一年分を使って類似文書検索をしてみたいと思います。 比較には以下の3種類のモデルを用意しました。 キーフレーズ抽出のパラメータに関しては、前項の観測を踏まえて少しチューニングしています。

  1. 文書中の単語すべてを使用
  2. 名詞句のみを使用
  3. 名詞句のうち、抽出されたキーフレーズ10個のみ使用

GKEでOOMなどの異常eventをslack通知する記事)で試してみます。
GKEのjobの監視、通知に関する記事ですね。 類似文書は以下の通りです。

順位 全ての単語 名詞句 キーフレーズ
1 入社一ヶ月でGKEのSecret管理基盤を作った話 k8sのカスタムリソースで、CronJobの終了を検知してJobを実行する k8sのカスタムリソースで、CronJobの終了を検知してJobを実行する
2 MLのバッチでもSLO監視はじめました。 GKE上の一定時間経過したJobを自動削除する MLのバッチでもSLO監視はじめました。
3 Trusted Advisorを利用してAWS利用の改善を進めていく話 MLのバッチでもSLO監視はじめました。 クラウド電子カルテサービスのSLO監視を再検討してみた話

ある程度うまくいってる例を選んだはずなのに、そこまで大差ないような...?
全ての単語や名詞句のみの場合はGKE/AWS関連の文書のみが引っかかる一方で、キーフレーズのみを用いた場合は「クラウド電子カルテサービスのSLO監視を再検討してみた話」も引っかかり、「監視」や「SLO」「通知」といったトピックに若干敏感になっているような気がします。

まとめ

今回は弊社に関連する文書を使って最新のキーフレーズ抽出手法で遊んでみました。 キーフレーズの抽出自体は、ノイズはあれどある程度妥当な結果を返していることがわかりました。 まだまだ実務で成果を出せる精度ではなさそうですが、ドメインや使い道ごとに細部をチューニングしていくことで何かしら使えるかな、というところでしょうか。

今回はキーフレーズ抽出を試しましたが、今後もあわよくば業務で使えるような手法を見つけるべく色々な手法で遊んでいきます!

We are hiring!

エムスリーでは、自然言語処理、推薦システム、画像認識などの機械学習技術を用いて、医療を前進させるプロダクトを開発するエンジニアを募集しています! 我こそは! という方はぜひ以下よりご応募ください!

jobs.m3.com

*1:Xinnian Liang, et al. 2021. Unsupervised Keyphrase Extraction by Jointly Modeling Local and Global Context. In Proc. of the EMNLP. https://aclanthology.org/2021.emnlp-main.14/

*2:Chin-Yew Lin, Eduard Hovy. 1997. Identifying topics by position. In Proc. of the fifth conference on Applied natural language processing. https://dl.acm.org/doi/10.3115/974557.974599