تنظیم دقیق حقوقی-BERT: LLMs برای طبقه‌بندی خودکار متون قانونی


نویسنده(های): دروگلبارد

در ابتدا منتشر شد به سمت هوش مصنوعی.

باز کردن قفل طبقه بندی اسناد قانونی کارآمد با تنظیم دقیق NLP

تصویر ایجاد شده توسط نویسنده

مقدمه

در صنعت حقوقی پرشتاب امروزی، حرفه‌ای‌ها با حجم فزاینده‌ای از اسناد پیچیده غرق می‌شوند – از مفاد قراردادهای پیچیده و موافقت‌نامه‌های ادغام گرفته تا سوابق مطابقت با مقررات و پرونده‌های دادگاه. غربال دستی این اسناد نه تنها کار فشرده و زمان بر است، بلکه مستعد خطاهای انسانی و ناهماهنگی است. این ناکارآمدی می تواند منجر به نادیده گرفته شدن خطرات، عدم رعایت مقررات و در نهایت خسارت مالی برای سازمان ها شود.

چالش

متون حقوقی به طور منحصر به فردی چالش برانگیز هستند پردازش زبان طبیعی (NLP) به دلیل واژگان تخصصی، نحو پیچیده و اهمیت حیاتی زمینه. اصطلاحاتی که در زبان عمومی مشابه به نظر می رسند می توانند معانی بسیار متفاوتی در زمینه های حقوقی داشته باشند. بنابراین، مدل‌های عمومی NLP اغلب زمانی که مستقیماً در اسناد قانونی اعمال می‌شوند، کوتاهی می‌کنند.

راه حل

اینجاست که تنظیم دقیق مدل های زبان تخصصی وارد عمل می شود. با تطبیق مدل‌هایی که از قبل بر روی مجموعه‌های حقوقی آموزش دیده‌اند، می‌توانیم به دقت و قابلیت اطمینان بالاتری در کارهایی مانند تجزیه و تحلیل قرارداد، نظارت بر انطباق و بازیابی اسناد قانونی دست یابیم. در این مقاله به بررسی نحوه انجام آن خواهیم پرداخت حقوقی-BERT [5]، یک مدل مبتنی بر ترانسفورماتور که برای متون قانونی طراحی شده است، می تواند برای طبقه بندی مفاد قرارداد با استفاده از LEDGAR مجموعه داده [4] – یک معیار جامع مجموعه داده به طور خاص برای حوزه حقوقی طراحی شده است.

آنچه شما یاد خواهید گرفت

در پایان این آموزش، شما یک نقشه راه کامل برای استفاده از Legal-BERT برای مقابله با طبقه بندی متون قانونی خواهید داشت. امروز راهنمایی در مورد:

  • تنظیم محیط خود برای وظایف NLP شامل اسناد قانونی.
  • درک و پیش پردازش مجموعه داده LEDGAR برای عملکرد بهینه مدل.
  • انجام تجزیه و تحلیل داده های اکتشافی برای به دست آوردن بینش در مورد ساختار مجموعه داده.
  • تنظیم دقیق Legal-BERT برای طبقه بندی چند طبقه ای از مقررات قانونی.
  • ارزیابی عملکرد مدل در برابر معیارهای تعیین شده
  • بحث در مورد چالش ها و ملاحظات خاص برنامه های NLP قانونی.

چه شما یک دانشمند داده باشید که قصد دارد تخصص خود را در NLP تعمیق بخشد یا یک یادگیری ماشینی مهندس علاقه مند به تنظیم دقیق مدل های خاص دامنه، این آموزش شما را با ابزارها و بینش هایی که برای شروع نیاز دارید مجهز می کند.

فهرست مطالب

  1. راه اندازی محیط
  2. بررسی اجمالی مجموعه داده
  3. پیش پردازش و توکن سازی
  4. تجزیه و تحلیل داده های اکتشافی (EDA)
  5. آموزش و تنظیم دقیق
  6. ارزیابی مدل
  7. نتیجه گیری و نکات کلیدی

راه اندازی محیط

