در دنیای امروز که حجم عظیمی از داده‌های متنی در فضای دیجیتال تولید می‌شود، استخراج خودکار اطلاعات از متون به یکی از نیازهای اساسی تبدیل شده است. تشخیص موجودیت‌های نام‌دار یا Named Entity Recognition (NER) یکی از مهم‌ترین وظایف پردازش زبان طبیعی است که هدف آن شناسایی و طبقه‌بندی عناصر کلیدی در متن مانند نام افراد، مکان‌ها، سازمان‌ها و سایر موجودیت‌های مهم می‌باشد. با ظهور مدل BERT در سال 2018، انقلابی در این حوزه رخ داد که دقت سیستم‌های NER را به طور چشمگیری افزایش داد.

در این مقاله، به بررسی جامع نحوه پیاده‌سازی سیستم NER با استفاده از مدل BERT خواهیم پرداخت. ابتدا با مفاهیم پایه آشنا می‌شویم، سپس معماری BERT را تحلیل کرده و در نهایت مراحل عملی پیاده‌سازی را گام به گام بررسی خواهیم کرد.

درک مفهوم Named Entity Recognition

Named Entity Recognition یکی از زیرمجموعه‌های مهم استخراج اطلاعات است که هدف آن یافتن و طبقه‌بندی موجودیت‌های نام‌دار در متن می‌باشد. این موجودیت‌ها می‌توانند شامل نام افراد، مکان‌ها، سازمان‌ها، تاریخ‌ها، مقادیر پولی و دسته‌بندی‌های دیگر باشند.

کاربردهای NER در دنیای واقعی

سیستم‌های NER در صنایع مختلف کاربرد گسترده‌ای دارند. در سیستم‌های پاسخ به سوال، NER به شناسایی موجودیت‌های کلیدی در سوال کمک می‌کند و در حوزه پزشکی، این سیستم‌ها می‌توانند نام بیماری‌ها، داروها و علائم را از پرونده‌های پزشکی استخراج کنند. همچنین در تحلیل احساسات و نظرسنجی‌ها، شناسایی نام برندها و محصولات اهمیت ویژه‌ای دارد.

روش‌های سنتی NER

قبل از ظهور مدل‌های مبتنی بر Transformer مانند BERT، سیستم‌های NER عمدتاً بر اساه رویکردهای زیر کار می‌کردند:

روش‌های مبتنی بر قانون: این روش‌ها از قوانین دستی و الگوهای از پیش تعریف‌شده استفاده می‌کردند که نیازمند دانش تخصصی زیادی بودند و انعطاف‌پذیری کمی داشتند.

یادگیری ماشین سنتی: مدل‌هایی مانند CRF و SVM که به مهندسی ویژگی‌های دستی نیاز داشتند، از جمله برچسب‌های نقش دستوری، شکل کلمات و بردارهای تعبیه شده.

مدل‌های عمیق BiLSTM-CRF: ترکیب شبکه‌های حافظه کوتاه-مدت دوطرفه با Conditional Random Fields که توانستند وابستگی‌های ترتیبی را در متن مدل کنند.

با این حال، این روش‌ها محدودیت‌هایی داشتند. آن‌ها نمی‌توانستند به طور کامل از زمینه دوطرفه استفاده کنند و نیاز به داده‌های برچسب‌گذاری شده زیادی داشتند. این جایی است که BERT وارد می‌شود.

معرفی BERT: نقطه عطفی در پردازش زبان طبیعی

BERT که مخفف Bidirectional Encoder Representations from Transformers است، یک مدل زبانی پیش‌آموزش دیده است که توسط محققان گوگل در سال 2018 معرفی شد. این مدل بر پایه معماری Transformer ساخته شده و توانایی یادگیری نمایش‌های دوطرفه عمیق از متن را دارد.

ویژگی‌های کلیدی BERT

یادگیری دوطرفه: برخلاف مدل‌های قبلی که متن را تنها از چپ به راست یا راست به چپ پردازش می‌کردند، BERT می‌تواند از زمینه سمت چپ و راست کلمه به طور همزمان استفاده کند. این قابلیت به مدل اجازه می‌دهد درک عمیق‌تری از معنای کلمات بر اساس زمینه‌شان داشته باشد.

