在自然語言處理任務中,評估文字摘要的品質至關重要。ROUGE 指標是評估摘要模型效能的常用方法,它透過比較生成的摘要與參考摘要之間的相似度來衡量模型表現。本文將探討 ROUGE 指標的應用,並結合 PEGASUS 模型展示如何進行對話摘要。首先,我們會介紹 ROUGE 指標的計算方法,包括 ROUGE-N 和根據最長共同子序列的 ROUGE-L。接著,我們將使用 Datasets 函式庫載入 ROUGE 指標,並在 CNN/DailyMail 資料集上評估預訓練的 PEGASUS 模型。為了提升模型在特定領域的效能,我們會使用 SAMSum 資料集微調 PEGASUS 模型,並探討如何準備資料、構建 Data Collator 以及設定訓練引數。最後,我們將使用微調後的模型生成對話摘要,並展示如何使用 pipeline 簡化摘要生成流程。

評估文字摘要品質:ROUGE指標的應用

在自然語言處理領域中,評估文字摘要的品質是一項重要的任務。ROUGE(Recall-Oriented Understudy for Gisting Evaluation)是一種被廣泛使用的評估指標,用於衡量文字摘要與參考摘要之間的相似度。

ROUGE指標的計算方法

ROUGE指標根據n-gram的匹配來計算文字摘要與參考摘要之間的相似度。其中,ROUGE-N表示匹配的n-gram的數量佔參考摘要中n-gram總數的比例。除了ROUGE-N之外,還有一種特殊的ROUGE指標,稱為ROUGE-L,它根據最長共同子序列(LCS)來計算相似度。

ROUGE-L的計算方法

ROUGE-L的計算方法是根據LCS的。LCS是指兩個字串之間的最長共同子序列。例如,字串“abab”和“abc”的LCS是“ab”,其長度為2。為了使LCS能夠在不同的文字之間進行比較,需要對其進行標準化處理。

標準化的方法是計算LCS在參考摘要和文字摘要中的比例,然後結合這兩個比例來得到最終的分數。具體來說,ROUGE-L的計算公式如下:

RLCS = LCS(X, Y) / m PLCS = LCS(X, Y) / n FLCS = (1 + β2) * RLCS * PLCS / (RLCS + β2 * PLCS)

其中,β = PLCS / RLCS

使用Datasets函式庫計算ROUGE指標

在Datasets函式庫中,可以使用load_metric函式來載入ROUGE指標。具體程式碼如下:

rouge_metric = load_metric("rouge")

內容解密:

  1. load_metric("rouge"):載入ROUGE指標,用於評估文字摘要的品質。
  2. ROUGE指標是一種自動評估方法,可以快速評估文字摘要與參考摘要之間的相似度。

評估文字摘要的品質

為了評估文字摘要的品質,需要將生成的文字摘要與參考摘要進行比較。具體程式碼如下:

reference = dataset["train"][1]["highlights"]
records = []
rouge_names = ["rouge1", "rouge2", "rougeL", "rougeLsum"]
for model_name in summaries:
    rouge_metric.add(prediction=summaries[model_name], reference=reference)
    score = rouge_metric.compute()
    rouge_dict = dict((rn, score[rn].mid.fmeasure) for rn in rouge_names)
    records.append(rouge_dict)
pd.DataFrame.from_records(records, index=summaries.keys())

內容解密:

  1. reference = dataset["train"][1]["highlights"]:取得參考摘要,用於與生成的文字摘要進行比較。
  2. rouge_metric.add(prediction=summaries[model_name], reference=reference):將生成的文字摘要和參考摘要新增到ROUGE指標中。
  3. score = rouge_metric.compute():計算ROUGE指標的分數。
  4. rouge_dict = dict((rn, score[rn].mid.fmeasure) for rn in rouge_names):提取ROUGE指標的分數,並將其儲存在字典中。
  5. pd.DataFrame.from_records(records, index=summaries.keys()):將結果儲存在Pandas DataFrame中,以便於比較不同模型的表現。

在CNN/DailyMail資料集上評估PEGASUS模型

為了評估PEGASUS模型在CNN/DailyMail資料集上的表現,需要實作一個評估函式。具體程式碼如下:

def evaluate_summaries_pegasus(dataset, metric, model, tokenizer,
                               batch_size=16, device=device,
                               column_text="article",
                               column_summary="highlights"):
    article_batches = list(chunks(dataset[column_text], batch_size))
    target_batches = list(chunks(dataset[column_summary], batch_size))
    for article_batch, target_batch in tqdm(
        zip(article_batches, target_batches), total=len(article_batches)):
        inputs = tokenizer(article_batch, max_length=1024, truncation=True,
                           padding="max_length", return_tensors="pt")
        summaries = model.generate(input_ids=inputs["input_ids"].to(device),
                                   attention_mask=inputs["attention_mask"].to(device),
                                   length_penalty=0.8, num_beams=8, max_length=128)
        decoded_summaries = [tokenizer.decode(s, skip_special_tokens=True,
                                              clean_up_tokenization_spaces=True)
                             for s in summaries]