ما از کتابخانه Hugging Face Transformers استفاده خواهیم کرد که مدل ها و ابزارهای از پیش آموزش دیده را برای تنظیم دقیق آنها ارائه می دهد. در حالی که به شدت ضروری نیست، استفاده از a پردازنده گرافیکی سرعت تمرین را به میزان قابل توجهی افزایش خواهد داد. اگر استفاده می کنید گوگل کولبرا فعال کنید پردازنده گرافیکی با رفتن به Runtime > نوع زمان اجرا را تغییر دهید و انتخاب پردازنده گرافیکی.

ابتدا کتابخانه های لازم را نصب کنید:

!pip install transformers datasets torch scikit-learn
# Import necessary dependencies
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments, AutoModelForMaskedLM
from datasets import load_dataset, DatasetDict
import numpy as np
import pandas as pd
from sklearn.metrics import accuracy_score, f1_score, classification_report
from datasets import load_dataset
from transformers import AutoTokenizer
import matplotlib.pyplot as plt
from transformers import AutoModelForSequenceClassification, DataCollatorForLanguageModeling, Trainer
from torch.utils.data import DataLoader
from sklearn.metrics import accuracy_score, f1_score, classification_report, precision_recall_curve
import seaborn as sns
import os
# Set device for GPU usage
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(f"Using device: {device}")

بررسی اجمالی مجموعه داده

تصویر از LexGLUE Benchmark [1]

مجموعه داده انتخاب شده برای این پروژه است LEDGAR (با برچسب EDGAR)، بخشی از معیار LexGLUE برای وظایف زبان حقوقی [1, 3]. LEDGAR شامل مفاد قرارداد از پرونده های SEC در دسترس عموم است که به عنوان قراردادهای نمایشگاه 10 نیز شناخته می شود که در زمینه های قانونی ضروری است. مجموعه داده شامل حدود 80000 ماده است که در 100 دسته برچسب گذاری شده اند، از “قراردادها” و “محرمانه بودن” تا “فسخ” و “تخصیص” [3].

LEDGAR یک مجموعه داده چالش برانگیز را برای مدل های NLP به دلیل اصطلاحات متنوع و برچسب های متنی خاص ارائه می دهد. این مفاد به مجموعه‌های آموزشی، اعتبارسنجی و آزمایشی تقسیم می‌شوند که شامل 60000 مفاد برای آموزش، 10000 مورد برای اعتبارسنجی و 10000 مورد برای آزمایش است. برای این آموزش، مجموعه داده را با استفاده از کتابخانه مجموعه داده های Hugging Face دانلود و آماده می کنیم.

توصیه میکنم برید این لینک [4] برای به دست آوردن درک بهتری از مجموعه داده و معیار LexGLUE.

# Load LEDGAR dataset
dataset = load_dataset('lex_glue', 'ledgar')

# Display dataset features
print(dataset['train'].features)

# Get label information
label_list = dataset['train'].features['label'].names
num_labels = len(label_list)
print(f"Number of labels: {num_labels}")
تعداد برچسب

نمونه ای از آنچه برخی از داده های قطار به نظر می رسد به شرح زیر است [4]:

{
"text": "Executive agrees to be employed with the Company, and the Company agrees to employ Executive, during the Term and on the terms and conditions set forth in this Agreement. Executive agrees during the term of this Agreement to devote substantially all of Executive’s business time, efforts, skills and abilities to the performance of Executive’s duties ...",
"label": "Employment"
}

پیش پردازش و توکن سازی

برای تنظیم دقیق Legal-BERT به طور موثر، باید مجموعه داده LEDGAR را با چندین مرحله پیش پردازش آماده کنیم:

  1. نگاشت برچسب ها به شاخص ها: برای اطمینان از سازگاری با PyTorch در طول آموزش، بین نام برچسب ها و شاخص ها نگاشت ایجاد کنید.
  2. محاسبه طول رمز: طول نشانه هر نمونه متن را محاسبه کنید. این به ما کمک می کند تا توزیع داده ها را درک کنیم و اطمینان حاصل کنیم که حداکثر طول دنباله (تنظیم شده روی 512 نشانه) برای مجموعه داده مناسب است.
  3. نشانه گذاری متون: هر ماده با استفاده از توکنایزر Legal-BERT که برای مدیریت اصطلاحات حقوقی طراحی شده است، نشانه گذاری می شود.
  4. توالی برش و پد: متن‌های طولانی‌تر از حداکثر طول را کوتاه کنید و متن‌های کوتاه‌تر را با حداکثر طول 512 توکن تنظیم کنید. این طول ورودی ثابت را تضمین می کند.