پیش‌آموزش و تنظیم دقیق: BERT ابتدا بر روی حجم عظیمی از داده‌های غیرنظارت شده پیش‌آموزش داده می‌شود. سپس با یک لایه خروجی ساده می‌توان آن را برای وظایف خاص مانند NER تنظیم دقیق کرد، بدون نیاز به تغییرات معماری قابل توجه.

معماری Transformer: BERT از مکانیزم توجه چندسری (Multi-Head Attention) استفاده می‌کند که به مدل این امکان را می‌دهد تا بر روی بخش‌های مختلف ورودی تمرکز کند و روابط پیچیده بین کلمات را یاد بگیرد.

انواع مدل‌های BERT

BERT Base: این نسخه دارای 12 لایه، 768 واحد پنهان و 12 هد توجه است که جمعاً 110 میلیون پارامتر دارد.

BERT Large: نسخه بزرگ‌تر با 24 لایه، 1024 واحد پنهان و 16 هد توجه که حاوی 340 میلیون پارامتر است.

برای اکثر کاربردها، BERT Base کارایی مناسبی ارائه می‌دهد، در حالی که BERT Large برای دستیابی به بهترین نتایج در کارهای پیچیده‌تر استفاده می‌شود.

چرا BERT برای NER انتخاب مناسبی است؟

مزایای استفاده از BERT در NER

درک زمینه‌ای قوی: BERT با توجه به کل جمله، معنای دقیق‌تری از کلمات به دست می‌آورد. برای مثال، کلمه “شیر” می‌تواند به معنای حیوان، شیر خوراکی یا شیر آب باشد که BERT با توجه به زمینه تشخیص می‌دهد.

عملکرد برتر

نیاز کمتر به داده برچسب‌گذاری شده

انتقال یادگیری

چالش‌ها و محدودیت‌ها

نیاز به منابع محاسباتی: آموزش و استفاده از BERT به سخت‌افزار قدرتمند نیاز دارد. البته نسخه‌های بهینه‌شده‌تری مانند DistilBERT که 60 درصد سریع‌تر هستند و 95 درصد از عملکرد BERT را حفظ می‌کنند، در دسترس هستند.

تقسیم‌بندی توکن: BERT از توکن‌ساز WordPiece استفاده می‌کند که کلمات را به زیرکلمات تقسیم می‌کند. این امر می‌تواند در برخی موارد چالش‌برانگیز باشد و نیاز به پس‌پردازش دارد.

دامنه تخصصی: برای کاربردهای تخصصی، ممکن است نیاز به تنظیم دقیق بیشتر یا استفاده از داده‌های دامنه‌ای خاص باشد.

معماری BERT برای NER

ساختار کلی

برای استفاده از BERT در وظیفه NER، ما یک لایه طبقه‌بندی توکن را به بالای مدل BERT اضافه می‌کنیم. این معماری شامل مراحل زیر است:

لایه توکن‌سازی: متن ورودی به توکن‌های کوچک‌تر تبدیل می‌شود. BERT از یک توکن ویژه [CLS] در ابتدای هر دنباله و [SEP] برای جداسازی جملات استفاده می‌کند.

لایه تعبیه (Embedding): هر توکن به یک بردار عددی تبدیل می‌شود که شامل سه نوع تعبیه است:

  • تعبیه توکن: نمایش خود کلمه
  • تعبیه موقعیت: موقعیت توکن در جمله
  • تعبیه بخش: مشخص می‌کند توکن به کدام جمله تعلق دارد

لایه‌های Encoder: 12 یا 24 لایه Transformer که هرکدام شامل مکانیزم Self-Attention و یک شبکه Feed-Forward هستند. این لایه‌ها نمایش‌های زمینه‌ای عمیق از هر توکن تولید می‌کنند.

لایه طبقه‌بندی: یک لایه خطی ساده که بردار خروجی هر توکن را به احتمالات کلاس‌های NER نگاشت می‌کند.

برچسب‌گذاری IOB

در NER معمولاً از روش برچسب‌گذاری IOB استفاده می‌شود:

  • B (Beginning): نشان‌دهنده شروع یک موجودیت است
  • I (Inside): نشان‌دهنده ادامه یک موجودیت است
  • O (Outside): نشان‌دهنده کلماتی است که جزء هیچ موجودیتی نیستند

