ML Learning Hub
تطبيقيمتوسط

معالجة اللغة الطبيعية: خط أنابيب تصنيف النصوص

تعليم الآلات القراءة — من حقيبة الكلمات إلى المحولات

خط أنابيب NLP الكلاسيكي: التجزئة وTF-IDF والتصنيف (بايز/LR/SVM) وتضمينات الكلمات ومحولات الجمل للبحث الدلالي.

45 min
10 مخططات
7 المفاهيم المغطاة

المتطلبات الأساسية

Neural Networks
Naïve Bayes

المفاهيم المغطاة

TokenizationTF-IDFBag of WordsN-gramsCosine SimilarityWord2VecSentence Transformers

الصيغ الرئيسية

TF-IDF

تكرار المصطلح × عكس تكرار الوثيقة — مرتفع عند تكرار الكلمة في الوثيقة لكن ندرتها عالمياً

تشابه جيب التمام

مقياس تشابه الوثائق مستقل عن طول الوثيقة

الحيرة

جودة نموذج اللغة — حيرة أقل = تنبؤ أفضل بالكلمة التالية

محاكاة تفاعلية

Loading visualization…
🎯

ثورة معالجة اللغات الطبيعية

motivation

في 2017، لم يكن GPT-3 موجوداً. في 2023، تكتب نماذج LLM الكود وتجتاز الامتحانات الطبية وتُلخِّص الوثائق القانونية. أساس كل معالجة للغات الطبيعية — من فلاتر البريد المزعج bag-of-words إلى LLMs المحولات — واحد: تمثيل النص عددياً حتى تتمكن النماذج من معالجته. فهم خط أنابيب NLP الكلاسيكي (تجزئة ← تجهيز ← نموذج ← تقييم) يمنحك النموذج الذهني لفهم سبب نجاح المحولات الحديثة.

يُظهر التقرير التقني لـGPT-4 أن النموذج المدرَّب على 100× بيانات أكثر من GPT-3 لا يزال يستفيد من المعالجة المسبقة الكلاسيكية لـNLP (التجزئة، إزالة التكرار، تصفية جودة البيانات). الأساسيات مهمة على نطاق واسع.

💡

خط أنابيب NLP: 5 مراحل

intuition

النص الخام مجرد بايتات Unicode — بلا معنى لنموذج. يحوّله خط أنابيب NLP إلى أرقام: التجزئة (تقسيم النص إلى رموز — كلمات أو أجزاء كلمات أو أحرف)، بناء المفردات (تعيين معرف صحيح لكل رمز فريد)، التجهيز (تحويل معرفات الرموز لتمثيلات عددية كثيفة — one-hot أو TF-IDF أو تضمينات كلمات)، تدريب النموذج (تصنيف أو تجميع أو توليد أو استرجاع)، التقييم (الدقة، F1، BLEU، الحيرة حسب المهمة).

TF-IDF: المتجهي الكلاسيكي

math

تكرار المصطلح (TF): كم مرة تظهر الكلمة t في الوثيقة d؟ تكرار الوثيقة (DF): كم وثيقة تحتوي t؟ IDF العكسي: log(N/DFt) — الكلمات التي تظهر في كل وثيقة (الـ، من، في) تحصل على IDF قريب من الصفر. الكلمات الخاصة بوثائق قليلة تحصل على IDF مرتفع. TF-IDF = TF × IDF. النتيجة مصفوفة متفرقة بشكل (n_docs × حجم_المفردات) حيث تعكس كل خلية مدى خصوصية تلك الكلمة لتلك الوثيقة.

🔬

من حقيبة الكلمات إلى التضمينات الكلمية

deepdive

يتعامل TF-IDF مع كل كلمة كمستقلة — 'بنك' و'مؤسسة مالية' غير مرتبطتان تماماً. تتعلم تضمينات الكلمات (Word2Vec، GloVe، FastText) تمثيلات متجهية كثيفة حيث الكلمات المتشابهة قريبة في الفضاء المتجهي: ملك - رجل + امرأة ≈ ملكة. تلتقط هذه المتجهات الـ300-بُعدية علاقات دلالية لا يستطيع TF-IDF التقاطها. تُنتج محولات الجمل الحديثة (SBERT، all-MiniLM-L6-v2) متجهات بطول ثابت لجمل كاملة تُتيح البحث الدلالي والتجميع والتصنيف الصفري.

لتصنيف النصوص في الإنتاج في 2025: ابدأ بـTF-IDF + LogisticRegression كخط أساس، ثم جرّب تضمينات sentence-transformers + مصنِّف، ثم اضبط BERT/DistilBERT مدرَّباً مسبقاً إذا كانت الجودة لا تزال غير كافية.

⚙️

خط أنابيب تصنيف النصوص

algorithm
1

التحويل لأحرف صغيرة، إزالة علامات الترقيم، إزالة كلمات التوقف اختيارياً