# Create mappings from label names to indices and vice versa
label2id = {label: idx for idx, label in enumerate(label_list)}
id2label = {idx: label for idx, label in enumerate(label_list)}
# Initialize tokenizer
tokenizer = AutoTokenizer.from_pretrained('nlpaueb/legal-bert-base-uncased')

# Token length computation function
def compute_token_lengths(example):
tokens = tokenizer.encode(example['text'], add_special_tokens=True)
example['num_tokens'] = len(tokens)
return example

# Apply token length computation to the dataset
dataset = dataset.map(compute_token_lengths)

def preprocess_data(examples):
# Tokenize the texts
return tokenizer(
examples['text'],
truncation=True, # Truncate texts longer than max_length
padding='max_length', # Pad texts shorter than max_length
max_length=512
)

# Apply the preprocessing function to the dataset
encoded_dataset = dataset.map(preprocess_data, batched=True)

# Set the format of the dataset to PyTorch tensors
encoded_dataset.set_format(
type='torch',
columns=['input_ids', 'attention_mask', 'label']
)

encoded_dataset

تجزیه و تحلیل داده های اکتشافی (EDA)

EDA یک گام اساسی در هر یک است یادگیری ماشینی گردش کار، به ویژه هنگام کار با مجموعه داده های بزرگ و پیچیده مانند LEDGAR. با بررسی ساختار، توزیع و ویژگی های کلیدی داده ها، می توانیم تصمیمات آگاهانه ای در مورد پیش پردازش و تنظیم مدل بگیریم.

توزیع طول توکن

از آنجایی که مدل ما (Legal-BERT) دارای حداکثر طول نشانه ورودی 512 است، درک توزیع طول نشانه برای ارزیابی اینکه آیا داده ها با این محدودیت مطابقت دارند یا خیر، مهم است. در اینجا یک هیستوگرام است که توزیع طول نشانه را برای مجموعه های آموزشی، اعتبار سنجی و تست نمایش می دهد.

همانطور که می بینیم، در حالی که بیشتر مقررات زیر حد 512 توکن هستند، برخی از این حد فراتر می روند. کوتاه کردن توالی های طولانی تر از 512 توکن برای حفظ ثبات در ورودی ها ضروری است. این با معیار LexGLUE مطابقت دارد و امکان مقایسه نتایج با تحقیقات قبلی را فراهم می کند [1].

توزیع کلاس

LEDGAR شامل 100 کلاس مختلف با طیف گسترده ای از فرکانس ها در دسته ها می باشد. در زیر نمودارهای میله ای وجود دارد که 10 کلاس برتر و 10 کلاس پایین را از نظر فراوانی در مجموعه آموزشی نشان می دهد.

تصویر ایجاد شده توسط نویسنده
تصویر ایجاد شده توسط نویسنده

عدم تعادل کلاس قابل توجهی در مجموعه داده وجود دارد. کلاس‌های خاصی مانند «قوانین حاکم» و «اعلامیه‌ها» تعداد نمونه‌های بالایی دارند، در حالی که برخی دیگر مانند «کتاب‌ها» و «تکالیف» کمتر رایج هستند.

در حالی که پرداختن به عدم تعادل کلاس می تواند عملکرد مدل را بهبود بخشد، به ویژه در کلاس های کمتر ارائه شده، ما انتخاب کرده ایم که توزیع اصلی را در این مورد حفظ کنیم. این تصمیم برای اطمینان از مقایسه منصفانه با معیار LexGLUE گرفته شد که از مجموعه داده LEDGAR نامتعادل استفاده می کند. [1]. با این حال، در یک محیط تولید، تکنیک‌هایی مانند وزن‌دهی کلاس یا افزایش داده‌ها می‌تواند برای متعادل کردن کلاس‌ها استفاده شود و توانایی مدل برای تعمیم در همه دسته‌ها را افزایش دهد.

اکنون که مراحل پیش پردازش و EDA لازم را تکمیل کرده ایم، بیایید به روش تنظیم دقیق خود برویم.

آموزش و تنظیم دقیق

تصویر ایجاد شده توسط نویسنده

