返回文章列表

文字摘要技術多模型比較與實作分析

本文探討了不同 Transformer 模型在文字摘要任務中的應用,比較了 GPT-2、T5、BART 和 PEGASUS 等模型的效能表現,並分析了各自的優缺點。文章以 CNN/DailyMail 資料集為例,展示瞭如何使用這些模型生成摘要,並利用 BLEU 和 ROUGE

自然語言處理 機器學習

隨著資訊爆炸時代的來臨,如何快速有效地從大量文字中提取關鍵資訊變得至關重要。文字摘要技術作為自然語言處理領域的重要分支,旨在將長文字壓縮成簡潔的摘要,保留核心內容。本文將聚焦於根據 Transformer 架構的文字摘要模型,並以 CNN/DailyMail 資料集為例,比較 GPT-2、T5、BART 和 PEGASUS 等模型的效能。透過實作分析,我們可以觀察不同模型在生成摘要時的差異,並瞭解如何根據實際需求選擇合適的模型。同時,本文也將介紹 BLEU 和 ROUGE 等常用評估指標,用於客觀衡量摘要品質,並探討文字摘要技術的未來發展趨勢。

文字摘要技術的挑戰與實踐

文字摘要是一項複雜的任務,需要理解長篇文字、推理內容並生成流暢的文字。隨著自然語言處理技術的發展,根據預訓練的Transformer模型已成為文字摘要的主流方法。本章將探討如何利用這些模型來進行文字摘要。

CNN/DailyMail資料集

CNN/DailyMail資料集是一個經典的文字摘要資料集,包含約30萬對新聞文章及其對應的摘要。這些摘要是抽象式的,而非簡單地摘錄原文。資料集的特點在於其摘要是重新寫作的句子,而非直接摘錄自原文。

資料集結構

資料集包含三個欄位:article(新聞文章)、highlights(摘要)和id(文章唯一識別碼)。透過以下程式碼,可以載入資料集並檢視其結構:

from datasets import load_dataset
dataset = load_dataset("cnn_dailymail", version="3.0.0")
print(f"Features: {dataset['train'].column_names}")

內容解密:

上述程式碼載入了CNN/DailyMail資料集的3.0.0版本,並列印出訓練集的欄位名稱。這些欄位包括articlehighlightsid,分別代表新聞文章、摘要和文章ID。

文字摘要流程

為了評估不同Transformer模型的文字摘要能力,我們首先對一個範例文字進行摘要。由於不同模型的輸入大小限制不同,我們將輸入文字限制在2000個字元以內,以便比較不同模型的輸出結果。

範例文字處理

sample_text = dataset["train"][1]["article"][:2000]
summaries = {}

內容解密:

這段程式碼提取了訓練集中第二篇文章的前2000個字元,並初始化了一個空字典summaries來儲存不同模型的摘要結果。

基線模型:前三句摘要

一個簡單的基線模型是直接取原文的前三句作為摘要。利用NLTK的句子分割工具,可以輕鬆實作這一基線模型:

import nltk
from nltk.tokenize import sent_tokenize
nltk.download("punkt")

def three_sentence_summary(text):
    return "\n".join(sent_tokenize(text)[:3])

summaries["baseline"] = three_sentence_summary(sample_text)

內容解密:

此程式碼下載了NLTK的punkt包用於句子分割,然後定義了一個函式three_sentence_summary,該函式將輸入文字分割成句子並傳回前三句作為摘要。最後,將這個基線模型的摘要結果存入summaries字典中。

文字摘要技術的多模型比較與實作分析

在自然語言處理(NLP)的眾多工中,文字摘要(Text Summarization)是一項極具挑戰性的技術。文字摘要旨在將冗長的文字壓縮成簡潔的摘要,同時保留原文的核心資訊。本篇文章將探討多種先進的語言模型在文字摘要任務上的表現,包括GPT-2、T5、BART和PEGASUS,並透過具體例項比較其摘要結果。