內容解密:

  1. article_batches = list(chunks(dataset[column_text], batch_size)):將文字資料分成批次,以便於處理。
  2. inputs = tokenizer(article_batch, max_length=1024, truncation=True, padding="max_length", return_tensors="pt"):將文字資料轉換為模型的輸入格式。
  3. summaries = model.generate(input_ids=inputs["input_ids"].to(device), attention_mask=inputs["attention_mask"].to(device), length_penalty=0.8, num_beams=8, max_length=128):使用PEGASUS模型生成文字摘要。
  4. decoded_summaries = [tokenizer.decode(s, skip_special_tokens=True, clean_up_tokenization_spaces=True) for s in summaries]:將生成的文字摘要解碼為可讀的格式。

自動化摘要技術的評估與訓練

在自然語言處理領域,自動化摘要是一項重要的任務,旨在將長篇的文字內容壓縮成簡短的摘要。為了評估和訓練摘要模型,本章節將探討相關技術和策略。

評估摘要模型的效能

評估摘要模型的效能通常採用ROUGE(Recall-Oriented Understudy for Gisting Evaluation)指標。ROUGE指標透過比較模型生成的摘要與參考摘要之間的相似度來評估模型的表現。

decoded_summaries = [d.replace("<n>", " ") for d in decoded_summaries]
metric.add_batch(predictions=decoded_summaries, references=target_batch)
score = metric.compute()
return score

內容解密:

  1. decoded_summaries處理:將生成的摘要中的<n>標記替換為空格,以改善可讀性。
  2. metric.add_batch:將生成的摘要和參考摘要新增到評估批次中。
  3. score = metric.compute():計算ROUGE指標,得出評估結果。

載入預訓練模型並進行評估

本文將載入預訓練的PEGASUS模型,並使用ROUGE指標評估其在摘要任務上的表現。

from transformers import AutoModelForSeq2SeqLM, AutoTokenizer
model_ckpt = "google/pegasus-cnn_dailymail"
tokenizer = AutoTokenizer.from_pretrained(model_ckpt)
model = AutoModelForSeq2SeqLM.from_pretrained(model_ckpt).to(device)
score = evaluate_summaries_pegasus(test_sampled, rouge_metric, model, tokenizer, batch_size=8)
rouge_dict = dict((rn, score[rn].mid.fmeasure) for rn in rouge_names)
pd.DataFrame(rouge_dict, index=["pegasus"])

內容解密:

  1. 載入預訓練模型和Tokenizer:使用AutoModelForSeq2SeqLMAutoTokenizer載入PEGASUS模型和對應的Tokenizer。
  2. 評估模型:呼叫evaluate_summaries_pegasus函式評估模型在測試集上的表現。
  3. 計算ROUGE指標:提取ROUGE指標的中位數F1分數,並構建DataFrame以便於檢視結果。

訓練自定義摘要模型

為了提高摘要模型的表現,可以使用特定領域的資料集進行微調。本文將介紹如何使用SAMSum資料集訓練自定義的摘要模型。

SAMSum資料集簡介

SAMSum資料集包含了一系列對話及其對應的摘要,適用於客戶服務等場景。

dataset_samsum = load_dataset("samsum")
print(f"Features: {dataset_samsum['train'].column_names}")
print("\nDialogue:")
print(dataset_samsum["test"][0]["dialogue"])
print("\nSummary:")
print(dataset_samsum["test"][0]["summary"])

內容解密:

  1. 載入SAMSum資料集:使用load_dataset函式載入SAMSum資料集。
  2. 檢視資料集特徵:列印訓練集的列名,瞭解資料集的結構。
  3. 展示對話和摘要範例:列印測試集中的第一個對話和對應的摘要。

在SAMSum資料集上評估PEGASUS模型

為了了解PEGASUS模型在SAMSum資料集上的表現,需要進行評估。

pipe_out = pipe(dataset_samsum["test"][0]["dialogue"])
print("Summary:")
print(pipe_out[0]["summary_text"].replace(" .<n>", ".\n"))

內容解密:

  1. 使用管道生成摘要:將測試集中的第一個對話輸入管道,生成摘要。
  2. 列印生成的摘要:將生成的摘要進行格式化後列印預出來。

微調PEGASUS模型

在SAMSum資料集上微調PEGASUS模型,以提高其在對話摘要任務上的表現。

def convert_examples_to_features(example_batch):
    input_encodings = tokenizer(example_batch["dialogue"], max_length=1024, truncation=True)
    # ...

內容解密:

  1. 定義資料轉換函式:將對話資料轉換為模型可接受的輸入格式。
  2. Tokenizer處理:使用Tokenizer對對話進行編碼,設定最大長度為1024,並進行截斷處理。