تنظیم دقیق Legal-BERT در LEDGAR شامل پیکربندی مدل برای یک کار طبقه بندی چند کلاسه با 100 دسته است. اولویت بندی می کنیم ماکرو F1 و میکرو F1 نمرات به عنوان معیارهای ارزیابی اولیه ما، مطابق با معیار LexGLUE، که از این معیارها برای ارزیابی عملکرد مدل استفاده می کند [1, 4]. بیایید نحوه تنظیم و آموزش مدل خود را بررسی کنیم.

پیکربندی مدل و آموزش

ما Legal-BERT را با یک سر طبقه بندی دنباله بارگذاری می کنیم که 100 کلاس خروجی را مشخص می کند. علاوه بر این، ما برای اطمینان از کدگذاری مناسب برچسب، نگاشت نام‌ها و شاخص‌ها را تعریف می‌کنیم.

# Load Legal-BERT with a classification head for 100 classes
model = AutoModelForSequenceClassification.from_pretrained(
"nlpaueb/legal-bert-base-uncased",
num_labels=num_labels, # Number of labels (100)
id2label=id2label, # Mapping from IDs to labels
label2id=label2id # Mapping from labels to IDs
)
model.to(device)

معیارهای سفارشی برای ارزیابی

همانطور که قبلا گفته شد، ما بر روی آن تمرکز خواهیم کرد ماکرو F1 و میکرو F1 معیارهای عملکرد ماکرو F1 امتیازات F1 هر کلاس را به طور یکسان میانگین می‌کند، و بینشی را در مورد اینکه مدل به خوبی دسته‌های ارائه‌نشده را مدیریت می‌کند، ارائه می‌کند، در حالی که Micro F1 نتایج را در همه کلاس‌ها جمع‌آوری می‌کند و دیدی جامع از عملکرد ارائه می‌دهد. با استفاده از این معیارها، اطمینان حاصل می کنیم که نتایج ما به طور مستقیم با معیار LexGLUE قابل مقایسه است.

def compute_metrics(eval_pred):
logits, labels = eval_pred
predictions = np.argmax(logits, axis=1)

# Calculate accuracy
accuracy = accuracy_score(labels, predictions)

# Calculate macro F1-score
macro_f1 = f1_score(labels, predictions, average='macro', zero_division=0)

# Calculate micro F1-score
micro_f1 = f1_score(labels, predictions, average='micro', zero_division=0)

return {
'accuracy': accuracy,
'macro_f1': macro_f1,
'micro_f1': micro_f1
}

استدلال های آموزشی

در مرحله بعد، ما باید استدلال های آموزشی خود را از جمله پارامترهایی مانند اندازه دسته، تعداد دوره ها، نرخ یادگیری و استراتژی ارزیابی ایجاد کنیم. مدل ذخیره شده “بهترین نسخه” بر اساس امتیاز F1 ماکرو است که تضمین می کند مدل انتخاب شده متعادل ترین عملکرد را در همه کلاس ها دارد.

training_args = TrainingArguments(
output_dir='./results',
num_train_epochs=5,
per_device_train_batch_size=128,
per_device_eval_batch_size=128,
evaluation_strategy='epoch',
save_strategy='epoch',
learning_rate=2e-5,
logging_dir='./logs',
load_best_model_at_end=True,
metric_for_best_model='macro_f1',
greater_is_better=True,
fp16=True, # Enables mixed precision for faster training
logging_steps=100
)

آموزش مدل

با استفاده از کلاس Hugging Face’s Trainer، ما Legal-BERT را در LEDGAR با استدلال‌ها و معیارهای ارزیابی مشخص شده آموزش می‌دهیم. این راه اندازی فرآیند آموزش را ساده می کند و ارزیابی خودکار را پس از هر دوره ارائه می دهد.

# Initialize the Trainer with the model, arguments, and training data
trainer = Trainer(
model=model,
args=training_args,
train_dataset=encoded_dataset['train'],
eval_dataset=encoded_dataset['validation'],
compute_metrics=compute_metrics
)
# Start fine-tuning
trainer.train()

ارزیابی نهایی در مجموعه آزمون

پس از اتمام آموزش، می‌توانیم مدل را روی مجموعه تست ارزیابی کنیم تا معیارهای عملکرد نهایی را بدست آوریم. این به ما امکان می دهد ارزیابی کنیم که چگونه مدل به داده های دیده نشده تعمیم می یابد.

