[中級編]LLMへ至る道~要約処理って何しているの?~[13日目]

2023.12.13

みなさんこんにちは!クルトンです。

前日は、文章の類似度に関するお話でした。文章が似ているかどうかを計算するために、ベクトルを使ってコサイン類似度というものを計算していましたね。

本日のブログは、文章を要約する方法についてご紹介していきます。

文章の要約には2種類の方法がある!

要約のアウトプットとしては2種類あります。

  • 抽出型要約(Extractive Summarization)
    • 与えられた文章の中で重要なキーワードを取り出してそのまま使う
    • 元の文章を使った要約なので、元の文章と同じ情報を保持しているというのがポイント
  • 生成型要約(Abstractive Summarization)
    • 入力された文章を元に、新しい要約した文章を生成する
    • 最近の大規模モデルではこちらを使っている

上記の2つの要約方法についてですが、どちらもご紹介したいと考えています。ただし生成型要約についてはあとでご紹介するモデルと関連があるため、今後ご紹介予定となります。

本日は抽出型要約についてやってみましょう。

抽出型要約のために、TF-IDFというものを使ってみます。また昨日ご紹介したコサイン類似度も活用します。

TF-IDFについて

Term Frequency - Inverse Document Frequencyの略です。TF-IDFでは、自然言語をベクトルで表現しますが、ベクトルの表現内容としてある文章の中で特徴的な単語がどれであるか、という計算をしています。

実際の計算ではTFという指標とIDFという指標それぞれの計算後に掛け合わせるとTF-IDFは求められます。また、それぞれの指標は複数の文章の入力に対応しています。

TFとは

まずはTFについてです。

TF = ある文書Xにおける注目している単語の出現回数 ある文書Xにおける全単語の出現回数

つまりTFというのは、注目している単語が出現していればいるほど数値が大きくなり、注目している単語がなければないほど小さい数値になります。

例えば以下のような文があったとします。

  • 神社で猫によく会うが今日も猫が可愛い

トークナイザーなどを使って単語に分けると以下のようになります。

  • 神社, で, 猫, に, よく, 会う, が, 今日, も, 猫, が, 可愛い

上記の文に対してTFを、「猫」と「神社」で計算してみます。

  • TF(猫) = 2 ÷ 12 = 0.16666666……
  • TF(神社) = 1 ÷ 12 = 0.08333333……

計算の結果、神社より猫の方が文を特徴づける単語のようです。

IDFとは

次にIDFについてです。 注目している単語が、いくつの文書で使用されているかを計算するものです。

IDF = log ( 文書の総数 注目している単語が出現している文書の数 )

上記計算式は、ある単語が出てくる文書の数が少なければ少ないほど、大きい値になります。つまり、とある単語のレア度が高いほど大きい値になります。

以下のような3つの文があったとします。

  • 今日も猫が可愛い
  • 神社に行った
  • 神社と仏閣は別のもの

猫のIDFと神社のIDFを計算してみます。

  • IDF(猫) = log(3 ÷ 1) = 1.0986123
  • IDF(神社) = log(3 ÷ 2)= 0.4054651

IDFの計算結果より、神社より猫の方が複数の文の中でもあまり出現しないレア度の高い単語(文を特徴づける単語)のようです。

TF-IDFとは

最後にTF-IDFの計算式は次のようになります。

TF-IDF = 単語の出現頻度(TFのこと) × 単語のレア度(IDFのこと)

上記式を各文章の各単語に実行する事で、文の中で特徴的な単語とはどれかを見つけられます。

抽出型要約をやってみた

今回は複数の似た文章を入力し、その中で指定した文章と近い文章を選ぶという抜き出し型の要約をやってみます。

実行環境はGoogle Colab(ランタイムはCPU)です。

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import linear_kernel


# 文書
documents = [
    "tf-idfを使った要約処理を実行します。"
    , "要約はテキストの主要なポイントを抽出する方法です。"
    , "テキストを変更せずに要約することを抽出型要約(Extractive Summarization)と言います。"
    , "tf-idf(Term Frequency-Inverse Document Frequency)は重要度をチェックするための手法の1つです。"
]

# tf-idf用にベクトル化
tfidf_vectorizer = TfidfVectorizer()
tfidf_matrix = tfidf_vectorizer.fit_transform(documents) # 計算

# コサイン類似度を計算
cosine_similarities = linear_kernel(tfidf_matrix, tfidf_matrix)

# 要約の対象となるテキストのインデックスを指定
target_index = 0

# 類似度が高い順にソート
similarities = list(enumerate(cosine_similarities[target_index]))
similarities.sort(key=lambda x: x[1], reverse=True)

# 上位n件の要約文を表示
n = 1  # もっとも類似している文を選ぶ
summary = [documents[i[0]] for i in similarities[1:n+1]]
print("\n".join(summary))

出力結果は以下のようになりました。

tf-idf(Term Frequency-Inverse Document Frequency)は重要度をチェックするための手法の1つです。

同じ「tf-idf」という単語が使われている唯一の文が選ばれました!

終わりに

今回は文章の要約について、概要と抽出型の要約をやってみました。要約という内容であっても2通りのやり方があります。もう一つの方について、もしご興味持たれましたらぜひ検索してみてください!

明日は、LSTMを使ったモデルについてのお話です。ELMoと同じく複数のLSTMを使うのですが、使い方に現在のLLMの中でも使われるような大きな特徴があるモデルです。

本日はここまで。よければ明日もご覧ください!

参考サイト