ABEJA Tech Blog

中の人の興味のある情報を発信していきます

日本語向け教師なしキーフレーズ抽出の検証

ABEJAでデータサイエンティストをしている藤原です。

先月開催された 言語処理学会第31回年次大会(NLP2025) に参加し、その際に 埋め込みモデルベースの教師なしキーフレーズ抽出における長文に対する抽出精度の改善 というタイトルで発表を行いました。今回はその発表内容について改めて紹介させていただきます。

発表概要としては、日本語のテキストに対して種々の教師なしキーフレーズ抽出手法を統一したインターフェースで実行できるようにツールを整備し、評価用データセットを構築して各種手法の性能比較を行いました。本記事では開発したツール・評価データセットなど原稿であまり触れられなかった部分や、より詳細な実験結果についても記載します。

開発したツール・評価データセットはこちらからご利用いただけます。GitHub - flatton/keyphrase_extraction_tools

はじめに

キーフレーズ抽出とは

キーワード抽出は文章中での重要な単語を抽出する技術で、キーフレーズ抽出は単語または複数の単語からなる "フレーズ" の単位で重要な語句を抽出するもので、情報検索や要約に活用されています。業務でもドキュメントへのタグ付けの際にキーフレーズ抽出のツールを活用することがあります。

なぜ埋め込みモデルか

今回の実験では埋め込みモデルを用いた手法に焦点を当てて精度改善するための検証を行いました。その理由としては

  • 統計量や単語の共起関係のグラフから抽出するアプローチは高速だが精度に限界がある
    • 埋め込みモデルを用いることで意味情報をより考慮した重要度が算出できる可能性がある
  • 生成モデルでキーフレーズを抽出(生成)するアプローチは高品質・高精度だが、コストを抑える/処理速度を早めるのが難しい
    • 埋め込みモデルは生成モデルに比べて軽量なため、コストを下げられる/処理速度を早められる可能性がある

といった課題を感じていたためです。(一番のきっかけは、埋め込みモデルベースのキーフレーズ抽出ツール KeyBERT が日本語の文章に適用するのにあまり向いておらず、使いづらく正確な性能が分からなかったことです。)また今回の実験では精度を高めることよりも精度改善の方向性を模索するために、新しい手法の提案よりも既存の手法の各要素を比較することに焦点を当てました。これは埋め込みモデルベースの先行研究の多くは重要度の算出に統計量も併用しており、各既存手法においてどの要素が精度に貢献しているか分かりづらかったためです。

キーフレーズ抽出の主な処理

キーフレーズ抽出では主に2つのステップで実現されます。

  1. 候補フレーズの選定
  2. 候補フレーズの重要度算出(&ランキング)

ただし、生成モデルを用いたキーフレーズ抽出(キーフレーズ生成)の場合はこれらの処理が内部で暗黙的に実行される形になり、プロンプトで指示してキーフレーズのリストを直接出力させる形になります。生成モデルを用いると、表記揺れの吸収や文章中に明記されていないフレーズの生成なども可能になります。NLP2025でポスター発表した際は生成モデルを用いたアプローチに関していくつかコメントをいただきました。具体的には、大規模なモデルを蒸留することで運用時のコストを抑えつつ抽出精度を高める、(社内文書などのドメインが概ね固定されている文書へのタグ付けであれば、)事前にタグの一覧を生成し未知のテキストにはその一覧の中から当てはまるものをタグとして付与することで運用時のコストをできる限り抑える、などが実際にいただいたコメントになります。生成モデルを使うか否か?使うとしたらどのように使うか?はユースケースや非機能要件、開発時のリソース次第ですが、これらのアプローチも有効なアプローチの一つだと思います。

先行研究

以下では候補フレーズの選定、候補フレーズの重要度算出のそれぞれについて先行研究で提案されている手法を説明します。

1. 候補フレーズの選定

候補フレーズの選定方法は主に以下の4種類があります。

  • N-gram(+ストップワード除去)
    • 統計量ベース、埋め込みモデルベースの手法で主に使われている(KeyBERTも)
  • 重要な単語を抽出して、文中で連続する単語同士を結合
    • TextRank [1]
  • 品詞・ストップワードでフィルタリングし、文中で連続する単語同士を結合
    • SingleRank [2]
  • 品詞・ストップワードでフィルタリングし、品詞の並びに基づいて名詞句などの句を形成(例えば、形容詞+名詞)
    • TopicRank [3], MultipartiteRank [4]

英語の場合は N-gram を採用しているケースが多い印象です。候補フレーズが少ない方が後段の重要度算出での処理を減らすことができるため、候補フレーズが増えやすい長い文章では品詞などの情報を使って候補フレーズを絞り込む方が全体の処理時間を抑えられる可能性があります。また、日本語の場合は分かち書きが必要で、その過程で同時に品詞情報も取得できるため、品詞での絞り込みを追加しても処理時間の増加はあまりないと考えられます。

2. 候補フレーズの重要度算出(&ランキング)

候補フレーズの(教師なし)重要度算出方法は大きく分けると以下の3種類があります。

  • 統計量ベース(KP-miner [5], YAKE! [6]など)
    • 出現頻度、Tf-Idf、候補フレーズの文中での最初の出現位置、フレーズ中の単語数、共起する単語の種類数、そのフレーズが含まれる文の数などを用いて重要度算出
  • グラフベース
    • 共起関係から無向グラフを構築し、 PageRank[7] のアルゴリズムで重要度を算出
  • 埋め込みモデルベース
    • 最もシンプルな手法ではフレーズと文章の類似度を重要度として用いる

グラフベース・埋め込みモデルベースの手法では統計量を用いて重要度を補正する手法も多く、中でも出現回数や出現位置などはよく用いられています。

埋め込みモデルベースの重要度算出手法

埋め込みモデルベースの手法では、基本的にはフレーズと文章の類似度を用いて重要度を算出します。 KeyBERT においてもフレーズと文章の類似度が重要度として用いられています。ただし、類似度のみでは似た意味のキーフレーズが多く抽出されるという課題があり、EmbedRank++ [8] ではフレーズと文章の埋め込みの類似度でのランキングに加えて,Maximum Marginal Relevance (MMR) [9]などのリランキングアルゴリズムによるキーフレーズの多様化が取り入れられています。 MMR などを用いたリランキングは KeyBERT でもサポートされています。

また、埋め込みベースのアプローチは長文に対する抽出精度が低いという課題もあります[10, 11]。この課題に対して先行研究では以下のような改善手法が提案されています。

  • SIFRank [12] :フレーズの出現位置で重み付け(出現頻度での補正も使用)
  • AttentionRank [13] :出現頻度でのフィルタリング
    • 手法のコアは「フレーズ自身の Self-Attention およびフレーズと文章の Cross-Attention から関連度を算出」する部分であるが、長文での性能には出現頻度でのフィルタリングの影響が大きいと分析されている
  • MDERank [14] :重要なフレーズほど文章から削除されると、その文章の意味が大きく変化するという仮定のもと、フレーズ部分をマスクした文章と元の文章との埋め込みの距離を算出し、距離が大きいほど重要なフレーズとみなす
    • フレーズと文章では情報量に差があるため、フレーズをマスクした文章を用いることで情報量のギャップを小さくすることが目的
  • PromptRank [15]: (埋め込みモデルベースとは言えないかもしれないが)Encoder-Decoder モデルに文章のメイントピックを予測させるプロンプトを入力し、候補フレーズの生成確率を用いて重要度を算出(出現位置と文字数で補正)

これらの手法間では使用している埋め込みモデルや出現頻度・出現位置の使用の有無などに差異があり、 "埋め込みモデルの使い方" という観点でどのアプローチが優れているか?が明らかではありません。そのため、本実験では精度改善の方向性を決めるために「"埋め込みモデルの使い方" という観点でどのアプローチが優れているか?」について比較を行いました。

リポジトリの説明

日本語用キーフレーズ抽出ツール

github.com

本ツールでは統計量ベース、グラフベース、埋め込みモデルベース、生成モデルベースでのキーフレーズ抽出をサポートしています。グラフベースおよび統計量ベースの手法は PKE の wrapper、埋め込みモデルベースのアプローチは KeyBERT の拡張、生成モデルベースのアプローチは langrila の拡張という形で実装しています。

基本的には

keyphrases = extractor.get_keyphrase(input_text="こんにちは", top_n_phrases=30)