# Evaluate on the validation set
eval_results = trainer.evaluate()

# Extract and print macro and micro F1 scores
val_macro_f1 = eval_results.get('eval_macro_f1')
val_micro_f1 = eval_results.get('eval_micro_f1')

print("Validation Results:")
print(f"Validation Macro F1-score: {val_macro_f1:.4f}")
print(f"Validation Micro F1-score: {val_micro_f1:.4f}")

# Predict on the test set
test_results = trainer.predict(encoded_dataset['test'])

# Extract predictions and true labels
test_logits, test_labels = test_results.predictions, test_results.label_ids
test_predictions = np.argmax(test_logits, axis=1)

# Calculate test metrics
test_accuracy = accuracy_score(test_labels, test_predictions)
test_macro_f1 = f1_score(test_labels, test_predictions, average='macro', zero_division=0)
test_micro_f1 = f1_score(test_labels, test_predictions, average='micro', zero_division=0)

# Print test results
print("Test Results:")
print(f"Test Accuracy: {test_accuracy:.4f}")
print(f"Test Macro F1-score: {test_macro_f1:.4f}")
print(f"Test Micro F1-score: {test_micro_f1:.4f}")

تصویر ایجاد شده توسط نویسنده

با تمرکز بر امتیازات ماکرو و میکرو F1، می‌توانیم دید متعادلی از عملکرد مدل در همه کلاس‌ها به دست آوریم، که در مجموعه داده‌های نامتعادل مانند LEDGAR ضروری است. این رویکرد ارزیابی با معیار LexGLUE مطابقت دارد [1, 4]، امکان مقایسه نتایج ما با مدل های استاندارد صنعتی برای طبقه بندی متن قانونی را فراهم می کند. در زیر نتایج معیار گزارش شده در مقایسه با مدل ما آمده است.

تصویر ایجاد شده توسط نویسنده

اگرچه عملکرد مدل ما کاملاً با نتایج معیار مطابقت دارد، ممکن است به دلیل چندین عامل تفاوت‌های جزئی ایجاد شود. تغییرات در پیکربندی آموزش – مانند فراپارامترها، اندازه دسته، تعداد دوره‌ها یا نرخ یادگیری – می‌تواند بر نتایج تأثیر بگذارد. تفاوت‌ها در پیش‌پردازش داده‌ها، مانند مدیریت کلاس‌های نادر یا روش‌های برش دنباله‌ای، ممکن است به این اختلافات کمک کند. در نهایت، ماهیت تصادفی تمرین به این معنی است که دانه‌های تصادفی مختلف می‌توانند منجر به تغییر در نتایج شوند و شکاف‌های عملکرد جزئی مشاهده‌شده را توضیح دهند.

نتیجه گیری و نکات کلیدی

در این آموزش، تنظیم دقیق Legal-BERT را در مجموعه داده LEDGAR برای طبقه بندی مفاد قرارداد قانونی بررسی کردیم. با استفاده از یک مدل خاص دامنه، ما توانستیم به عملکرد قوی در مدیریت زبان ظریف اسناد قانونی دست یابیم و قدرت تنظیم دقیق در وظایف تخصصی NLP را به نمایش بگذاریم.

نکات کلیدی:

  • مدل های حقوقی از قبل آموزش دیده ارزشمند هستند: مدل‌های حقوقی خاص مانند Legal-BERT برای مدیریت دقیق واژگان پیچیده، تخصصی و تفاوت‌های ظریف دامنه خاص در متون قانونی ضروری هستند.
  • تنظیم دقیق برای تخصص: تطبیق مدل‌های BERT با وظایف خاص از طریق تنظیم دقیق، عملکرد طبقه‌بندی و استحکام آن‌ها را افزایش می‌دهد، به‌ویژه زمانی که با کلاس‌های نامتعادل و دسته‌های متنوع در مجموعه‌های داده مانند LEDGAR سروکار داریم.
  • سازگاری با معیارها: همراستایی با معیارهای تعیین شده، مانند LexGLUE، امکان مقایسه عینی و بینش در مورد اینکه چگونه مدل شما در برابر استانداردهای صنعت قرار می گیرد، می دهد.

