معالجة اللغة الطبيعية: خط أنابيب تصنيف النصوص
“تعليم الآلات القراءة — من حقيبة الكلمات إلى المحولات”
خط أنابيب NLP الكلاسيكي: التجزئة وTF-IDF والتصنيف (بايز/LR/SVM) وتضمينات الكلمات ومحولات الجمل للبحث الدلالي.
المتطلبات الأساسية
المفاهيم المغطاة
∑الصيغ الرئيسية
TF-IDF
تكرار المصطلح × عكس تكرار الوثيقة — مرتفع عند تكرار الكلمة في الوثيقة لكن ندرتها عالمياً
تشابه جيب التمام
مقياس تشابه الوثائق مستقل عن طول الوثيقة
الحيرة
جودة نموذج اللغة — حيرة أقل = تنبؤ أفضل بالكلمة التالية
▶محاكاة تفاعلية
ثورة معالجة اللغات الطبيعية
في 2017، لم يكن GPT-3 موجوداً. في 2023، تكتب نماذج LLM الكود وتجتاز الامتحانات الطبية وتُلخِّص الوثائق القانونية. أساس كل معالجة للغات الطبيعية — من فلاتر البريد المزعج bag-of-words إلى LLMs المحولات — واحد: تمثيل النص عددياً حتى تتمكن النماذج من معالجته. فهم خط أنابيب NLP الكلاسيكي (تجزئة ← تجهيز ← نموذج ← تقييم) يمنحك النموذج الذهني لفهم سبب نجاح المحولات الحديثة.
يُظهر التقرير التقني لـGPT-4 أن النموذج المدرَّب على 100× بيانات أكثر من GPT-3 لا يزال يستفيد من المعالجة المسبقة الكلاسيكية لـNLP (التجزئة، إزالة التكرار، تصفية جودة البيانات). الأساسيات مهمة على نطاق واسع.
خط أنابيب NLP: 5 مراحل
النص الخام مجرد بايتات Unicode — بلا معنى لنموذج. يحوّله خط أنابيب NLP إلى أرقام: التجزئة (تقسيم النص إلى رموز — كلمات أو أجزاء كلمات أو أحرف)، بناء المفردات (تعيين معرف صحيح لكل رمز فريد)، التجهيز (تحويل معرفات الرموز لتمثيلات عددية كثيفة — one-hot أو TF-IDF أو تضمينات كلمات)، تدريب النموذج (تصنيف أو تجميع أو توليد أو استرجاع)، التقييم (الدقة، F1، BLEU، الحيرة حسب المهمة).
TF-IDF: المتجهي الكلاسيكي
تكرار المصطلح (TF): كم مرة تظهر الكلمة t في الوثيقة d؟ تكرار الوثيقة (DF): كم وثيقة تحتوي t؟ IDF العكسي: log(N/DFt) — الكلمات التي تظهر في كل وثيقة (الـ، من، في) تحصل على IDF قريب من الصفر. الكلمات الخاصة بوثائق قليلة تحصل على IDF مرتفع. TF-IDF = TF × IDF. النتيجة مصفوفة متفرقة بشكل (n_docs × حجم_المفردات) حيث تعكس كل خلية مدى خصوصية تلك الكلمة لتلك الوثيقة.
من حقيبة الكلمات إلى التضمينات الكلمية
يتعامل TF-IDF مع كل كلمة كمستقلة — 'بنك' و'مؤسسة مالية' غير مرتبطتان تماماً. تتعلم تضمينات الكلمات (Word2Vec، GloVe، FastText) تمثيلات متجهية كثيفة حيث الكلمات المتشابهة قريبة في الفضاء المتجهي: ملك - رجل + امرأة ≈ ملكة. تلتقط هذه المتجهات الـ300-بُعدية علاقات دلالية لا يستطيع TF-IDF التقاطها. تُنتج محولات الجمل الحديثة (SBERT، all-MiniLM-L6-v2) متجهات بطول ثابت لجمل كاملة تُتيح البحث الدلالي والتجميع والتصنيف الصفري.
لتصنيف النصوص في الإنتاج في 2025: ابدأ بـTF-IDF + LogisticRegression كخط أساس، ثم جرّب تضمينات sentence-transformers + مصنِّف، ثم اضبط BERT/DistilBERT مدرَّباً مسبقاً إذا كانت الجودة لا تزال غير كافية.
خط أنابيب تصنيف النصوص
التحويل لأحرف صغيرة، إزالة علامات الترقيم، إزالة كلمات التوقف اختيارياً
التجزئة: word_tokenize أو جزء كلمة (BPE/WordPiece للمحولات)
التجهيز: CountVectorizer ← TfidfVectorizer ← word2vec ← تضمينات BERT
النموذج: MultinomialNB (خط أساس سريع)، LogisticRegression (خطي قوي)، SVM، BERT المضبوط
التقييم: macro-F1 للفئات المتوازنة، weighted-F1 للغير متوازنة، AUC-ROC
تحليل الأخطاء: فحص العينات المُصنَّفة خطأً ← تحسين الميزات أو التسمية
خط أنابيب تصنيف NLP الكامل
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
ضبط TfidfVectorizer على مجموعة البيانات الكاملة يُسرِّب مفردات الاختبار للتدريب — قيم IDF تُحسب مع تكرارات وثائق الاختبار. دائماً اضبط داخل Pipeline مُطبَّق على بيانات التدريب فحسب. الثاني: استخدام max_features بلا min_df — الكلمات النادرة جداً صاخبة لكن مُدرَجة. عيِّن min_df=2 أو min_df=0.001. الثالث: تجاهل عدم توازن الفئات — فئة أغلبية بنسبة 95% تجعل الدقة عديمة الفائدة؛ استخدم macro-F1 وclass_weight='balanced'. الرابع: عدم التجذير/التأصيل للمجموعات الصغيرة — 'يركض'، 'ركض'، 'راكض' يجب أن تُعيَّن لنفس الميزة.
للنصوص غير الإنجليزية، استخدم مجزِّئات خاصة باللغة ونماذج متعددة اللغات مدرَّبة مسبقاً (mBERT، XLM-RoBERTa) بدلاً من خطوط الأنابيب المتمركزة حول الإنجليزية. كثير من مكتبات NLP تستخدم بصمت سلوك الإنجليزية افتراضياً.
?اختبار المعرفة
يتم حفظ التقدم في متصفحك — لا حاجة لحساب.