という形式で各種キーフレーズ抽出モデルが利用できるようにする形で実装しています。統計量ベース、グラフベースの抽出器 ClassicalExtractor については、 candidate_selectioncandidate_weighting に渡す引数もまとめて ClassicalExtractor のインスタンス作成時に渡す形式にしています。埋め込みモデルベースの抽出器 SentenceEmbeddingBasedExtractor ではモデル名やプロンプトなどを設定するための EmbeddingModel と、抽出方法・条件を設定するための SentenceEmbeddingBasedExtractionConfig を引数として受け取ります。 SentenceEmbeddingBasedExtractionConfig では、KeyBERT でサポートされているリランキングや、本実験のために追加した文/チャンクの類似度でのフィルタリング、品詞の並びに基づく候補フレーズの形成の ON/OFF などが設定できます。生成モデルベースの抽出器 GenerationBasedExtractor の引数 system_prompt にプロンプトのテキストやパスを渡すことで、独自のプロンプトでキーフレーズ抽出を実行できます。

日本語用キーフレーズ抽出評価データセット

github.com

LLM開発用に収集したテキストデータセット ABEJA-CC-JA から文章を抽出しました。データ数としては200文字、2,000文字、20,000文字程度の日本語の文書を各33本ずつ収録しています。各文書について以下の方法でキーフレーズのアノテーションを実施しました。

  • 各文書に対して、以下のラベルを著者一人で付与
  • ラベルの種類
    • main_topic:その文書の主な話題となっている単語・フレーズ(データ型 - list[str])
    • angle:その文書がどのような視点・切り口で main_topic について論じているかを表現している単語・フレーズ(データ型 - list[str])
    • essential_terms:上記以外の文書の概要や重要箇所に関連性の高い単語・フレーズ、または、固有名詞、専門用語など(データ型 - list[list[str]])
  • アノテーション方式
    • main_topic および angle は一つの文書について一種類の単語・フレーズをアノテーション
      • 同じ意味の語句、言い換え表現、別名、省略表記なども正解とし、同じ種類の単語・フレーズを一つのリストとして保持
    • essential_terms は各文書について10種類前後の単語・フレーズのリストをアノテーション
      • main_topic および angle と同様、同じ種類の単語・フレーズは一つのリストにまとめており、単語・フレーズのリストのリストとして保持

実際のサンプルを例示します。テキストは以下の形式で収録されています。