透過以上步驟,可以有效地評估和訓練自動化摘要模型,提高其在特定任務上的表現。

使用 PEGASUS 模型進行對話摘要

在自然語言處理(NLP)領域中,文字摘要是一項重要的任務,旨在將長篇文字壓縮成簡短的摘要。隨著 Transformer 架構的興起,像 PEGASUS 這樣的模型在摘要任務上取得了顯著的成果。本篇文章將介紹如何使用 PEGASUS 模型對對話進行摘要。

資料準備與預處理

首先,我們需要準備對話資料集,並對其進行預處理。這包括將對話內容和摘要進行分詞(tokenization),以及將資料轉換為模型可接受的格式。

with tokenizer.as_target_tokenizer():
    target_encodings = tokenizer(example_batch["summary"], max_length=128, truncation=True)
return {"input_ids": input_encodings["input_ids"],
        "attention_mask": input_encodings["attention_mask"],
        "labels": target_encodings["input_ids"]}
dataset_samsum_pt = dataset_samsum.map(convert_examples_to_features, batched=True)
columns = ["input_ids", "labels", "attention_mask"]
dataset_samsum_pt.set_format(type="torch", columns=columns)

內容解密:

  1. tokenizer.as_target_tokenizer():此上下文管理器用於指定 tokenizer 用於解碼器輸入的 tokenization。
  2. target_encodings:對摘要進行 tokenization,並限制最大長度為 128,超出部分進行截斷。
  3. dataset_samsum_pt:將原始資料集對映到預處理後的格式。
  4. set_format:設定資料集的輸出格式為 PyTorch 張量,並選擇需要的欄位。

建立資料拼接器(Data Collator)

資料拼接器負責在訓練過程中,將批次資料整理成模型所需的輸入格式。對於序列到序列(seq2seq)任務,我們需要特別處理解碼器的輸入。

from transformers import DataCollatorForSeq2Seq
seq2seq_data_collator = DataCollatorForSeq2Seq(tokenizer, model=model)

內容解密:

  1. DataCollatorForSeq2Seq:自動處理 seq2seq 任務中的資料拼接,包括將標籤向右偏移一位,以實作「教師強制」(teacher forcing)。
  2. seq2seq_data_collator:根據 tokenizer 和模型,初始化資料拼接器。

設定訓練引數與訓練模型

接下來,我們需要定義訓練引數,並使用 Hugging Face 的 Trainer API 進行模型訓練。

from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(
    output_dir='pegasus-samsum', num_train_epochs=1, warmup_steps=500,
    per_device_train_batch_size=1, per_device_eval_batch_size=1,
    weight_decay=0.01, logging_steps=10, push_to_hub=True,
    evaluation_strategy='steps', eval_steps=500, save_steps=1e6,
    gradient_accumulation_steps=16)

內容解密:

  1. TrainingArguments:定義模型的訓練引數,如輸出目錄、訓練輪數、批次大小等。
  2. gradient_accumulation_steps:由於模型較大,批次大小設為 1。為避免因批次太小影響收斂,使用梯度累積技術來模擬較大的批次大小。

訓練與評估模型

完成訓練引數設定後,我們可以初始化 Trainer 並開始訓練模型。

trainer = Trainer(model=model, args=training_args,
                  tokenizer=tokenizer, data_collator=seq2seq_data_collator,
                  train_dataset=dataset_samsum_pt["train"],
                  eval_dataset=dataset_samsum_pt["validation"])
trainer.train()

內容解密:

  1. Trainer:結合模型、訓練引數、資料拼接器和訓練/驗證資料集,初始化訓練器。
  2. trainer.train():開始模型的訓練過程。

生成對話摘要

訓練完成後,我們可以使用模型生成對話摘要。

gen_kwargs = {"length_penalty": 0.8, "num_beams":8, "max_length": 128}
sample_text = dataset_samsum["test"][0]["dialogue"]
reference = dataset_samsum["test"][0]["summary"]
pipe = pipeline("summarization", model="transformersbook/pegasus-samsum")
print("Dialogue:")
print(sample_text)
print("\nReference Summary:")
print(reference)
print("\nModel Summary:")
print(pipe(sample_text, **gen_kwargs)[0]["summary_text"])

內容解密:

  1. gen_kwargs:定義生成摘要時的超引數,如長度懲罰、beam 搜尋數量和最大生成長度。
  2. pipeline:使用訓練好的模型初始化一個摘要生成的 pipeline。
  3. pipe(sample_text, **gen_kwargs):根據輸入的對話內容生成摘要。

本篇文章介紹瞭如何使用 PEGASUS 模型對對話進行摘要,包括資料預處理、建立資料拼接器、設定訓練引數、訓練模型以及生成摘要等步驟。透過這些步驟,我們可以有效地訓練出一個適合特定對話摘要任務的模型。