GPT-2模型在文字摘要中的應用

GPT-2是一種根據Transformer架構的語言模型,以其強大的文字生成能力而聞名。在文字摘要任務中,GPT-2透過在輸入文字後附加“TL;DR”提示來生成摘要。這種方法利用了GPT-2對上下文的理解能力,從而產生與原文相關的摘要。

from transformers import pipeline, set_seed
set_seed(42)
pipe = pipeline("text-generation", model="gpt2-xl")
gpt2_query = sample_text + "\nTL;DR:\n"
pipe_out = pipe(gpt2_query, max_length=512, clean_up_tokenization_spaces=True)
summaries["gpt2"] = "\n".join(sent_tokenize(pipe_out[0]["generated_text"][len(gpt2_query):]))

內容解密:

  1. set_seed(42):設定隨機種子以確保結果的可重現性。
  2. pipeline("text-generation", model="gpt2-xl"):載入GPT-2大型模型,用於文字生成任務。
  3. gpt2_query = sample_text + "\nTL;DR:\n":建構輸入查詢,在原始文字後新增“TL;DR”以提示模型生成摘要。
  4. pipe_out = pipe(gpt2_query, max_length=512, clean_up_tokenization_spaces=True):使用GPT-2生成文字,限制最大長度為512個字元,並清理tokenization空格。
  5. summaries["gpt2"] = "\n".join(sent_tokenize(pipe_out[0]["generated_text"][len(gpt2_query):])):對生成的文字進行句子分割,並將結果儲存在summaries字典中。

T5模型的文字摘要實作

T5是一種將所有NLP任務統一為文字到文字格式的模型。在文字摘要任務中,T5透過輸入“summarize:

”來生成摘要。T5的多工訓練使其在多個NLP任務上表現出色。

pipe = pipeline("summarization", model="t5-large")
pipe_out = pipe(sample_text)
summaries["t5"] = "\n".join(sent_tokenize(pipe_out[0]["summary_text"]))

內容解密:

  1. pipeline("summarization", model="t5-large"):載入T5大型模型,用於文字摘要任務。
  2. pipe_out = pipe(sample_text):使用T5模型生成摘要。
  3. summaries["t5"] = "\n".join(sent_tokenize(pipe_out[0]["summary_text"])):對生成的摘要進行句子分割,並儲存結果。

BART與PEGASUS模型的文字摘要比較

BART和PEGASUS都是根據編碼器-解碼器架構的模型,分別採用了不同的預訓練策略。BART結合了BERT和GPT-2的預訓練方案,而PEGASUS則透過預測被遮蔽的句子來進行預訓練。

# BART模型
pipe = pipeline("summarization", model="facebook/bart-large-cnn")
pipe_out = pipe(sample_text)
summaries["bart"] = "\n".join(sent_tokenize(pipe_out[0]["summary_text"]))

# PEGASUS模型
pipe = pipeline("summarization", model="google/pegasus-cnn_dailymail")
pipe_out = pipe(sample_text)
summaries["pegasus"] = pipe_out[0]["summary_text"].replace(" .<n>", ".\n")

內容解密:

  1. pipeline("summarization", model="facebook/bart-large-cnn")pipeline("summarization", model="google/pegasus-cnn_dailymail"):分別載入BART和PEGASUS模型,用於文字摘要任務。
  2. pipe_out = pipe(sample_text):使用相應模型生成摘要。
  3. summaries["bart"]summaries["pegasus"]:儲存生成的摘要結果。

不同模型的摘要結果比較

透過比較GPT-2、T5、BART和PEGASUS四種模型的摘要結果,可以觀察到它們在文字摘要任務上的不同表現。這些模型的訓練資料和預訓練目標各不相同,因此在生成摘要時展現出不同的特點。

print("GROUND TRUTH")
print(dataset["train"][1]["highlights"])
print("")
for model_name in summaries:
    print(model_name.upper())
    print(summaries[model_name])
    print("")

