目錄
1 文本相似度評估
2 代碼
2.1 load_dataset 方法
2.2?AutoTokenizer、AutoModelForSequenceClassification
1 文本相似度評估
? ? ? 對兩個文本拼接起來,然后作為一個樣本喂給模型,作為一個二分類的任務;
數據處理的方式以及訓練的基本流程與上文相似。
2 代碼
- 數據預處理,把需要對比的文本放置一起,作為一個樣本;?tokenizer: 輸入的語句是兩個。分類標簽的類型必須是 int,不能是其他的類型;
- 加載模型。
- 輸出結果;?
2.1 load_dataset 方法
datasets是抱抱臉開發的一個數據集python庫,可以很方便的從Hugging Face Hub里下載數據,也可很方便的從本地加載數據集,本文主要對load_dataset方法的使用進行詳細說明。
def load_dataset(
? ? path: str,
? ? name: Optional[str] = None,
? ? data_dir: Optional[str] = None,
? ? data_files: Union[Dict, List] = None,
? ? split: Optional[Union[str, Split]] = None,
? ? cache_dir: Optional[str] = None,
? ? features: Optional[Features] = None,
? ? download_config: Optional[DownloadConfig] = None,
? ? download_mode: Optional[GenerateMode] = None,
? ? ignore_verifications: bool = False,
? ? save_infos: bool = False,
? ? script_version: Optional[Union[str, Version]] = None,
? ? **config_kwargs,
) -> Union[DatasetDict, Dataset]:path:參數path表示數據集的名字或者路徑。可以是如下幾種形式(每種形式的使用方式后面會詳細說明)
數據集的名字,比如imdb、glue
數據集文件格式,比如json、csv、parquet、txt
數據集目錄中的處理數據集的腳本(.py)文件,比如“glue/glue.py”
name:參數name表示數據集中的子數據集,當一個數據集包含多個數據集時,就需要這個參數,比如glue數據集下就包含"sst2"、“cola”、"qqp"等多個子數據集,此時就需要指定name來表示加載哪一個子數據集
data_dir:數據集所在的目錄
data_files:數據集文件
cache_dir:構建的數據集緩存目錄,方便下次快速加載。
2.2?AutoTokenizer、AutoModelForSequenceClassification
類名稱 | 介紹 |
AutoTokenizer | AutoTokenizer ?是 Hugging Face Transformers 庫中的一個類,用于自動選擇適合特定預訓練模型的 tokenizer。該類可以根據指定的模型名稱或路徑,自動選擇對應的 tokenizer 類型,無需手動指定。這樣可以方便地在不同的預訓練模型之間切換,而無需更改代碼中的 tokenizer 類型。 |
AutoModelForSequenceClassification | AutoModelForSequenceClassification ?是 Hugging Face Transformers 庫中的一個類,用于自動選擇適合特定預訓練模型的用于序列分類任務的模型。這個類會根據指定的模型名稱或路徑自動選擇對應的模型類型,無需手動指定。這樣可以方便地在不同的預訓練模型之間切換,而無需更改代碼中的模型類型。 |
Trainer | Trainer ?是 Hugging Face Transformers 庫中用于訓練和評估模型的高級 API。它提供了一個簡單而強大的接口,用于管理訓練循環、驗證循環、日志記錄、保存模型等任務。使用?Trainer ?可以方便地訓練和微調預訓練模型,同時還支持分布式訓練和混合精度訓練等功能。 |
TrainingArguments | TrainingArguments ?是 Hugging Face Transformers 庫中用于配置訓練參數的類。通過?TrainingArguments ?類,可以指定訓練過程中的各種參數,如訓練輪數、學習率、批次大小、日志路徑、模型保存路徑等。這些參數可以幫助控制訓練過程的行為,并對訓練過程進行定制。 |
from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments
from datasets import load_dataset,load_from_disk
import traceback
from sklearn.model_selection import train_test_split#dataset = load_dataset("json", data_files="../data/train_pair_1w.json", split="train")
dataset = load_dataset("csv", data_files="/Users/user/studyFile/2024/nlp/text_similar/data/Chinese_Text_Similarity.csv", split="train")datasets = dataset.train_test_split(test_size=0.2,shuffle=True)import torchtokenizer = AutoTokenizer.from_pretrained("../chinese_macbert_base")
def process_function(examples):tokenized_examples = tokenizer(examples["sentence1"], examples["sentence2"], max_length=128, truncation=True)# 注意int(label)tokenized_examples["labels"] = [int(label) for label in examples["label"]]return tokenized_examplestokenized_datasets = datasets.map(process_function, batched=True, remove_columns=datasets["train"].column_names)
#tokenized_datasets# 創建模型
from transformers import BertForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained("../chinese_macbert_base")import evaluate
acc_metric = evaluate.load("./metric_accuracy.py")
f1_metirc = evaluate.load("./metric_f1.py")
#
# acc_metric = evaluate.load("accuracy")
# f1_metirc = evaluate.load("f1")
def eval_metric(eval_predict):predictions, labels = eval_predict#print(predictions,labels)predictions = predictions.argmax(axis=-1)#predictions = [int(p > 0.5) for p in predictions]labels = [int(l) for l in labels]# predictions = predictions.argmax(axis=-1)acc = acc_metric.compute(predictions=predictions, references=labels)f1 = f1_metirc.compute(predictions=predictions, references=labels)acc.update(f1)return acc
train_args = TrainingArguments(output_dir="./cross_model", # 輸出文件夾per_device_train_batch_size=32, # 訓練時的batch_sizeper_device_eval_batch_size=32, # 驗證時的batch_sizelogging_steps=10, # log 打印的頻率evaluation_strategy="epoch", # 評估策略save_strategy="epoch", # 保存策略save_total_limit=3, # 最大保存數learning_rate=2e-5, # 學習率weight_decay=0.01, # weight_decaymetric_for_best_model="f1", # 設定評估指標load_best_model_at_end=True) # 訓練完成后加載最優模型
train_args
from transformers import DataCollatorWithPadding
trainer = Trainer(model=model, args=train_args, train_dataset=tokenized_datasets["train"], eval_dataset=tokenized_datasets["test"], data_collator=DataCollatorWithPadding(tokenizer=tokenizer),compute_metrics=eval_metric)
trainer.train()