برای مثال، در جمله “علی در تهران زندگی می‌کند”:

  • علی: B-PER (شروع نام شخص)
  • در: O
  • تهران: B-LOC (شروع نام مکان)
  • زندگی: O
  • می‌کند: O

دیتاست CoNLL-2003

دیتاست CoNLL-2003 یکی از معروف‌ترین معیارهای ارزیابی سیستم‌های NER است. این دیتاست شامل مقالات خبری از رویترز است که در آن‌ها چهار نوع موجودیت برچسب‌گذاری شده است:

  • PER: نام افراد
  • LOC: نام مکان‌ها
  • ORG: نام سازمان‌ها
  • MISC: سایر موجودیت‌ها

این دیتاست شامل بیش از 203 هزار توکن در بخش آموزش و حدود 46 هزار توکن در بخش تست است. مدل‌های مبتنی بر BERT توانسته‌اند بر روی این دیتاست به نتایج برجسته‌ای دست یابند.

پیاده‌سازی عملی NER با BERT

گام اول: نصب کتابخانه‌های لازم

برای شروع کار، باید کتابخانه Transformers از Hugging Face را نصب کنیم که دسترسی آسان به مدل‌های پیش‌آموزش دیده BERT را فراهم می‌کند:

pip install transformers
pip install torch
pip install seqeval

کتابخانه seqeval برای ارزیابی مدل‌های NER طراحی شده و معیارهای استانداردی مانند دقت، بازخوانی و F1 را محاسبه می‌کند.

گام دوم: بارگذاری و آماده‌سازی داده

ابتدا باید داده‌های خود را به فرمت مناسب تبدیل کنیم:

from transformers import AutoTokenizer
import torch

# بارگذاری توکن‌ساز BERT
tokenizer = AutoTokenizer.from_pretrained('bert-base-cased')

# مثال جمله و برچسب‌ها
sentence = ["Steve", "Jobs", "founded", "Apple", "in", "California"]
labels = ["B-PER", "I-PER", "O", "B-ORG", "O", "B-LOC"]

# تبدیل برچسب‌ها به اعداد
label_map = {"O": 0, "B-PER": 1, "I-PER": 2, "B-ORG": 3, 
             "I-ORG": 4, "B-LOC": 5, "I-LOC": 6, "B-MISC": 7, "I-MISC": 8}

# توکن‌سازی
encoded = tokenizer(sentence, is_split_into_words=True, 
                   padding=True, truncation=True, return_tensors="pt")

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

گام سوم: ساخت و بارگذاری مدل

حال می‌توانیم مدل BERT را برای طبقه‌بندی توکن بارگذاری کنیم:

from transformers import BertForTokenClassification

# تعداد کلاس‌های NER
num_labels = len(label_map)

# بارگذاری مدل
model = BertForTokenClassification.from_pretrained(
    'bert-base-cased',
    num_labels=num_labels
)

این مدل شامل لایه‌های پیش‌آموزش دیده BERT به علاوه یک لایه طبقه‌بندی خطی در بالا است که به صورت تصادفی مقداردهی اولیه شده و باید آموزش داده شود.

گام چهارم: تنظیم دقیق مدل

فرآیند تنظیم دقیق شامل آموزش مدل بر روی داده‌های برچسب‌گذاری شده NER است:

from transformers import Trainer, TrainingArguments

# تنظیمات آموزش
training_args = TrainingArguments(
    output_dir='./results',
    num_train_epochs=5,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=16,
    learning_rate=2e-5,
    evaluation_strategy="epoch",
    save_strategy="epoch",
    load_best_model_at_end=True,
    warmup_steps=500,
    weight_decay=0.01
)

# ایجاد Trainer
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=eval_dataset
)

# شروع آموزش
trainer.train()

در این مرحله، تنها لایه طبقه‌بندی و لایه‌های بالایی مدل به طور عمده تغییر می‌کنند، در حالی که لایه‌های پایینی که نمایش‌های زبانی عمومی را یاد گرفته‌اند، کمتر تغییر می‌کنند.

گام پنجم: استنتاج و پیش‌بینی