內容解密:

  1. print(dataset["train"][1]["highlights"]):列印真實的摘要結果作為對照。
  2. for model_name in summaries::遍歷summaries字典,列印每個模型的摘要結果。

自動文字摘要評估:BLEU 與 ROUGE 指標解析

在自然語言處理領域,自動文字摘要是一項極具挑戰性的任務。為了評估不同模型生成的摘要品質,研究人員開發了多種評估指標,其中 BLEU 和 ROUGE 是最常用的兩種指標。

BLEU 指標:根據精確度的評估方法

BLEU(Bilingual Evaluation Understudy)指標最初用於評估機器翻譯的品質,但後來也被廣泛應用於文字摘要等其他自然語言生成任務。BLEU 的核心思想是透過比較生成文字與參考文字之間的 n-gram 相似度來評估生成文字的品質。

BLEU 的計算方法

BLEU 的計算根據修改後的精確度(modified precision)。首先,統計生成文字中出現在參考文字中的 n-gram 數量,然後除以生成文字中的 n-gram 總數。為了避免過度重複的生成文字獲得高分,BLEU 對 n-gram 的計數進行了裁剪(clipping),即一個 n-gram 的計數不會超過它在參考文字中出現的次數。

對於單個句子,BLEU 的計算公式如下:

[ p_n = \frac{\sum_{n\text{-gram} \in \text{snt’}} \text{Count}{\text{clip}}(n\text{-gram})}{\sum{n\text{-gram} \in \text{snt}} \text{Count}(n\text{-gram})} ]

對於整個語料函式庫,BLEU 的計算需要對所有句子進行匯總:

[ p_n = \frac{\sum_{\text{snt} \in C} \sum_{n\text{-gram} \in \text{snt’}} \text{Count}{\text{clip}}(n\text{-gram})}{\sum{\text{snt’} \in C} \sum_{n\text{-gram} \in \text{snt}} \text{Count}(n\text{-gram})} ]

為了彌補 BLEU 偏向短句子的問題,引入了簡潔懲罰(brevity penalty):

[ \text{BP} = \min\left(1, e^{1 - \frac{\ell_{\text{ref}}}{\ell_{\text{gen}}}}\right) ]

最終的 BLEU 分數是簡潔懲罰與 n-gram 精確度的幾何平均值。

ROUGE 指標:根據召回率的評估方法

ROUGE(Recall-Oriented Understudy for Gisting Evaluation)指標主要用於評估自動摘要系統的品質。與 BLEU 不同,ROUGE 更關注召回率,即參考摘要中的 n-gram 有多少出現在生成摘要中。

ROUGE 的計算方法

ROUGE-N 是 ROUGE 系列中的一個指標,用於計算參考摘要與生成摘要之間的 n-gram 召回率:

[ \text{ROUGE-}N = \frac{\sum_{\text{snt} \in {\text{reference summaries}}} \sum_{n\text{-gram} \in \text{snt}} \text{Count}{\text{match}}(n\text{-gram})}{\sum{\text{snt} \in {\text{reference summaries}}} \sum_{n\text{-gram} \in \text{snt}} \text{Count}(n\text{-gram})} ]

ROUGE-L 則是根據最長公共子序列(LCS)來計算召回率和精確度,並結合 F-measure 來評估生成摘要的品質。

內容解密:

本段落詳細介紹了 BLEU 和 ROUGE 指標的計算方法和特點。BLEU 根據修改後的精確度,透過比較生成文字和參考文字之間的 n-gram 相似度來評估生成文字的品質。ROUGE 則更關注召回率,計算參考摘要中的 n-gram 有多少出現在生成摘要中。兩種指標在自動文字摘要評估中各有其優勢和適用場景。

在未來,自然語言處理領域可能會出現更多樣化和精細化的評估指標,以更好地衡量自動文字摘要系統的效能。同時,如何結合多種指標進行綜合評估,也將是研究人員需要繼續探索的問題。

