Sansan Tech Blog

Sansanのものづくりを支えるメンバーの技術やデザイン、プロダクトマネジメントの情報を発信

文章埋め込みを用いた教師なしキーフレーズ抽出EmbedRankの実装とその評価

こんにちは、DSOC R&Dグループ研究員の奥田です。言語処理学会年次大会(NLP2019)の開催されている名古屋のホテルで今まさにこの記事を書いています。ひつまぶし美味しかったです。

さて、今回はCONLL 2018で発表されたSimple Unsupervised Keyphrase Extraction using Sentence Embeddingsを実装して日本語を対象に評価しましたので、その紹介です。こちらは1/31に開催された「第一回SIL勉強会 自然言語処理編」での発表を加筆修正したものですので、そちらの資料も合わせてご覧いただければと思います。

EmbedRankとは

本論文で提案されているEmbedRankとは、教師データを用意することなく、文章に含まれる重要なキーフレーズを抽出するアルゴリズムです。あるフレーズが重要かどうかは、それが含まれる文章全体の意味をよく表しているかどうかで評価できるのではないかというのが、この論文の発想です。そして意味をよく表すフレーズを抽出する際に、文章埋め込み(Sentence Embedding)を利用する点がEmbedRankの大きな特徴です。

アルゴリズムとしては、以下の3ステップから構成されます。

  1. 品詞の情報を元に、文章中から候補となるフレーズを抽出する
  2. 文章埋め込みを用いて、文章および各フレーズのベクトルを得る
  3. 文章の埋め込みベクトルに対する類似度を用いて、候補となるフレーズをランク付けし、キーフレーズを決定する

f:id:yag_ays:20190313095921p:plain
文章は「潜伏キリシタン関連遺産、世界遺産登録 - ウィキニュース」より

まず第1ステップとして、文章中から候補を抽出します。ここでは「形容詞+名詞」といった品詞に基づく特定のパターンをルールで記載し、それに合致するフレーズを候補として採用します。 次の第2ステップでは、それらの候補となるフレーズと文章自体を対象に、文章埋め込みを計算して埋め込みベクトルを計算します。文章埋め込みは論文ではsent2vecやdoc2vecが用いられていますが、原理的には入力となる文章から何らかの固定次元でのベクトルが出力されれば良いため、infersentやその他類似手法でも問題ありません。 そして最後の第3ステップで、文章自体のベクトルに近い候補フレーズの埋め込みベクトルを、類似度を元にして抽出し、キーフレーズを決定します。すなわち、文章と各候補フレーズを全てペアにして類似度を測り、その近さをもとに文章の意味をよく表しているフレーズをランク付けするわけです。そうすることで、フレーズの重要度というものを表現することができます。あとは、その上位n件を取得すれば、それが文章に対するキーフレーズとなります。

ただし、単に抽出するだけでは似たような表現が重複して取得されることがあるため、多様性を持たせたフレーズ抽出のためにMaximal Marginal Relevance(MMR)という手法を用いています。*1

f:id:yag_ays:20190312225824p:plain
https://speakerdeck.com/sansanbuildersbox/case-study-in-word-embedding

これにより、文章自体と似ているフレーズを抽出しつつも、フレーズ間の類似度はなるべく下げるようなランキングが可能になります。数式としてはargmaxが出てきたりして少しややこしいのですが、実際は候補の中で一番もっともらしいものを選択していけば良いので、複雑な最適化などを必要としません。

ソースコード

ソースコードはGithubで公開しております。

GitHub - yagays/embedrank: Python Implementation of EmbedRank

動作にはdoc2vecの学習済みモデルが必要ですので、事前にダウンロードする必要があります。私個人のブログで学習済みモデルを配布しておりますので、そちらを参照ください。

Dockerでの実行

Dockerで実行させる場合には、学習済みdoc2vecモデルをmodel/以下にコピーした上で、下記コマンドを実行してください。

$ docker build -t embedrank .
$ docker run --rm -p 8080:8080 --memory 7g -it embedrank

すると、このようにWebAPIとして実行することができます。textに要約したいテキスト、num_keywordsには出力したいキーワードの数を指定します。

$ curl -XPOST "localhost:8080/embedrank" --data-urlencode text='バーレーンの首都マナマ(マナーマとも)で現在開催されている
                                            ユネスコ(国際連合教育科学文化機関)の第42回世界遺産委員会は日本の推薦していた
                                            「長崎と天草地方の潜伏キリシタン関連遺産」 (長崎県、熊本県)を30日、
                                            世界遺産に登録することを決定した。文化庁が同日発表した。
                                            日本国内の文化財の世界遺産登録は昨年に登録された福岡県の
                                            「『神宿る島』宗像・沖ノ島と関連遺産群」に次いで18件目。
                                            2013年の「富士山-信仰の対象と芸術の源泉」の文化遺産登録から6年連続となった。'
                                           -d 'num_keywords=3'
{
  "keywords": [
    {
      "keyword": "世界遺産登録",
      "score": "0.6179086"
    },
    {
      "keyword": "(長崎県",
      "score": "0.51725507"
    },
    {
      "keyword": "ユネスコ(国際連合教育科学文化機関)",
      "score": "0.5730941"
    }
  ]
}

なお、doc2vecのモデルをコンテナに同梱して読み込むため、

  • Dockerのメモリが7GB以上必要
  • コンテナサイズが合計7.3GB

となる点に注意してください。

実験