پس از آموزش، می‌توانیم از مدل برای تشخیص موجودیت‌ها در متون جدید استفاده کنیم:

from transformers import pipeline

# ایجاد پایپلاین NER
nlp = pipeline("ner", model=model, tokenizer=tokenizer)

# تست مدل
text = "Elon Musk founded SpaceX in California"
results = nlp(text)

for entity in results:
    print(f"Word: {entity['word']}, Label: {entity['entity']}, 
          Score: {entity['score']:.4f}")

مدل برای هر توکن احتمالات مربوط به کلاس‌های مختلف را محاسبه می‌کند و کلاس با بالاترین احتمال را انتخاب می‌کند.

نتایج و ارزیابی عملکرد

معیارهای ارزیابی

برای ارزیابی مدل‌های NER از سه معیار اصلی استفاده می‌شود:

دقت (Precision): درصد موجودیت‌های پیش‌بینی شده توسط سیستم که صحیح هستند. این معیار نشان می‌دهد مدل چقدر در پیش‌بینی‌های خود دقیق است.

بازخوانی (Recall): درصد موجودیت‌های واقعی موجود در متن که توسط سیستم شناسایی شده‌اند. این معیار نشان می‌دهد مدل چند درصد از موجودیت‌ها را پیدا کرده است.

امتیاز F1: میانگین هارمونیک دقت و بازخوانی که یک معیار جامع برای ارزیابی عملکرد کلی سیستم است.

نتایج بر روی CoNLL-2003

مدل‌های مبتنی بر این معماری نتایج قابل توجهی بر روی دیتاست CoNLL-2003 کسب کرده‌اند. مدل BERT-base-cased تنظیم دقیق شده معمولاً به نتایج زیر دست می‌یابد:

  • PER: F1 حدود 96-97 درصد
  • LOC: F1 حدود 97-98 درصد
  • ORG: F1 حدود 92-93 درصد
  • MISC: F1 حدود 89-90 درصد
  • میانگین کلی: F1 حدود 94-95 درصد

این نتایج نشان می‌دهد که BERT توانسته عملکرد سیستم‌های سنتی NER را به طور قابل ملاحظه‌ای بهبود بخشد.

مقایسه با روش‌های قدیمی

قبل از ظهور این معماری، بهترین سیستم‌های NER بر روی CoNLL-2003 به امتیاز F1 حدود 91 درصد می‌رسیدند. مدل‌های مبتنی بر BERT توانسته‌اند این عدد را به بیش از 95 درصد برسانند که نشان‌دهنده پیشرفت 4-5 درصدی است.

نتایج بر روی زبان فارسی

برای زبان فارسی نیز مدل‌های مبتنی بر BERT توسعه یافته‌اند. ParsBERT که نسخه فارسی BERT است، بر روی دیتاست‌های فارسی مانند ARMAN و PEYMA آموزش داده شده و نتایج خوبی کسب کرده است.

بهینه‌سازی و نکات عملی

استفاده از مدل‌های کوچک‌تر

برای کاربردهایی که منابع محاسباتی محدود است، می‌توان از نسخه‌های فشرده‌تر BERT استفاده کرد:

DistilBERT: نسخه تقطیر شده BERT که 60 درصد سریع‌تر است و 40 درصد پارامتر کمتر دارد اما 95 درصد از عملکرد BERT را حفظ می‌کند.

ALBERT: از اشتراک پارامترها بین لایه‌ها استفاده می‌کند که منجر به کاهش چشمگیر حجم مدل می‌شود.

TinyBERT: نسخه‌ای بسیار کوچک با تنها 28 درصد پارامترهای BERT اصلی.

تکنیک‌های بهبود عملکرد

فریز کردن لایه‌ها: برای جلوگیری از فراموشی فاجعه‌بار، می‌توان لایه‌های پایینی BERT را فریز کرد و تنها لایه‌های بالایی را تنظیم دقیق کرد.

استفاده از CRF: افزودن یک لایه Conditional Random Field بر روی خروجی BERT می‌تواند وابستگی‌های بین برچسب‌ها را بهتر مدل کند.

پیش‌آموزش دامنه‌ای: برای کاربردهای تخصصی، می‌توان BERT را ابتدا بر روی داده‌های خاص آن دامنه پیش‌آموزش داد.