內容解密:

本段落探討了自動文字摘要評估指標。隨著自然語言處理技術的不斷進步,未來的評估指標可能會更加多樣化和精細化,以滿足不同的應用需求。同時,如何綜合利用多種指標進行評估,也是一個值得深入研究的課題。

評估生成文字的品質:BLEU 與 ROUGE 分數

在自然語言處理(NLP)領域,評估生成文字的品質是一項具有挑戰性的任務。為了量化生成文字與參考文字之間的相似度,研究人員開發了多種評估指標,其中最為人熟知的就是 BLEU 和 ROUGE 分數。

BLEU 分數

BLEU(Bilingual Evaluation Understudy)分數是一種廣泛用於評估機器翻譯和文字生成品質的指標。它透過比較生成文字和參考文字之間的 n-gram 重疊程度來計算分數。

BLEU 的計算

BLEU 分數的計算涉及以下幾個步驟:

  1. n-gram 精確度計算:計算生成文字中 n-gram 在參考文字中出現的比例。
  2. 修正精確度:為了避免生成文字重複使用相同的詞彙,需要對精確度進行修正。
  3. 長度懲罰:如果生成文字的長度遠小於參考文字,則需要施加懲罰。

最終的 BLEU 分數是透過計算幾何平均值得到的,通常使用 BLEU-4,即考慮到 1-gram 至 4-gram 的情況。

from datasets import load_metric
bleu_metric = load_metric("sacrebleu")

# 新增預測結果和參考答案
bleu_metric.add(prediction="the cat is on mat", reference=["the cat is on the mat"])

# 計算 BLEU 分數
results = bleu_metric.compute(smooth_method="floor", smooth_value=0)
results["precisions"] = [np.round(p, 2) for p in results["precisions"]]

# 顯示結果
pd.DataFrame.from_dict(results, orient="index", columns=["Value"])

BLEU 的優缺點

BLEU 分數的優點在於它能夠評估生成文字的精確度,特別是在機器翻譯任務中。然而,它也存在一些缺點,例如:

  • 未考慮同義詞替換的情況。
  • 對 tokenization 方法敏感。

內容解密:

  1. n-gram 精確度計算:這裡指的是計算生成文字中各個 n-gram(如單詞、雙片語等)在參考文字中出現的頻率,以此來評估生成文字的準確性。
  2. 修正精確度:由於生成文字可能會重複某些詞彙,這一步驟是為了避免這種情況對評估結果的影響。
  3. 長度懲罰:如果生成文字過短,則會被視為品質較低,因為它可能沒有完整地表達出參考文字中的資訊。

ROUGE 分數

ROUGE(Recall-Oriented Understudy for Gisting Evaluation)分數是一種專門為摘要生成等任務設計的評估指標。它關注的是生成文字中是否包含了參考文字中的重要資訊,因此更側重於評估召回率。

ROUGE 的計算

ROUGE 分數的計算與 BLEU 類別似,但它關注的是參考文字中的 n-gram 在生成文字中出現的比例。

ROUGE-N 的公式如下:

ROUGE-N = ∑(snt’ ∈ C) ∑(n-gram ∈ snt’) Count_match(n-gram) / ∑(snt’ ∈ C) ∑(n-gram ∈ snt’) Count(n-gram)

其中,Count_match(n-gram) 表示 n-gram 在生成文字中出現的次數,Count(n-gram) 表示 n-gram 在參考文字中出現的總次數。

內容解密:

  1. ROUGE-N 公式:這個公式用於計算 ROUGE 分數,分子表示參考文字中的 n-gram 在生成文字中匹配的次數,分母表示參考文字中 n-gram 的總數。
  2. 召回率導向:ROUGE 分數更關注於評估生成文字是否包含了參考文字中的重要資訊,因此它是一種召回率導向的評估指標。