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 × حجم_المفردات) حيث تعكس كل خلية مدى خصوصية تلك الكلمة لتلك الوثيقة.

IDF مُلسَّن (+1 يمنع القسمة على صفر)
🔬

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

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

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

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

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

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

class="tok-comment"># ── Modern approach: sentence embeddings ──────────────────────────
class="tok-comment"># pip install sentence-transformers
from sentence_transformers import SentenceTransformer
from sklearn.linear_model import LogisticRegression

encoder = SentenceTransformer(class="tok-str">'all-MiniLM-L6-v2')
X_emb = encoder.encode(X_text, batch_size=class="tok-num">256, show_progress_bar=True)
clf = LogisticRegression(max_iter=class="tok-num">1000).fit(X_emb[train_idx], y[train_idx])
print(fclass="tok-str">"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 تستخدم بصمت سلوك الإنجليزية افتراضياً.

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

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

تحتاج مهندس ذكاء اصطناعي أو عالم بيانات؟

أبني نماذج تعلم آلي مخصصة، ووكلاء ذكاء اصطناعي، ورؤية حاسوب، وأتمتة — من الفكرة إلى الإنتاج.