清水泥沙

Transformer 学习之路 - 文本相似度实例

Transformer 学习之路 - 文本相似度实例

Transformer 模型自 2017 年提出以来,已经成为了自然语言处理(NLP)领域的核心技术之一。它不仅改变了机器翻译、文本生成等任务的处理方式,还在文本相似度计算、情感分析等任务中展现了强大的能力。本文将基于 Transformer 技术,详细讲解如何实现文本相似度计算,并结合代码示例进行深入解析。

1. 背景与问题

文本相似度计算是 NLP 中的一个重要任务,它旨在衡量两段文本在语义上的相似程度。传统的文本相似度计算方法通常基于词袋模型或 TF-IDF,但这些方法无法捕捉到文本的深层语义信息。Transformer 模型通过自注意力机制(Self-Attention)和多层编码器,能够更好地理解文本的上下文关系,从而在文本相似度计算中取得了显著的效果提升。

2. 环境准备

在开始之前,我们需要安装一些必要的 Python 库,包括 transformersdatasetsevaluate。这些库将帮助我们加载预训练模型、处理数据集以及评估模型性能。

!pip install evaluate datasets

3. 加载数据集

我们使用 datasets 库加载一个 JSON 格式的文本相似度数据集。该数据集包含两段文本及其相似度标签。

from datasets import load_dataset

dataset = load_dataset("json", data_files="/content/drive/MyDrive/ai-learning/2.NLP Task/05-sentence_similarity/train_pair_1w.json", split="train")

为了训练和评估模型,我们将数据集划分为训练集和测试集。

datasets = dataset.train_test_split(test_size=0.2)

4. 数据预处理

在将数据输入模型之前,我们需要对文本进行预处理。这里我们使用 AutoTokenizer 加载一个中文预训练模型的分词器,并对文本进行分词和截断。

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("hfl/chinese-macbert-base")

def preprocess_function(examples):
    tokenized_examples = tokenizer(examples["sentence1"], examples["sentence2"], truncation=True, max_length=128)
    tokenized_examples["labels"] = [float(example) for example in examples["label"]]
    return tokenized_examples

tokenized_datasets = datasets.map(preprocess_function, batched=True, remove_columns=datasets["train"].column_names)

5. 创建模型

我们使用 AutoModelForSequenceClassification 加载一个预训练的中文模型,并将其用于文本相似度分类任务。

from transformers import AutoModelForSequenceClassification

model = AutoModelForSequenceClassification.from_pretrained("hfl/chinese-macbert-base", num_labels=1)

6. 模型评估函数

为了评估模型的性能,我们定义了 eval_metric 函数,该函数计算模型的准确率(Accuracy)和 F1 分数。

import evaluate

acc_metric = evaluate.load("accuracy")
f1_metric = evaluate.load("f1")

def eval_metric(eval_predict):
    predictions, labels = eval_predict
    predictions = [int(p > 0.5) for p in predictions]
    labels = [int(l) for l in labels]
    acc = acc_metric.compute(predictions=predictions, references=labels)
    f1 = f1_metric.compute(predictions=predictions, references=labels)
    acc.update(f1)
    return acc

7. 配置训练参数

我们使用 TrainingArguments 配置模型的训练参数,包括学习率、批量大小、评估策略等。

from transformers import TrainingArguments

train_args = TrainingArguments(
    output_dir="./cross_model",
    per_device_train_batch_size=32,
    per_device_eval_batch_size=32,
    logging_steps=10,
    eval_strategy="epoch",
    save_strategy="epoch",
    save_total_limit=3,
    learning_rate=2e-5,
    weight_decay=0.01,
    metric_for_best_model="f1",
    load_best_model_at_end=True
)

8. 创建 Trainer

Trainer 是 Hugging Face 提供的一个高级 API,它封装了模型的训练、评估和预测过程。

from transformers import Trainer, DataCollatorWithPadding

trainer = Trainer(
    model=model,
    args=train_args,
    tokenizer=tokenizer,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["test"],
    data_collator=DataCollatorWithPadding(tokenizer=tokenizer),
    compute_metrics=eval_metric
)

9. 训练模型

我们调用 trainer.train() 开始训练模型。在训练过程中,模型会根据训练数据不断调整参数,以最小化损失函数。

trainer.train()

10. 评估模型

训练完成后,我们使用 pipeline API 对模型进行评估。通过输入两段文本,模型将输出它们的相似度标签。

from transformers import pipeline

model.config.id2label = {0: "不相似", 1: "相似"}
pipe = pipeline("text-classification", model=model, tokenizer=tokenizer, device=0)

result = pipe({"text": "今天天气真好", "text_pair": "真不错,现在的天气真不错"}, function_to_apply="none")
result["label"] = "相似" if result["score"] > 0.5 else "不相似"
result

11. 保存模型

最后,我们将训练好的模型保存到指定路径,以便后续使用。

model_save_path = "/content/drive/MyDrive/ai-learning/2.NLP Task/05-sentence_similarity/model/cross"
model.save_pretrained(model_save_path)

总结

通过本文的详细讲解,我们了解了如何使用 Transformer 技术实现文本相似度计算。从数据加载、预处理到模型训练和评估,每一步都结合了代码示例,帮助读者更好地理解和应用 Transformer 模型。希望这篇文章能够为你在 NLP 领域的学习和实践提供有价值的参考。