2

التجزئة: word_tokenize أو جزء كلمة (BPE/WordPiece للمحولات)

3

التجهيز: CountVectorizer ← TfidfVectorizer ← word2vec ← تضمينات BERT

4

النموذج: MultinomialNB (خط أساس سريع)، LogisticRegression (خطي قوي)، SVM، BERT المضبوط

5

التقييم: macro-F1 للفئات المتوازنة، weighted-F1 للغير متوازنة، AUC-ROC

6

تحليل الأخطاء: فحص العينات المُصنَّفة خطأً ← تحسين الميزات أو التسمية

</>

خط أنابيب تصنيف NLP الكامل

code
python61 lines
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import ComplementNB
from sklearn.svm import LinearSVC
from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.metrics import classification_report
import numpy as np

# ── Sample text data ───────────────────────────────────────────────────
corpus = [
    "machine learning algorithms data science python",
    "neural network deep learning pytorch tensorflow",
    "natural language processing text classification bert",
    "computer vision image recognition convolutional",
    "reinforcement learning reward policy agent",
    "data preprocessing feature engineering pipeline",
] * 40   # 240 samples, 6 classes
labels = list(range(6)) * 40
X_text = corpus
y = np.array(labels)
X_train, X_test, y_train, y_test = train_test_split(
    X_text, y, test_size=0.2, stratify=y, random_state=42)
# indices for sentence-transformer section
train_idx = np.arange(len(X_train))
test_idx  = np.arange(len(X_test))

# ── Baseline: TF-IDF + Logistic Regression ────────────────────────
pipe_lr = Pipeline([
    ('tfidf', TfidfVectorizer(
        ngram_range=(1,2),
        max_features=100_000,
        sublinear_tf=True,          # log(1+tf) dampens high frequencies
        strip_accents='unicode',
        analyzer='word',
        token_pattern=r'\w{2,}',  # ignore single-char tokens
        min_df=2,                   # ignore very rare words
    )),
    ('clf', LogisticRegression(C=1.0, max_iter=1000, class_weight='balanced')),
])

# ── Alternative: TF-IDF + LinearSVC (fast, great for text) ────────
pipe_svm = Pipeline([
    ('tfidf', TfidfVectorizer(ngram_range=(1,2), max_features=100_000, sublinear_tf=True)),
    ('clf', LinearSVC(C=0.5, class_weight='balanced', max_iter=2000)),
])

# ── Evaluate both with cross-validation ───────────────────────────
for name, pipe in [('LR', pipe_lr), ('SVM', pipe_svm)]:
    scores = cross_val_score(pipe, X_text, y, cv=5, scoring='f1_macro', n_jobs=-1)
    print(f"{name}: macro-F1 = {scores.mean():.3f} ± {scores.std():.3f}")

# ── Modern approach: sentence embeddings ──────────────────────────
# pip install sentence-transformers
from sentence_transformers import SentenceTransformer
from sklearn.linear_model import LogisticRegression

encoder = SentenceTransformer('all-MiniLM-L6-v2')
X_emb = encoder.encode(X_text, batch_size=256, show_progress_bar=True)
clf = LogisticRegression(max_iter=1000).fit(X_emb[train_idx], y[train_idx])
print(f"Sentence-BERT accuracy: {clf.score(X_emb[test_idx], y[test_idx]):.3f}")
⚠️

مزالق خط أنابيب NLP

pitfall

ضبط TfidfVectorizer على مجموعة البيانات الكاملة يُسرِّب مفردات الاختبار للتدريب — قيم IDF تُحسب مع تكرارات وثائق الاختبار. دائماً اضبط داخل Pipeline مُطبَّق على بيانات التدريب فحسب. الثاني: استخدام max_features بلا min_df — الكلمات النادرة جداً صاخبة لكن مُدرَجة. عيِّن min_df=2 أو min_df=0.001. الثالث: تجاهل عدم توازن الفئات — فئة أغلبية بنسبة 95% تجعل الدقة عديمة الفائدة؛ استخدم macro-F1 وclass_weight='balanced'. الرابع: عدم التجذير/التأصيل للمجموعات الصغيرة — 'يركض'، 'ركض'، 'راكض' يجب أن تُعيَّن لنفس الميزة.

للنصوص غير الإنجليزية، استخدم مجزِّئات خاصة باللغة ونماذج متعددة اللغات مدرَّبة مسبقاً (mBERT، XLM-RoBERTa) بدلاً من خطوط الأنابيب المتمركزة حول الإنجليزية. كثير من مكتبات NLP تستخدم بصمت سلوك الإنجليزية افتراضياً.

?اختبار المعرفة

يتم حفظ التقدم في متصفحك — لا حاجة لحساب.

Need a Data Scientist or AI Engineer?

I build custom ML models, RAG chatbots, data pipelines, and production APIs — from analysis to deployment.