{
    "length_200": [
        {
            "sample_id": "1",
            "text": "葉に濃淡のモザイク、えそ条斑、斑紋、萎縮、ねじれを生じ、花に斑入を生じる。\nイングンマメ黄斑モザイクウイルス(BYMV)、キュウリモザイクウイルス(CMV)によるが、BYMVによるものが多い。BYMVはアプラムシによって非永続型伝搬され、汁液伝染もする。CMVについてはユリモザイク病の項参照。\n各病原ウイルスの性質により、アプラムシ防除、消毒液による農具、種子、指の消毒、無病球根の導入などを行う。",
            "url": "https://www.agries-nagano.jp/pest/6130.html",
            "length": "200"
        },
...
}

対応するキーフレーズのラベルは以下の形式で収録されています。

{
    "length_200": [
        {
            "sample_id": "1",
            "main_topic": [
                "モザイクウイルス"
            ],
            "angle": [
                "病原ウイルス"
            ],
            "essential_terms": [
                [
                    "イングンマメ黄斑モザイクウイルス",
                    "BYMV"
                ],
                [
                    "キュウリモザイクウイルス",
                    "CMV"
                ],
                [
                    "ユリモザイク病"
                ],
                [
                    "アプラムシ"
                ],
                [
                    "非永続型伝搬"
                ],
                [
                    "汁液伝染"
                ],
                [
                    "アプラムシ防除"
                ],
                [
                    "無病球根"
                ]
            ]
        },
...
}

本実験の評価においては "main_topic", "angle", "essential_terms" の区別をせず、これらをまとめてキーフレーズ集合のリスト(list[set[str]])という形式で扱い、抽出器の性能評価に用いています。キーフレーズ集合の数(=キーフレーズの種類数)およびキーフレーズの数は以下のようになっています。

200文字 2,000文字 20,000文字
サンプル数 33 33 33
集合の数の平均 8.2 11.4 13.9
キーフレーズの数の平均 8.9 19.8 27.2

アノテーションを著者一人で行ったので、基本的には「どのようなものをキーフレーズに含めるか?」はサンプル間である程度一貫性があるはずですが、余分なキーフレーズが含まれていたり、不足しているケースも存在しているかもしれません。どのサンプルも最初から最後まで文章を読んで一通りの内容を把握した上で、文書の把握・説明に必要そうな単語やフレーズをキーフレーズとしてアノテーションしました。厳密なアノテーションガイドラインは作成していませんが、キーフレーズ抽出ツールの生成モデルベースの抽出器で用いているプロンプトがそれに近いものになっているはずです。

アノテーションの大変だった順に並べるとテキストの長さで 20,000 > 200 > 2,000 文字の順に大変でした。20,000 文字は単純に文章が長くて全部読むのが大変だったのと、文章が長くなると主題から逸れた話も増えてくるので、どこまでを重要な内容として含めるか判断するのが難しかったです。200 文字の方は文章が短いで読むのは簡単なのですが、最低限のキーフレーズを選ぶとしたらどれが不要か?を判断するのが難しかったです。一つの文書にアノテーションする時間としては、200文字は3~5分未満、2,000 文字は5~10分未満、20,000文字は30~40分程度かかった記憶です。(長文処理の性能を人間が測るのは限界がありそうだなと感じました。)

他に感じたのは多くの文書では先頭に近いところでその文書のほとんどのキーフレーズが登場しており、先行研究でよく用いられている文中での初出位置などが多くの文書で有効な特徴量であることが実感できました。とはいえ、小説やエッセイ、複数商品のレビューのようなチャプター毎に話題が変わることがある文書では、後半で初登場するフレーズもキーフレーズになることがあり、話題毎に文書を区切ってそれぞれからキーフレーズ抽出するなど、実用的には文書の特性に合わせて設計する必要があるように感じました。

実験

本実験では埋め込みモデルでの教師なしキーフレーズ抽出の性能改善を目的に 1. 候補フレーズの選定方法に関する比較、2. 候補フレーズの重要度算出方法に関する比較を行いました。また、 3. 最も性能が高った条件について埋め込みモデルを公開されている様々なモデルに変更しての性能比較や、 4. 統計量ベース・グラフベース・生成モデルベースの抽出器との性能比較を行いました。

実験内容

1. 候補フレーズの選定方法に関する比較

ここでは以下の3つのパターンを比較します。品詞・ストップワードでのフィルタリングなしでは候補フレーズが増えすぎてしまうため、全ての条件で使用しています。1-gram の場合は形態素がそのまま候補フレーズになるため、長いフレーズを抽出することができません。(1, 4)-gram では 2-gram, 3-gram, 4-gram が候補フレーズに追加されるため、長いフレーズを抽出できるようになります。また、品詞の並びに基づく句の形成を導入すると、名詞の連続などをその個数に依存せずにより正確に抽出できるようになります。

  • 1-gram
    • 分かち書きした後に、指定した品詞のリストのいずれかに該当し、かつ、ストップワードのリストに含まれないものを候補フレーズとする
  • (1, 4)-gram
    • 分かち書きした後に 1, 2, 3, 4-gram の一覧を取得し、2~4-gram についてはいずれかの形態素の品詞が指定した品詞のリストのいずれかに該当し、かつ、いずれかの形態素がストップワードのリストに含まれないものを候補フレーズとする
  • Grammar(1-gram+品詞の並びに基づく句の形成)
    • 句の形成:分かち書きした後に、指定した品詞のリストのいずれかに該当し、かつ、ストップワードのリストに含まれないもの、もしくは、品詞の並びが指定したルールに該当する句を候補フレーズとする

重要度の算出方法はフレーズと文章の類似度を重要度とする最もシンプルな方法で統一しました。

2. 候補フレーズの重要度算出方法に関する比較

候補フレーズの選定方法を Grammar に固定した上で、重要度の算出方法を以下の4つのパターンで比較します。

  • Simple(最もシンプルなフレーズと文章の類似度)
    • フレーズと文章の類似度で重要度ランキングを作成(類似度が高い=重要)
    • 仮説:重要なフレーズはその文章の全体的な意味を表現できている
  • Distance(MEDRank)
    • 「対象フレーズを削除した文章」と文章の距離で重要度ランキングを作成(距離が大きい=重要)
    • 仮説:重要なフレーズを削除した文章は元の文章から大きく意味が変化している
  • Prompt(PromptRank)
    • クエリプロンプトに文脈情報を追加した上で文章との類似度で重要度ランキングを作成(類似度が高い=重要)
    • 仮説:フレーズと文章の類似度では、個々のフレーズに含まれる情報量が少なく、文章が持つ情報量のギャップが性能低下を招いている
  • Filter(提案手法)
    • 文章と文/チャンクの類似度で重要な文/チャンクを絞り込む。その上で、重要な文/チャンク内から候補フレーズを選定。最終的なランキングは文章と文/チャンクの類似度、文/チャンクとフレーズの類似度のハイブリッドなランキングで決定(類似度が高い=重要)
    • 仮説:重要なフレーズは重要な文/チャンクの中に含まれている

Distance の条件では、まず候補フレーズを選定した後に、正規表現を用いて文章中から該当するフレーズを全てマスク([MASK]に置換)したものをクエリとしました。Prompt の条件では、以下の形式で target_phrase にフレーズ、 source_text に文/チャンクを代入しクエリテキストを作成しました。

f"次の本文における「{target_phrase}」の意味\n本文:\n{source_text}"

Filter の条件では、文章と文/チャンクの類似度のランキングと文/チャンクとフレーズの類似度のランキングから Reciprocal Rank Fusion のアルゴリズムで最終的なランキングの作成しました。開発したツールでは類似度スコアの平均値でランキングする方法も実装していますが、スコアの平均を用いる場合、文章と文/チャンクの類似度は低いが文/チャンクとフレーズの類似度が高いといったケースで文章全体としては重要でないフレーズも上位に抽出される、文章と文/チャンクの類似度が高い時にその文/チャンク内のフレーズの多くが上位に抽出されるなどの可能性が懸念されたため、そのような実装を行いました。

3. 埋め込みモデルを変更した場合の比較

候補フレーズの選定方法および重要度の算出方法を Grammar + Filter で固定した上で、以下の埋め込みモデルについて比較を行います。

ruri-small/base/large では Model Card を参考に、クエリ(フレーズや文/チャンク)の埋め込み時に クエリ: {query}、文章(文/チャンクや文章全体)の埋め込み時に 文章: {passage} というプロンプトを用いました。 intfloat/multilingual-e5-small/base/large では query: {query}passage: {passage} というプロンプトを用いました。intfloat/multilingual-e5-large-instruct ではクエリの埋め込みにのみ Instruct: Given a web search query, retrieve relevant passages where the query is used as the main topic or keywords.\nQuery: {query} というプロンプトを用いました。hotchpotch/static-embedding-japanese ではプロンプトを設定していません。

4. 統計量ベース・グラフベース・生成モデルベースの抽出器との比較

比較対象は以下の通りです。統計量・グラフベースのモデルは全て PKE で実装されているものになります。

  • 統計量ベース
    • Tf-Idf
    • KP-Miner
    • YAKE!
  • グラフベース
    • TextRank
    • SingleRank
    • TopicRank
    • MultipartiteRank
  • 生成モデルベース
    • GPT4o (2024-11-20 ver.)

生成モデルによる抽出では以下のプロンプトおよび出力形式(Structured Outputs)でキーフレーズ抽出を行いました。

# キーワード抽出プロンプト
あなたは高度な言語モデルです。以下の手順・条件に従って、入力された文章から「キーワード」を抽出してください。

## キーワードとは
- **文章全体のメイントピック** や **メイントピックと関連性の高いサブトピック**
- トピックについて **どのような視点・切り口** で論じているかを表す単語・語句
- **固有名詞**(人物名・作品名・地名など)や **専門的な用語**(科学用語、音楽用語、宗教用語など)
- 単語だけでなく **マルチワードの語句** もキーワードになり得る(例: 「東京オリンピック」「自然言語処理」)
- 固有名詞以外で文や長すぎるフレーズを抜き出すのは禁止

## 手順
1. **文章内容の把握**
   入力された文章を読み込み、文章のメイントピックとサブトピック、視点・切り口を整理してください。

2. **キーワード候補の洗い出し**
   - 文章中に登場する単語やフレーズのうち、上記の定義に該当しそうなものをすべて洗い出してください。
   - 抽出したキーワードの一覧で文章の概要が理解できることが重要なので、同じような意味の語句ばかり抽出しないようにしてください。
   - ただし、同義語や形態が異なる語(例: 単数形・複数形など)があっても、それぞれが文章理解に不可欠な場合は別々に取り扱っても構いません。

3. **キーワード数の調整**
   - 抽出するキーワードの総数は最大で **N** 件とします(**N** は文章と共に与えます)。
   - 必要なキーワードを **過不足なく** 抽出してください。

4. **重要度の付与 (0〜1)**
   - 抽出した各キーワードに対して、 **0〜1** の範囲で「重要度スコア」を付与してください。
   - **1** に近いほど、文章を要約・説明するうえで「最重要」とみなすキーワードです。
   - **0** に近いほど、メインの議論や内容からやや逸れている、あるいは優先度が低いキーワードです。
   - 例:
     - **1.0**: 文章の主題や中心的な概念・人物・場所など
     - **0.5**: 文章内で言及はされているが、脇役のトピックや補足的情報
     - **0.0**: 必要性が薄い単語(頻出の接続詞など)や、メインと無関係
from pydantic import BaseModel

class Keyphrase(BaseModel):
    phrase: str
    score: float

class ResponseSchema(BaseModel):
    keyphrases: list[Keyphrase]

評価指標

以下の2つの指標で評価を行いました。詳細は原稿を参照ください。

  1. 適合率(Precision@K):抽出された上位K個のキーフレーズのうち、正解のキーフレーズ群に含まれたものの割合
  2. 再現率(Recall@K):正解のキーフレーズ集合のうち、抽出されたの上位K個のフレーズを一つでも含む集合の割合

また、処理時間[s](モデルのロード時間を除く)についても計測しています。ただし、全て M2 MacBook Pro で実施し、各モデル一度しか処理時間を計測できていないため、処理時間については正確な値ではなく目安程度の値になっています。いずれの指標についても「平均値 ± 標準偏差」の形で結果記載します。

その他の実験条件

埋め込みモデルベースのキーフレーズ抽出では Mac の MPS を用いて埋め込み処理を実行しました。バッチサイズは 32 に固定しました。PKE内での分かち書き処理でエラーが出たため、20,000 文字のテキストに対するキーフレーズ抽出では10,000 文字で文章を分割して別々にキーフレーズ抽出を実行し、得られた2つの抽出結果をそのスコアで再度ソートして一つのランキングに統合し、その上位を抽出結果としました。

実験結果

1. 候補フレーズの選定方法に関する比較

2,000 文字以下のテキストにおいては Recall@10/25, Precision@10/25 のいずれにおいても Grammar が最も高いスコアを示しました。一方で、 20,000 文字のテキストについては @10(上位10個の抽出結果に対してのスコア) では 1-gram が、@25 では Precision は 1-gram と Grammar が同程度で、 Recall は Grammar が最も高いスコアを示しました。処理時間については 200 文字のテキストでは差がつかなかったですが、2,000 文字以上では Grammar が最も低くなりました。

@k Approach 200 chars Precision (↑) 200 chars Recall (↑) 200 chars ProcessTime (↓) 2k chars Precision (↑) 2k chars Recall (↑) 2k chars ProcessTime (↓) 20k chars Precision (↑) 20k chars Recall (↑) 20k chars ProcessTime (↓)
@10 1-gram 0.25 ± 0.14 0.32 ± 0.17 0.01 ± 0.00 0.30 ± 0.15 0.27 ± 0.15 0.03 ± 0.00 0.17 ± 0.13 0.13 ± 0.11 0.29 ± 0.02
(1, 4)-gram 0.09 ± 0.10 0.11 ± 0.11 0.01 ± 0.00 0.04 ± 0.06 0.04 ± 0.06 0.09 ± 0.01 0.03 ± 0.07 0.02 ± 0.05 0.79 ± 0.08
Grammar 0.46 ± 0.14 0.58 ± 0.16 0.01 ± 0.00 0.34 ± 0.13 0.30 ± 0.11 0.02 ± 0.00 0.15 ± 0.11 0.12 ± 0.10 0.16 ± 0.01
@25 1-gram 0.12 ± 0.06 0.39 ± 0.18 0.01 ± 0.00 0.17 ± 0.07 0.39 ± 0.15 0.03 ± 0.00 0.12 ± 0.07 0.22 ± 0.15 0.29 ± 0.02
(1, 4)-gram 0.07 ± 0.05 0.20 ± 0.14 0.01 ± 0.00 0.03 ± 0.03 0.07 ± 0.06 0.09 ± 0.01 0.02 ± 0.04 0.03 ± 0.07 0.79 ± 0.08
Grammar 0.24 ± 0.07 0.75 ± 0.17 0.01 ± 0.00 0.23 ± 0.08 0.50 ± 0.14 0.02 ± 0.00 0.12 ± 0.06 0.24 ± 0.13 0.16 ± 0.01

より細かな分析のために、2,000 文字のサンプル(id: 65)について見てみます。正解ラベルとして付与したキーフレーズは「人月の神話、プログラミング、ブルックスの法則、好きこそ物の上手なれ、データサイエンス、新しい知見、創造性」などになります。正解に一致する、または、意味的にかなり類似している単語を Gemini 2.5 Pro experimental にハイライトしてもらいました。上から順に重要度(類似度)が最も高かったフレーズになっています。

ハイライトされている単語の割合は高い順に (1, 4)-gram > Grammar > 1-gram という順になっています。しかしながら、(1, 4)-gram ではプログラム/プログラミングを含むフレーズが大半であり、多様なキーフレーズが抽出できていません。多様性についてはリランキングで多少緩和できる可能性がありますが、フレーズ候補数が増えると埋め込み・類似度計算の回数が増えて処理時間が増加するため、似たフレーズは候補に含めないようにするといった対策が必要になりそうです。*1また、文章にタグをつけるという観点で見ると、不自然な部分で途切れたフレーズも多い印象です。

次に Grammar についてはタグとして見てもある程度綺麗なフレーズが多い印象です。また、品詞の並びでフレーズを絞り込んでいるため、 (1, 4)-gram よりは多様なフレーズが抽出されています。1-gram も同様に、抽出結果にある程度多様性はありますが、タグとして見るとそれだけでは本文中での意味がよく分からない/短すぎるものが多く抽出されている印象です。

1-gram (1, 4)-gram Grammar
プログラミング なぜ、プログラミング プログラミング
プログラム開発 。 なぜ 、 プログラミング プログラム開発
プログラム なぜ 、 プログラミング やる プログラム
作り上げる プログラム開発の プログラム作品
創造性 プログラム 使う こと 理解 楽しいわけ
作る プログラミング プラモデル作り
コンピューター プログラミング 創造性
作れ プログラミング やる の ソフトウェアプロジェクト
設計 プログラム開発 の コスト 人月 コンピューター
プロジェクト プログラム 使う こと 設計思想
なぜ プログラム 作れ ば プロジェクト
ソフトウェア 人々 役立つ 作る こと 人間
増やす プログラミングのネタ 1人月
人間 プログラミング やる 人月
作り 喜びプログラミング 楽しく
人月 プログラム 作れ ば あっ 楽しい
楽しく 喜びプログラミング パズル
楽しい コンピューター 使う こと 創造性
パズル プログラム開発のコスト
プログラム開発 複雑
役立つ プログラム 作品 いろいろ 作る 楽し
作業 プログラミング やる の 組み立て部品
サイエンス プログラム 作れ 人々
組み立て いう 喜びプログラミング ブルックス
考え 作ることの楽し 関数

一方で、 Precision/Recall での評価では 20,000 文字のテキストにおいては 1-gram の方が Grammar より優れている可能性が示唆される結果となっていました。こちらも実際の抽出結果を見てみます。一つ注意点として、 2,000 文字以下のサンプルでは一つのテキストから 25 個のキーフレーズを抽出していますが、20,000文字のサンプルでは 10,000 文字ずつに分割して、それぞれから 25 個のキーフレーズを抽出し、50個のキーフレーズを重要度でソートした上でその上位を評価に用いています。

このサンプルの正解ラベルは「音、聴覚、周波数、音高、音量、音色、周波数特性、サンプリング、圧縮」などです。先ほど同様 Gemini で正解のキーフレーズに近いものをハイライトすると以下のようになります。このサンプルでは正解ラベルに短いフレーズが多いので 1-gram でも抽出しやすいという文書自体の性質もあり、 1-gram の方がより正解のキーフレーズに合致するものを上位に抽出できています。

Grammar の抽出結果の問題点は、音の解説の中で具体例として用いられている「ハイレゾ音源、音楽CD、音楽再生用メディア」といったフレーズが上位のキーフレーズとして抽出されていることです。要因の一つとして、フレーズ自体が本来の正解フレーズよりもやや長いために類似度が高くなったことが考えられます。これは文章が長くなると指定した品詞の並びに合致する長い候補フレーズの数が増え、長いフレーズの方が文章との類似度が高くなったと考えられます。また、これらのフレーズはいずれも文章の後半(10,000文字目以降)で登場するフレーズです。そのため既存手法のように出現位置でフィルタリングすれば除外できるフレーズと考えられます。*2これらを解消するには既存手法のように、フレーズの長さや出現位置による重み付け・フィルタリングを用いる必要がありそうです。

1-gram Grammar
ハイレゾ
音高 音楽CD
音高(ピッチ)
音圧 音高
音程 音楽用CD
聴覚 音圧
音量 音楽再生用メディア
(ラ) 音程
音波 CDプレイヤー
音楽 聴覚
CD 高い
騒音 音量
音長 音波
(ド) 音楽
SACD CD
音源 コピーコントロールCD
音色 質CD
音質 いわゆる
聴こえ 音楽CD並み
周波数 騒音
高音 音長
SACD
音速 音源
オーディオ 音色
音階 大きな
聴こえる 音楽レコード
気圧
レコード 高い(ド)
楽器 同じ音圧
オクターブ 良い音楽データ
ディスク 周波数
符号化
ハードディスク
DVD
エンコード 小さな
ハードウェア 低い
リッピング Advanced Audio Coding
iTunes CD並
ストリーミング 聞き取れる最大音量
Audio 音量
Music 光ディスク
楽曲 以外
洋楽 音楽ファイル
デジタル 音楽データファイル
ソフトウェア 音楽データ
着うた レコード盤
CCCD 音楽用テープ
着メロ Super Audio CD
MP レコード
ハイレゾ コピー防止機能付きCD
携帯 オーディオ圧縮
AAC 音楽テープ
データ オーディオ機器
3 オーディオ圧縮形式
再生 データ再生ソフト
プレイヤー 携帯プレイヤー
機器 再生用
増え MP
良い ソフトウェア
ため AAC
呼ぶ 3
すべて 再生
必要 機器
いる ため
すべて
必要
専用 専用

2. 候補フレーズの重要度算出方法に関する比較

200 文字では Simple が最も Precision/Recall が高く、Filter はそれと同程度や少しだけ劣る結果になりました。2,000文字以上では Filter の方が Precision/Recall が高いですが大幅な精度改善はできておらず、その一方で処理時間は Simple に比べて数倍程度に増加しており、あまり良いトレードオフにはなりませんでした。Mask, Prompt の条件は抽出精度が Simple にもかなり劣る結果になりました。これらの手法がうまくいかなかった要因はマスクの方法や文脈情報の補い方が良くなかった可能性があります。

@k Approach 200 chars Precision (↑) 200 chars Recall (↑) 200 chars ProcessTime (↓) 2k chars Precision (↑) 2k chars Recall (↑) 2k chars ProcessTime (↓) 20k chars Precision (↑) 20k chars Recall (↑) 20k chars ProcessTime (↓)
@10 Simple 0.46 ± 0.14 0.58 ± 0.16 0.01 ± 0.00 0.34 ± 0.13 0.30 ± 0.11 0.02 ± 0.00 0.15 ± 0.11 0.12 ± 0.10 0.16 ± 0.01
Mask 0.30 ± 0.18 0.38 ± 0.22 0.01 ± 0.00 0.15 ± 0.11 0.13 ± 0.09 0.02 ± 0.00 0.03 ± 0.05 0.02 ± 0.03 0.18 ± 0.01
Prompt 0.38 ± 0.15 0.48 ± 0.19 0.02 ± 0.00 0.27 ± 0.11 0.24 ± 0.08 0.26 ± 0.05 0.14 ± 0.09 0.11 ± 0.07 2.21 ± 0.43
Filter 0.43 ± 0.11 0.55 ± 0.13 0.03 ± 0.01 0.40 ± 0.11 0.36 ± 0.10 0.11 ± 0.01 0.23 ± 0.14 0.18 ± 0.12 0.45 ± 0.09
@25 Simple 0.24 ± 0.07 0.75 ± 0.17 0.01 ± 0.00 0.23 ± 0.08 0.50 ± 0.14 0.02 ± 0.00 0.12 ± 0.06 0.24 ± 0.13 0.16 ± 0.01
Mask 0.20 ± 0.08 0.64 ± 0.23 0.01 ± 0.00 0.14 ± 0.09 0.28 ± 0.15 0.02 ± 0.00 0.03 ± 0.04 0.06 ± 0.06 0.18 ± 0.01
Prompt 0.22 ± 0.06 0.71 ± 0.18 0.02 ± 0.00 0.17 ± 0.06 0.36 ± 0.11 0.26 ± 0.05 0.09 ± 0.05 0.18 ± 0.12 2.21 ± 0.43
Filter 0.24 ± 0.07 0.74 ± 0.17 0.03 ± 0.01 0.24 ± 0.08 0.53 ± 0.15 0.11 ± 0.01 0.16 ± 0.06 0.31 ± 0.14 0.45 ± 0.09

先ほどと同じく 2,000 文字のサンプルに対する抽出結果を見てみます。それぞれ Simple と比較してどのような違いがあるか分析します。

まずMaskに関しては比較的うまく抽出できているサンプルであり、他のサンプルでは「お」「車」のような一文字だけのキーフレーズも多く抽出されていました。Maskの方法として、マスク対象のフレーズと正規表現で一致したフレーズを全てマスクしたため、同じ文章の中にたくさん登場する単語や一文字だけの単語などが多く抽出された可能性があります。その上で、抽出結果の多様性としては Simple よりも高い印象ですが、正解のキーフレーズに該当する/近い意味のものは数としては少ない印象です。

次に Prompt は上位3個のキーフレーズは Simple と同じく偏りがあります。また、5~8位「わけ、こと、実際、理解」といった単語は単体では文中での意味が把握できず、正解のキーフレーズにも該当/類似するものがない重要性の低いフレーズです。プロンプトで文脈情報を補う場合、対象のフレーズがあまり意味を持たず、追加した文脈情報の方がクエリの持つ情報として支配的になってしまい、類似度が高くなった可能性があります。

最後に Filter はある程度多様に重要なフレーズを上位に抽出できていますが、「質問、答え」といった正解には含まれないフレーズも上位に抽出されています。Filter は文と文章、フレーズと文でそれぞれ類似度を出すため、文と文章の類似度が高いとフレーズと文の類似度が低くても上位に抽出される可能性があります。また、二つの類似度から最終的な重要度を算出するためにランキングマージを用いているため、ランキングの多様性が高まっている一方で、類似度の値としてはそれほど高くないフレーズも上位で抽出された可能性があります。また Simple で抽出できていないキーフレーズは基本的に Filter でも抽出できていない傾向にあり、根本的に埋め込みモデルの使い方を見直す必要がありそうです。

Simple Mask Prompt Filter
プログラミング ソフトウェアプロジェクト プログラミング 人月
プログラム開発 コミュニケーション プログラム プログラミング
プログラム データサイエンス プログラム開発 1人月
プログラム作品 プラモデル作り 楽しいわけ 質問
楽しいわけ プログラム作品 わけ ブルックス
プラモデル作り プロジェクト こと 楽しいわけ
創造性 大規模システム 実際 答え
ソフトウェアプロジェクト コンピューター 理解 プロジェクト
コンピューター ビッグデータ コンピューター プログラム開発
設計思想 プログラム開発 ブルックス プラモデル作り
プロジェクト ブルックス プログラム作品 理路整然
人間 組み立て部品 前職 楽し
1人月 プログラミング 本題 追加要因
人月 楽しいわけ 人月 月数
楽しく 理路整然 楽しく 問い
楽しい 600万 楽しい プログラム作品
パズル 1975 上手 ソフトウェアプロジェクト
子供たち 様子 喜び
ブルックス ころ プログラム
複雑 新しいこと 設計思想 好き
楽し 新しい発見 うまく 完成品
組み立て部品 100万 分野 人数
人々 設計思想 自分 組み立て部品
ブルックス テキスト 1人月 作品
関数 サイコロ 好き コスト

3. 埋め込みモデルを変更した場合の比較

モデルサイズで比較すると、2,000文字以下のテキストでは small サイズのモデルで最も高い Precision/Recall を示しました。一方で、 20,000 文字以上のテキストでは large サイズのモデルが僅かに勝り最も Precision/Recall を示しました。処理時間については複数のモデルをまとめて評価した場合に、キャッシュなどの影響で処理速度が低下することがあり、正確な計測ができませんでした。 その上でも hotchpotch/static-embedding-japanese は他に比べて処理時間がかなり短く、モデルサイズやCPUのみで動かしたのもあり高速に処理できていることが確認できました。

@k Approach 200 chars Precision (↑) 200 chars Recall (↑) 200 chars ProcessTime (↓) 2k chars Precision (↑) 2k chars Recall (↑) 2k chars ProcessTime (↓) 20k chars Precision (↑) 20k chars Recall (↑) 20k chars ProcessTime (↓)
@10 cl-nagoya/ruri-small 0.46 ± 0.13 0.58 ± 0.17 0.04 ± 0.02 0.42 ± 0.12 0.38 ± 0.11 0.15 ± 0.04 0.23 ± 0.12 0.18 ± 0.10 0.55 ± 0.14
cl-nagoya/ruri-base 0.43 ± 0.11 0.55 ± 0.13 0.03 ± 0.01 0.40 ± 0.11 0.36 ± 0.10 0.11 ± 0.01 0.23 ± 0.14 0.18 ± 0.12 0.45 ± 0.09
cl-nagoya/ruri-large 0.44 ± 0.13 0.56 ± 0.16 0.17 ± 0.08 0.39 ± 0.10 0.35 ± 0.09 0.80 ± 0.17 0.24 ± 0.15 0.19 ± 0.13 2.02 ± 0.45
intfloat/multilingual-e5-small 0.46 ± 0.13 0.59 ± 0.17 0.15 ± 0.06 0.37 ± 0.11 0.34 ± 0.11 0.29 ± 0.06 0.19 ± 0.13 0.15 ± 0.10 1.36 ± 0.53
intfloat/multilingual-e5-base 0.45 ± 0.14 0.58 ± 0.19 0.19 ± 0.07 0.39 ± 0.14 0.35 ± 0.11 0.39 ± 0.07 0.20 ± 0.11 0.16 ± 0.11 1.74 ± 0.51
intfloat/multilingual-e5-large 0.43 ± 0.14 0.55 ± 0.19 0.02 ± 0.01 0.40 ± 0.10 0.36 ± 0.10 0.18 ± 0.03 0.21 ± 0.10 0.16 ± 0.09 0.69 ± 0.10
intfloat/multilingual-e5-large-instruct 0.44 ± 0.13 0.56 ± 0.17 0.09 ± 0.03 0.36 ± 0.11 0.32 ± 0.08 0.22 ± 0.02 0.21 ± 0.10 0.16 ± 0.09 0.84 ± 0.11
hotchpotch/static-embedding-japanese 0.42 ± 0.15 0.54 ± 0.20 0.00 ± 0.00 0.35 ± 0.15 0.32 ± 0.13 0.01 ± 0.00 0.20 ± 0.14 0.15 ± 0.11 0.06 ± 0.01
@25 cl-nagoya/ruri-small 0.24 ± 0.07 0.74 ± 0.17 0.04 ± 0.02 0.25 ± 0.07 0.55 ± 0.14 0.15 ± 0.04 0.15 ± 0.05 0.28 ± 0.12 0.55 ± 0.14
cl-nagoya/ruri-base 0.24 ± 0.07 0.74 ± 0.17 0.03 ± 0.01 0.24 ± 0.08 0.53 ± 0.15 0.11 ± 0.01 0.16 ± 0.06 0.31 ± 0.14 0.45 ± 0.09
cl-nagoya/ruri-large 0.24 ± 0.07 0.74 ± 0.18 0.17 ± 0.08 0.25 ± 0.07 0.56 ± 0.13 0.80 ± 0.17 0.16 ± 0.06 0.31 ± 0.12 2.02 ± 0.45
intfloat/multilingual-e5-small 0.24 ± 0.06 0.75 ± 0.17 0.15 ± 0.06 0.24 ± 0.07 0.53 ± 0.13 0.29 ± 0.06 0.15 ± 0.05 0.29 ± 0.12 1.36 ± 0.53
intfloat/multilingual-e5-base 0.24 ± 0.06 0.75 ± 0.17 0.19 ± 0.07 0.24 ± 0.08 0.52 ± 0.13 0.39 ± 0.07 0.13 ± 0.05 0.26 ± 0.12 1.74 ± 0.51
intfloat/multilingual-e5-large 0.24 ± 0.06 0.74 ± 0.17 0.02 ± 0.01 0.24 ± 0.07 0.53 ± 0.14 0.18 ± 0.03 0.14 ± 0.05 0.28 ± 0.13 0.69 ± 0.10
intfloat/multilingual-e5-large-instruct 0.23 ± 0.07 0.73 ± 0.18 0.09 ± 0.03 0.25 ± 0.07 0.56 ± 0.16 0.22 ± 0.02 0.15 ± 0.06 0.28 ± 0.14 0.84 ± 0.11
hotchpotch/static-embedding-japanese 0.24 ± 0.07 0.74 ± 0.17 0.00 ± 0.00 0.23 ± 0.08 0.50 ± 0.18 0.01 ± 0.00 0.14 ± 0.07 0.26 ± 0.13 0.06 ± 0.01

cl-nagoya/ruri-smallcl-nagoya/ruri-largeintfloat/multilingual-e5-smallintfloat/multilingual-e5-large の抽出結果を見てみます。パッとみた印象としては、モデルの種類・サイズであまり大きな差異は見受けられません。Gemini にも分析してもらうと

  • ruri系 vs e5系: ruri系の方が、文中の表現(「楽しいわけ」など)をそのまま抽出しやすい傾向があるかもしれません。対照的にe5系は、「非線形」「コスト」「神話」のような、より抽象的または専門的な概念を抽出する傾向が見られます。
  • small vs large: モデルサイズが大きいlargeの方が、smallに比べて具体的な固有名詞(ブルックス)や専門的な複合語(ソフトウェアプロジェクト)を上位に抽出しやすい傾向が、両モデルファミリー(ruri, e5)で共通して見られるようです。smallモデルは、より一般的、あるいは文脈依存の強い単語が混ざりやすい可能性があります。

という回答が返ってきました。他のサンプルも確認してみると、確かに large モデルの方が固有名詞や長めの専門用語がより上位に抽出されていそうな傾向がありました。ruri と multilingual-e5 の違いはざっと眺めた程度だとあまり特徴的なものは見られず、「抽象的または専門的な概念を抽出する傾向」などは判断できませんでした。そこで、ruri-large および multilingual-e5-large の全ての抽出結果を Gemini に与えて、全体的な傾向を分析してもらいました。

Gemini の回答

  • 固有名詞・専門用語: 両モデルとも固有名詞や専門用語の抽出能力は高いですが、ruri-largeの方がより長い複合語や、ややマイナーな固有名詞(例: sample_id: 2の「年本名原富太郎」「下村観山ら新進画家たち」、sample_id: 87の「野上記念法政大学能楽研究所所蔵」)を抽出する傾向が見られます。e5-largeも専門用語は抽出しますが、より一般的で中心的な用語(例: sample_id: 63の「チタンヒドリド化合物」「窒素分子」)を優先する傾向があるかもしれません。
  • 概念・抽象語: e5-largeの方が、やや抽象的な概念や分野名(例: sample_id: 65の「非線形」「神話」、sample_id: 78の「エネルギー転換」「電力独立システム」)を捉えるのが得意な可能性があります。ruri-largeも抽出しますが、頻度や順位が異なる場合があります。
  • 文中の表現: 前回の分析通り、ruri-largeは「楽しいわけ」(sample_id: 65)のような、より口語的、あるいは文脈依存の強い表現を抽出する傾向が一部見られます。e5-largeは比較的、より客観的・辞書的な表現を選ぶ傾向があるようです。
  • ノイズ: 両モデルとも、数字や記号、一般的すぎる単語(「もの」「こと」「ため」「年」「日」など)を抽出してしまうことがあります。特に短い文書(length_200)ではこの傾向が顕著です。長文(length_20000)では、特定のトピックに偏った結果(例: sample_id: 67の植物名、sample_id: 68の人名・会社名)が見られ、ノイズというよりは文書内の局所的な情報に強く影響されている様子がうかがえます。

実際に該当する id のサンプルを中心に抽出結果を確認しましたが、固有名詞・専門用語、概念・抽象語に関してはサンプルによって傾向が違っており、全体的な傾向としてはどちらかのモデルで固有名詞・専門用語、概念・抽象語を抽出しやすいというのはあまりない印象です。次の文中の表現については、ruri の方が「口語的、あるいは文脈依存の強い表現を抽出を抽出できている」というのは少しありそうで、「楽しいわけ」「恐ろしい極刑」「息子さんたち」といったフレーズを上位で抽出していました(重要なフレーズかと言われると微妙ですが)。ノイズに関してはモデルに共通していて、候補の選定方法の問題だと考えられます。

他に Gemini が書いてくれなかった点として、(ruriでも上位25個の中に含まれているものの) multilingual-e5 の方がややローマ字や英語のフレーズをより上位に抽出している傾向がありそうでした。

ruri-small ruri-large multilingual-e5-small multilingual-e5-large
プログラミング 人月 人月 ソフトウェアプロジェクト
理路整然 1人月 ブルックス ブルックス
人月 ブルックス コスト 1人月
好き 人数 本題 人月
上手 月数 設計思想 プログラミング
1人月 ソフトウェアプロジェクト 1人月 法則
プロジェクト 法則 非線形 非線形
答え ブルックス ソフトウェアプロジェクト 好き
楽しいわけ プログラミング 法則 神話
プログラム開発 追加要因 月数 月数
プログラム 人員 質問 人員
追加要因 大規模システム 質問
問い 追加要因
当教室 楽しいわけ 神話 実験
月数 設計思想 プラモデル作り プログラム開発
楽し 質問 追加要因 本題
人数 本題 プログラミング 答え
新しいこと 大規模システム 人数 大規模システム
質問 プログラム 古典 プロジェクト
感動もの 当教室 楽しいわけ コスト
ゲーム プロジェクト プログラム作品 プログラム
ソフトウェアプロジェクト 楽し 要因 理路整然
最初 好き 某大企業
喜び 問い 複雑 人数
実験 非線形 プログラム開発 完成品

4. 統計量ベース・グラフベース・生成モデルベースの抽出器との比較

基本的には GPT4o を用いた生成が最も Precision/Recall が高く、 200 文字のテキストに対する Recall/Precision@25 のみ ruri-large を用いた抽出が GPT4o に僅かに勝り最も高いスコアを示しました。 GPT4o を除くと、2,000文字以下では埋め込みモデルベースの手法が最も高い Precision/Recall を示しましたが、 20,000 文字では MultipartiteRank に劣るスコアとなりました。

生成モデルの性能に関しては、今回の評価方法は少し不利な部分があり、その影響が考えられます。具体的には、今回は抽出タスクであることを重視して、(大文字小文字、スペースの有無などは正規化した上で)文中の表記と異なるフレーズは不正解扱いになります。生成モデルはフレーズとして綺麗な形になるように整形して出力することがあるため、本質的には正解のフレーズも今回の評価では不正解になっているケースが存在します。

@k Approach 200 chars Precision (↑) 200 chars Recall (↑) 200 chars ProcessTime (↓) 2k chars Precision (↑) 2k chars Recall (↑) 2k chars ProcessTime (↓) 20k chars Precision (↑) 20k chars Recall (↑) 20k chars ProcessTime (↓)
@10 cl-nagoya/ruri-large 0.44 ± 0.13 0.56 ± 0.16 0.17 ± 0.08 0.39 ± 0.10 0.35 ± 0.09 0.80 ± 0.17 0.24 ± 0.15 0.19 ± 0.13 2.02 ± 0.45
Tf-Idf 0.18 ± 0.11 0.24 ± 0.14 0.02 ± 0.00 0.33 ± 0.13 0.29 ± 0.10 0.02 ± 0.00 0.26 ± 0.15 0.19 ± 0.11 0.08 ± 0.01
KP-Miner 0.04 ± 0.06 0.05 ± 0.10 0.02 ± 0.00 0.30 ± 0.14 0.26 ± 0.11 0.02 ± 0.00 0.22 ± 0.13 0.17 ± 0.11 0.08 ± 0.01
YAKE! 0.15 ± 0.13 0.19 ± 0.15 0.01 ± 0.00 0.28 ± 0.14 0.25 ± 0.13 0.01 ± 0.00 0.24 ± 0.15 0.17 ± 0.10 0.05 ± 0.01
TextRank 0.35 ± 0.16 0.44 ± 0.19 0.01 ± 0.00 0.17 ± 0.13 0.15 ± 0.13 0.01 ± 0.00 0.06 ± 0.08 0.05 ± 0.06 0.05 ± 0.01
SingleRank 0.34 ± 0.18 0.44 ± 0.22 0.01 ± 0.00 0.22 ± 0.15 0.20 ± 0.14 0.01 ± 0.00 0.11 ± 0.10 0.08 ± 0.08 0.05 ± 0.01
TopicRank 0.25 ± 0.15 0.31 ± 0.18 0.01 ± 0.00 0.29 ± 0.16 0.25 ± 0.13 0.01 ± 0.00 0.27 ± 0.17 0.20 ± 0.12 0.05 ± 0.01
MultipartiteRank 0.28 ± 0.18 0.35 ± 0.23 0.01 ± 0.00 0.32 ± 0.15 0.29 ± 0.14 0.01 ± 0.00 0.30 ± 0.16 0.22 ± 0.12 0.06 ± 0.01
GPT4o (ver. 2024-11-20) 0.52 ± 0.16 0.65 ± 0.19 0.12 ± 0.11 0.54 ± 0.18 0.49 ± 0.17 0.17 ± 0.04 0.45 ± 0.16 0.34 ± 0.15 1.02 ± 0.09
@25 cl-nagoya/ruri-large 0.24 ± 0.07 0.74 ± 0.18 0.17 ± 0.08 0.25 ± 0.07 0.56 ± 0.13 0.80 ± 0.17 0.16 ± 0.06 0.31 ± 0.12 2.02 ± 0.45
Tf-Idf 0.13 ± 0.08 0.41 ± 0.24 0.02 ± 0.00 0.21 ± 0.09 0.46 ± 0.17 0.02 ± 0.00 0.16 ± 0.08 0.29 ± 0.13 0.08 ± 0.01
KP-Miner 0.02 ± 0.03 0.05 ± 0.10 0.02 ± 0.00 0.13 ± 0.08 0.29 ± 0.14 0.02 ± 0.00 0.11 ± 0.07 0.21 ± 0.13 0.08 ± 0.01
YAKE! 0.07 ± 0.06 0.22 ± 0.19 0.01 ± 0.00 0.17 ± 0.09 0.37 ± 0.18 0.01 ± 0.00 0.14 ± 0.08 0.26 ± 0.12 0.05 ± 0.01
TextRank 0.23 ± 0.06 0.72 ± 0.15 0.01 ± 0.00 0.15 ± 0.08 0.34 ± 0.19 0.01 ± 0.00 0.06 ± 0.06 0.12 ± 0.11 0.05 ± 0.01
SingleRank 0.23 ± 0.06 0.72 ± 0.16 0.01 ± 0.00 0.18 ± 0.08 0.39 ± 0.19 0.01 ± 0.00 0.09 ± 0.07 0.16 ± 0.12 0.05 ± 0.01
TopicRank 0.11 ± 0.06 0.33 ± 0.20 0.01 ± 0.00 0.18 ± 0.10 0.38 ± 0.20 0.01 ± 0.00 0.16 ± 0.08 0.28 ± 0.14 0.05 ± 0.01
MultipartiteRank 0.12 ± 0.08 0.38 ± 0.24 0.01 ± 0.00 0.20 ± 0.11 0.43 ± 0.19 0.01 ± 0.00 0.17 ± 0.08 0.31 ± 0.14 0.06 ± 0.01
GPT4o (ver. 2024-11-20) 0.23 ± 0.08 0.72 ± 0.18 0.12 ± 0.11 0.30 ± 0.10 0.66 ± 0.16 0.17 ± 0.04 0.26 ± 0.09 0.49 ± 0.18 1.02 ± 0.09

埋め込みモデルベース(ruri-large 使用)、MultipartiteRank、生成モデルベース(GPT4o使用)の抽出結果を見てみます。GPT4o はフレーズの候補を作る際に品詞のルールや文中での表現に縛られないため、抽出されるフレーズとしては綺麗で意味が伝わる適切な長さのフレーズになっています。また、抽出結果の多様性も高いです。

埋め込みモデルベースと MultipartiteRank を比較すると、 MultipartiteRank では「人月」というこの文書のメイントピックに当たるキーフレーズを抽出できていません。一方で、埋め込みモデルベースの手法は「本、年、最初、問い」といった文書の内容を把握するのには重要でないものも多く抽出されており、MultipartiteRank の方が文書の内容を推測するために役立つフレーズが多く抽出できている可能性があります。両手法に共通する課題としては「データサイエンス、創造性」などのフレーズを抽出できていない点で、その原因としては文章中での出現回数が少ない(ともに一度しか使われていない)、抽象的でフレーズ単体では元の文中での意味が分かりづらい、などが考えられます。

ruri-large MultipartiteRank GPT4o
人月 プログラム 人月の神話
1人月 新しいこと ブルックスの法則
ブルックス ソフトウェアプロジェクト プログラム開発
人数 システム プログラミング
月数 追加要因 ソフトウェアプロジェクト
ソフトウェアプロジェクト おもしろ 物を作る喜び
法則 うまく 役立つものを作る楽しさ
ブルックス コスト 複雑なパズルのような組み立て
プログラミング ブルックス 新しいことを学ぶ喜び
追加要因 プログラム開発 コミュニケーションの困難
人員 官公庁 扱いやすいメディア
新しい発見 ビッグデータ
ひとしお データサイエンス
楽しいわけ 難しく 創造性
設計思想 コミュニケーション 非線形性
質問 ビッグデータ 大規模システム
本題 大規模システム 失敗とやり直し
大規模システム パズル 新しい発見
プログラム 組み立て部品 研究
当教室 プロジェクト 学び
プロジェクト 設計思想 実験
楽し 楽しいわけ 創作
最初 サイコロ 教育
問い テキスト 子供たちの成長
非線形 非線形 楽しさ

課題

候補フレーズの選定方法

今回の実験で抽出精度が高かった Grammar ですが、品詞の並びに関するルールは TopicRank のデフォルトの設定のままにしており、日本語用に調整していないため、日本語の規則に合わせてルールを調整することで精度改善できる可能性があります。それでも書籍の名前など品詞の並びだけでは対応できなケースも存在するため、ルール自体の追加(例えば鉤括弧のなかのテキストはそのまま候補フレーズにするなど)も必要な可能性が高いです。

重要度の算出方法

直感的にも類似度を重要度として扱いのは難しいと思っていたため、マスク距離やプロンプトでの文脈情報の補完を試したのですが、抽出精度があまり改善しない一方で、特に長文ではクエリテキストが長くなり処理時間が大きくなるというデメリットの方が大きいように感じました。文章と文の類似度で重要な文を絞り込む方法(Filter)では、長文において抽出精度が改善しましたが MultipartiteRank などの軽量な抽出モデルに劣っており、埋め込みの類似度だけで重要度を決定するのは難しく、先行研究のように統計量・グラフベースの手法で用いられている特徴量を用いる必要があるかもしれません。

また、 Filter は Simple と比較して処理時間が数倍に増加しており実装の高速化も必要と考えられますが、Simple で抽出できていないキーフレーズを抽出できるようにはなっていないため、根本的に埋め込みモデルの使い方・使い所をもっと工夫必要があるように思いました。

情報量の制御性

今回はキーフレーズということで「抽出するキーフレーズの数」が制御できる部分になっています。一方で、実際に自分でアノテーションした中でも感じたのですが、文章の長さや専門性の高さ・ドメイン特有の語彙の量によって、キー(になり得る)フレーズの数が異なっており、「抽出するキーフレーズの数」で制御すると抽出しすぎる/十分抽出できていないことがあります。動的に抽出するキーフレーズの数を制御できると利便性としては向上すると感じています。(キーフレーズの数と文章の長さはある程度正の相関があるため、文字数に応じて変化するようにすればある程度は対応できるかもしれません。)

また情報の圧縮という観点では、抽出する単位(単語・フレーズ・文・段落など)も制御できると良いように感じました。長い文章から必要な文を抽出するというのも使い所がある技術なので、ツールの機能としては抽出する単位と個数/割合の両方が制御できると利便性が高いかもしれません。

キーフレーズが文章内に書かれていない場合

これは書籍の紹介や物の説明などをする文章でいくつかあったのですが、おそらくタイトルなどに記載され本文に書かれていないがために「ある物・用語について説明しているが、その物・用語の名称自体は文章の中に書かれていない」というケースが存在しました。これは文章やデータの問題とも言えますが、この場合は抽出では限界があり、生成モデルを用いて文章の内容から当てはまりそうなキーフレーズを生成する必要があります。

まとめ

本記事では、NLP2025 で発表した 埋め込みモデルベースの教師なしキーフレーズ抽出における長文に対する抽出精度の改善 について原稿よりも詳細に実施した実験内容や、開発したツール・データセットについて紹介しました。

実験では埋め込みモデルベースの抽出手法について、その主要な処理である「候補フレーズの選定」と「重要度算出」について比較実験を行いました。実験の結果をまとめると以下のようになりました。

  • 候補フレーズ選定:品詞情報と言語規則を利用する Grammar が短・中文書で有効でしたが、長文では単純な 1-gram に劣る場合もある
  • 重要度算出:基本的な類似度 (Simple) に対し、文/チャンク類似度で絞り込む Filter は長文でわずかな改善を示したものの処理時間が増加し、他の先行研究に基づく手法 (Mask, Prompt) は精度が低かった
  • 埋め込みモデル:モデルの種類やサイズによる差は小さく、large モデルが長文でやや優位な程度
  • 他手法比較:全体として GPT-4o を用いた生成モデルが最も高い精度を示し、埋め込みモデルは、短・中文書では統計/グラフベースの手法より優れていたが、長文では MultipartiteRank に劣る

今回の実験では、長文に対する抽出精度改善に向けてアプローチの方向性を探ることを目的に実験を行いましたが、重要度の算出方法については今回試したいずれの手法も限界があることが示唆される結果となりました。処理時間についてもアルゴリズム・実装のどちらにも課題があると考えています。

最後までご覧いただきありがとうございました。実験内容や開発したツール・データセットに関して質問などございましたら、著者の Xや GitHub リポジトリの issue などにお寄せください。

参考文献

  • [1] Rada Mihalcea and Paul Tarau. TextRank: Bringing order into text. In Dekang Lin and Dekai Wu, editors, Proc. EMNLP 2004, pp. 404–411, Barcelona, Spain, July 2004. Association for Computational Linguistics.
  • [2] Xiaojun Wan and Jianguo Xiao. CollabRank: Towards a collaborative approach to single-document keyphrase extraction. In Donia Scott and Hans Uszkoreit, editors, Proc. COLING 2008, pp. 969–976, Manchester, UK, August 2008. Coling 2008 Organizing Committee.
  • [3] A. Bougouin, F. Boudin, and B. Daille. TopicRank: Graph- based topic ranking for keyphrase extraction. In Ruslan Mitkov and Jong C. Park, editors, Proc. IJCNLP 2013, pp. 543–551, Nagoya, Japan, October 2013. Asian Feder- ation of Natural Language Processing.
  • [4] Florian Boudin. Unsupervised keyphrase extraction with multipartite graphs. In Marilyn Walker, Heng Ji, and Amanda Stent, editors, Proc. NAACL 2018, pp. 667– 672, New Orleans, Louisiana, June 2018. Association for Computational Linguistics.
  • [5] Samhaa R. El-Beltagy and Ahmed Rafea. KP-Miner: Par- ticipation in SemEval-2. In Katrin Erk and Carlo Strap- parava, editors, Proc. SemEval 2010, pp. 190–193, Up- psala, Sweden, July 2010. Association for Computational Linguistics.
  • [6] Ricardo Campos, V. Mangaravite, A. Pasquali, A. Jorge, C. Nunes, and A. Jatowt. Yake! collection-independent automatic keyword extractor. In Gabriella Pasi, Ben- jamin Piwowarski, Leif Azzopardi, and Allan Hanbury, editors, Advances in Information Retrieval, pp. 806– 810, Cham, 2018. Springer International Publishing.
  • [7] L. Page, S. Brin, R. Motwani, and T. Winograd. The PageRank citation ranking: Bringing order to the web. Technical Report 1999-66, Stanford InfoLab, November 1999. Previous number = SIDL-WP-1999-0120.
  • [8] K. Bennani-Smires, C. Musat, A. Hossmann, M. Baeriswyl, and M. Jaggi. Simple unsupervised keyphrase extraction using sentence embeddings. In Anna Korhonen and Ivan Titov, editors, Proc. CoNLL 2018, pp. 221–229, Brussels, Belgium, October 2018. Association for Computational Linguistics.
  • [9] Jaime Carbonell and Jade Goldstein. The use of MMR, diversity-based reranking for reordering documents and producing summaries. In Proceedings of the 21st An- nual International ACM SIGIR Conference on Re- search and Development in Information Retrieval, SIGIR ’98, p. 335–336, New York, NY, USA, 1998. As- sociation for Computing Machinery.
  • [10] Mingyang Song, Yi Feng, and Liping Jing. A survey on recent advances in keyphrase extraction from pre-trained language models. In Andreas Vlachos and Isabelle Augen- stein, editors, Findings of the Association for Com- putational Linguistics: EACL 2023, pp. 2153–2164, Dubrovnik, Croatia, May 2023. Association for Computa- tional Linguistics.
  • [11] N. Giarelis and N. Karacapilidis. Deep learning and embeddings-based approaches for keyphrase extraction: a literature review. Knowledge and Information Sys- tems, Vol. 66, No. 11, pp. 6493–6526, 2024.
  • [12] Y. Sun, H. Qiu, Y. Zheng, Z. Wang, and C. Zhang. SIFRank: A new baseline for unsupervised keyphrase extraction based on pre-trained language model. IEEE Access, Vol. 8, pp. 10896–10906, 2020.
  • [13] Haoran Ding and Xiao Luo. AttentionRank: Unsuper- vised keyphrase extraction using self and cross attentions. In Marie-Francine Moens, Xuanjing Huang, Lucia Specia, and Scott Wen-tau Yih, editors, Proc. EMNLP 2021, pp. 1919–1928, Online and Punta Cana, Dominican Republic, November 2021. Association for Computational Linguis- tics.
  • [14] L. Zhang, Q. Chen, W. Wang, C. Deng, S. Zhang, B. Li, W. Wang, and X. Cao. MDERank: A masked document embedding rank approach for unsupervised keyphrase ex- traction. In Smaranda Muresan, Preslav Nakov, and Aline Villavicencio, editors, Findings of the Association for Computational Linguistics: ACL 2022, pp. 396–409, Dublin, Ireland, May 2022. Association for Computational Linguistics.
  • [15] A. Kong, S. Zhao, H. Chen, Q. Li, Y. Qin, R. Sun, and X. Bai. PromptRank: Unsupervised keyphrase extraction using prompt. In Anna Rogers, Jordan Boyd-Graber, and Naoaki Okazaki, editors, Proc. ACL 2023, pp. 9788– 9801, Toronto, Canada, July 2023. Association for Com- putational Linguistics.

We Are Hiring!

ABEJAは、テクノロジーの社会実装に取り組んでいます。 技術はもちろん、技術をどのようにして社会やビジネスに組み込んでいくかを考えるのが好きな方は、下記採用ページからエントリーください! (新卒の方やインターンシップのエントリーもお待ちしております!)

careers.abejainc.com

*1:ちなみに、TopicRank/MultipartiteRank では文字の一致割合でトピックのグループを形成し、抽出結果が似たフレーズばかりにならない工夫がされています。

*2:アノテーションしていた時も、多くの文章では前半にキーフレーズが固まっていた印象なので、この制約はそこまで多くの場合うまくいくと思います。例外なのは、チャプターごとに別の話をしているケースで、エッセイや小説、複数の作品・商品紹介などの文章では、チャプターごと異なるキーフレーズを持っていることがあり、事前にチャプター単位に分割するといった工夫が事前に必要になりそうです。