اگر این آموزش برای شما مفید بود، برای مقاله بعدی من را دنبال کنید، جایی که من به یک تکنیک پیشرفته می پردازم: استفاده از Retrieval-Augmented Generation (RAG) همراه با مدل سازی موضوع برای بهبود عملکرد طبقه بندی در مجموعه داده های پیچیده. این آموزش آینده بر اساس ایده هایی از این مقاله تراز موضوعی توسط بن مک کلاسکیکاوش در مورد اینکه چگونه همسویی موضوع می تواند عملکرد مدل را در NLP افزایش دهد.

مراجع

[1] Chalkidis، I.، Jana، A.، Hartung، D.، و همکاران. “LexGLUE: مجموعه داده های معیار برای درک زبان حقوقی در انگلیسی،” 2021. arXiv:2110.00976v4.

[2] مک‌کلاسکی، بی‌جیهم ترازی موضوع برای NLP سیستم های توصیه کننده،” Medium, 2024. موجود در: مقاله متوسط.

[3] Tuggener, D., von Däniken, P., Peetz, T., Cieliebak, M.LEDGAR: مجموعه چند برچسبی در مقیاس بزرگ برای طبقه بندی متن مفاد قانونی در قراردادها،” LREC 2020. (CC BY-SA 4.0) مجموعه مقالات LREC.

[4] صورت در آغوش گرفته. “مجموعه داده LexGLUE روی صورت در آغوش گرفته. صورت در آغوش گرفته.

[5] صورت در آغوش گرفته. “مدل حقوقی-BERT،” مجوز MIT. مدل صورت در آغوش.

کد

!pip install transformers datasets torch scikit-learn

# Import necessary dependencies
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments, AutoModelForMaskedLM
from datasets import load_dataset, DatasetDict
import numpy as np
import pandas as pd
from sklearn.metrics import accuracy_score, f1_score, classification_report
from datasets import load_dataset
from transformers import AutoTokenizer
import matplotlib.pyplot as plt
from transformers import AutoModelForSequenceClassification, DataCollatorForLanguageModeling, Trainer
from torch.utils.data import DataLoader
from sklearn.metrics import accuracy_score, f1_score, classification_report, precision_recall_curve
import seaborn as sns
import os

# Set device for GPU usage
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(f"Using device: {device}")

# Load LEDGAR dataset
dataset = load_dataset('lex_glue', 'ledgar')

# Display dataset features
print(dataset['train'].features)

# Get label information
label_list = dataset['train'].features['label'].names
num_labels = len(label_list)
print(f"Number of labels: {num_labels}")

# Create mappings from label names to indices and vice versa
label2id = {label: idx for idx, label in enumerate(label_list)}
id2label = {idx: label for idx, label in enumerate(label_list)}

# Initialize tokenizer
tokenizer = AutoTokenizer.from_pretrained('nlpaueb/legal-bert-base-uncased')

# Token length computation function
def compute_token_lengths(example):
tokens = tokenizer.encode(example['text'], add_special_tokens=True)
example['num_tokens'] = len(tokens)
return example

# Apply token length computation to the dataset
dataset = dataset.map(compute_token_lengths)

def preprocess_data(examples):
# Tokenize the texts
return tokenizer(
examples['text'],
truncation=True, # Truncate texts longer than max_length
padding='max_length', # Pad texts shorter than max_length
max_length=512
)

# Apply the preprocessing function to the dataset
encoded_dataset = dataset.map(preprocess_data, batched=True)

# Set the format of the dataset to PyTorch tensors
encoded_dataset.set_format(
type='torch',
columns=['input_ids', 'attention_mask', 'label']
)

encoded_dataset

# Plot token length distribution across the dataset splits
def plot_token_length_distribution(dataset, title='Token Length Distribution'):
plt.figure(figsize=(10,6))
for subset, color in zip(['train', 'validation', 'test'], ['blue', 'orange', 'green']):
lengths = dataset[subset]['num_tokens']
sns.histplot(lengths, bins=50, kde=True, label=subset.capitalize(), color=color, stat="frequency", alpha=0.5)
plt.title(title)
plt.xlabel('Number of Tokens')
plt.ylabel('Frequency')
plt.legend()
plt.show()

plot_token_length_distribution(dataset, title="Token Length Distribution (Full Dataset)")