上記の実装を元に、幾つかのキーフレーズ抽出のアルゴリズムと比較してみました。用意した手法は以下の2つです。

また、対象とした記事として、論文の抄訳とニュース記事を用いました。

実験1: 論文の抄訳

現実の文書には教師データとなる参照要約(人手で作成された要約)が付与されていない場合が多く,教師あり重要文抽出では,参照要約が少量の場合における適用が課題である.本研究では,文書分類の学習を同時に行うことで,重要文抽出の学習をサポートするマルチタスク学習モデル及び学習方法を提案する.精度評価実験では,特に参照要約が少量の場合において,マルチタスク学習の導入による精度向上を確認した.

https://www.jstage.jst.go.jp/article/pjsai/JSAI2017/0/JSAI2017_1J14/_article/-char/ja/

rank EmbedRank PositionRank termextract
1 重要文抽出 参照要約 学習
2 マルチタスク学習モデル 教師データ 参照要約
3 サポート 重要文抽出 重要文抽出
4 精度向上 要約 マルチタスク学習
5 参照要約 マルチタスク学習 学習方法

この事例では、どの手法もそれほど大きな違いがありませんでした。候補となるフレーズが少ないからという文章の特性もあるかと思いますが、概ね正しくキーフレーズを取得できていると思われます。

実験2: ニュース記事

バーレーンの首都マナマ(マナーマとも)で現在開催されているユネスコ(国際連合教育科学文化機関)の第42回世界遺産委員会は日本の推薦していた「長崎と天草地方の潜伏キリシタン関連遺産」 (長崎県、熊本県)を30日、世界遺産に登録することを決定した。文化庁が同日発表した。日本国内の文化財の世界遺産登録は昨年に登録された福岡県の「『神宿る島』宗像・沖ノ島と関連遺産群」に次いで18件目。2013年の「富士山-信仰の対象と芸術の源泉」の文化遺産登録から6年連続となった。

潜伏キリシタン関連遺産、世界遺産登録 - ウィキニュース

rank EmbedRank PositionRank termextract
1 世界遺産登録 バーレーン 登録
2 長崎県 首都 マナマ 世界遺産
3 ユネスコ(国際連合教育科学文化機関) 現在開催 文化遺産登録
4 首都マナマ(マナーマ マナーマ 関連遺産群
5 潜伏キリシタン関連遺産 マナマ 世界遺産登録

この事例では各手法で異なった結果となりました。これらの結果を見ると、termextractやPositionRankではキーフレーズの意味的な重複が多く含まれている一方で、EmbedRankはそのような傾向が見られず、上手く意味的な多様性を持たせつつも文中の重要単語が取得できいていることがわかります。

実験2の解釈

それでは実験2においてEmbedRankがどのようにキーフレーズを抽出したかを可視化してみようと思います。以下の図は、各文章埋め込みのベクトルをPCAで2次元に可視化した結果となっております。

f:id:yag_ays:20190312222728p:plain
https://speakerdeck.com/sansanbuildersbox/case-study-in-word-embedding

この図の中で、右下の★で示しているのが文章の埋め込みベクトル、その他の●が各キーフレーズの埋め込みベクトルの位置を表しています。赤い●がEmbedRankで選択されたフレーズ、それ以外が選択されなかったフレーズです。

単純に考えれば右下の★に近いフレーズほど文章の意味に近くキーフレーズとなりやすくなりますが、EmbedRankにおいてはMaximal Marginal Relevanceによって極力似た意味のフレーズは選択しないようなランクの付け方をされています。その結果、例えば左下では都道府県や地方のフレーズがあるなかで、唯一「長崎県」だけが選別され、あとの「熊本県」や「天草地方」といったフレーズは候補外となりました。また、右上の「世界遺産登録」や中央の「ユネスコ(国際連合教育科学文化機関) 」も同様に、近くにより文章埋め込みに近いフレーズがあるにもかかわらず、それ単体が選ばれるといった結果となりました。

まとめ

今回は文章埋め込みを用いて教師なしでキーフレーズ抽出を行うEmbedRankを紹介しました。文章の意味に近いフレーズを選択するときに、その埋め込み表現を使って類似度を計算してしまおうという試みは、とても分かりやすく直感的であると感じます。

一方で、EmbedRankが適用できないもしくは苦手とする事例としては、複数の意味を含む長文などが挙げられます。例えば叙述的な小説であったり、色々な観点で書かれた商品のレビュー記事の場合は、おそらく多様な意味を的確に網羅することができないのではないかと思います。文章中の意味の揺れのみならず、単語単位においても多義性などの問題が生じる可能性もあります。文章を区切ったり段落ごとに分けるなどのヒューリスティックな方法は試せそうですが、文章埋め込みが表現する意味をうまく扱うことができなければ、人間が考えるような文章の意味に即したキーフレーズにならないのではないかと思います。

その他にも候補となるフレーズの抽出方法の問題であったり、文章埋め込みの表現できる度合い、上位何件まで取得すべきかといったチューニングの余地は残っているものの、教師データを必要としない形で適用できるというのは大きな魅力には間違いないでしょう。今回はニュース記事を対象にその有効性を確認しましたが、その他の文章に対しても適用してみると面白いのではないかと思います。

参考

*1:論文中では、MMRを用いない手法をEmbedRank、用いる手法をEmbedRank++と区別しておりますが、両者にそれほど手法的な差異がないため、本記事ではEmbedRankとして統一して記載しています

© Sansan, Inc.