# Function to plot class distribution for top and bottom classes
def plot_class_distribution(dataset, split='train', top_n=10):
label_counts = pd.Series(dataset[split]['label']).value_counts()

# Top 10 labels
top_labels = label_counts.head(top_n)
top_label_names = [label_list[i] for i in top_labels.index]

# Bottom 10 labels
bottom_labels = label_counts.tail(top_n)
bottom_label_names = [label_list[i] for i in bottom_labels.index]

# Plot the top 10 class distribution
plt.figure(figsize=(12,6))
sns.barplot(x=top_label_names, y=top_labels.values, palette='Blues_d')
plt.xticks(rotation=45, fontsize=12)
plt.title(f'Top {top_n} Class Distribution - {split}', fontsize=14)
plt.xlabel('Class Label', fontsize=12)
plt.ylabel('Frequency', fontsize=12)
plt.show()

# Plot the bottom 10 class distribution
plt.figure(figsize=(12,6))
sns.barplot(x=bottom_label_names, y=bottom_labels.values, palette='Reds_d')
plt.xticks(rotation=45, fontsize=12)
plt.title(f'Bottom {top_n} Class Distribution - {split}', fontsize=14)
plt.xlabel('Class Label', fontsize=12)
plt.ylabel('Frequency', fontsize=12)
plt.show()

# Call the function to plot for the train split
plot_class_distribution(dataset, 'train')

# Load Legal-BERT with a classification head for 100 classes
model = AutoModelForSequenceClassification.from_pretrained(
"nlpaueb/legal-bert-base-uncased",
num_labels=num_labels, # Number of labels (100)
id2label=id2label, # Mapping from IDs to labels
label2id=label2id # Mapping from labels to IDs
)
model.to(device)

def compute_metrics(eval_pred):
logits, labels = eval_pred
predictions = np.argmax(logits, axis=1)

# Calculate accuracy
accuracy = accuracy_score(labels, predictions)

# Calculate macro F1-score
macro_f1 = f1_score(labels, predictions, average='macro', zero_division=0)

# Calculate micro F1-score
micro_f1 = f1_score(labels, predictions, average='micro', zero_division=0)

return {
'accuracy': accuracy,
'macro_f1': macro_f1,
'micro_f1': micro_f1
}

os.environ["WANDB_DISABLED"] = "true"

# Your Trainer arguments below
training_args = TrainingArguments(
output_dir='./results',
num_train_epochs=5,
per_device_train_batch_size=128,
per_device_eval_batch_size=128,
evaluation_strategy='epoch',
save_strategy='epoch',
learning_rate=2e-5,
logging_dir='./logs',
load_best_model_at_end=True,
metric_for_best_model='macro_f1',
greater_is_better=True,
fp16=True,
logging_steps=100,
report_to="none", # This disables all logging integrations like W&B
seed=42
)

trainer = Trainer(
model=model, # The pre-trained model
args=training_args, # Training arguments
train_dataset=encoded_dataset['train'], # Training dataset
eval_dataset=encoded_dataset['validation'], # Validation dataset
compute_metrics=compute_metrics # Evaluation metrics
)

# Start fine-tuning
trainer.train()

# Evaluate on the validation set
eval_results = trainer.evaluate()

# Extract and print macro and micro F1 scores
val_macro_f1 = eval_results.get('eval_macro_f1')
val_micro_f1 = eval_results.get('eval_micro_f1')

print("Validation Results:")
print(f"Validation Macro F1-score: {val_macro_f1:.4f}")
print(f"Validation Micro F1-score: {val_micro_f1:.4f}")

# Predict on the test set
test_results = trainer.predict(encoded_dataset['test'])

# Extract predictions and true labels
test_logits, test_labels = test_results.predictions, test_results.label_ids
test_predictions = np.argmax(test_logits, axis=1)

# Calculate test metrics
test_accuracy = accuracy_score(test_labels, test_predictions)
test_macro_f1 = f1_score(test_labels, test_predictions, average='macro', zero_division=0)
test_micro_f1 = f1_score(test_labels, test_predictions, average='micro', zero_division=0)

منتشر شده از طریق به سمت هوش مصنوعی



منبع: https://towardsai.net/p/artificial-intelligence/fine-tuning-legal-bert-llms-for-automated-legal-text-classification