تحميل المتن النصي من CSV
افتح ملف slm-corpus.csv وحلِّله وتحقق من بنيته باستخدام وحدة csv في بايثون.
- فتح ملف CSV وتحليله باستخدام csv.reader و csv.DictReader
- فحص أسماء الأعمدة وعدد الصفوف وأنواع البيانات في مجموعة بيانات CSV
- استخراج النص الخام من صفوف المتن في سلسلة واحدة
- معالجة مزالق CSV الشائعة: الترميز ومحارف الأسطر الجديدة والقيم المفقودة
لماذا تبدأ بالبيانات؟
يبدأ كل مشروع تعلم آلي بالبيانات. وفي نموذج لغوي نصي، تكون تلك البيانات متنًا (corpus) ، مجموعة من النصوص سيتعلّم النموذج منها الأنماط. متننا موجود في slm-corpus.csv، وهو ملف CSV صغير يأتي مع الدورة في static/datasets/.
قبل أن تتمكن من الترميز أو العدّ أو التوليد من أي شيء، تحتاج إلى تحميل هذا الملف في بايثون. يغطي هذا الدرس طريقتين: csv.reader للوصول الخام و csv.DictReader للوصول المدرِك للترويسة.
المفاهيم الأساسية
فتح ملف CSV
تتولى وحدة csv في بايثون الأجزاء المعقدة من تحليل CSV (الحقول المقتبسة، والفواصل المدمجة، والمحارف المهرّبة). افتح دائمًا ملفات CSV في الوضع النصي ودع الوحدة تقوم بالعمل:
import csv
with open("slm-corpus.csv", newline="") as f:
reader = csv.reader(f)
header = next(reader) # first row = column names
print(header) # e.g. ['id', 'text']وسيطة newline="" مطلوبة بحسب توثيق وحدة csv ، وبدونها قد تظهر صفوف فارغة على Windows أو مخرجات بأسطر مزدوجة.
القراءة باستخدام DictReader
يربط csv.DictReader كل صف بقاموس باستخدام صف الترويسة كمفاتيح. وهذا يجعل كودك موثّقًا ذاتيًا:
import csv
with open("slm-corpus.csv", newline="") as f:
reader = csv.DictReader(f)
for row in reader:
print(row["text"]) # access by column name, not indexالاستدعاء الأول لـ next(reader) تلقائي ، يستهلك DictReader صف الترويسة بنفسه.
استخراج النص الكامل
لبناء نموذج لغوي، تحتاج إلى كل النصوص مجمّعة في سلسلة طويلة واحدة. إليك طريقة جمعها:
import csv
texts = []
with open("slm-corpus.csv", newline="") as f:
reader = csv.DictReader(f)
for row in reader:
texts.append(row["text"])
full_text = " ".join(texts)
print(f"Loaded {len(texts)} rows, {len(full_text)} characters")يربط أسلوب join() نصوص كل الصفوف بفاصل مسافة، منتجًا كتلة نصية متصلة واحدة.
التحقق من التحميل
افحص بياناتك دائمًا بعد التحميل. احسب عدد الصفوف، وألقِ نظرة على بضع عينات، وابحث عن مشكلات واضحة:
import csv
with open("slm-corpus.csv", newline="") as f:
reader = csv.DictReader(f)
rows = list(reader)
print(f"Total rows: {len(rows)}")
print(f"Columns: {rows[0].keys()}")
print(f"First row: {rows[0]}")
print(f"Last row: {rows[-1]}")إذا كان الملف كبيرًا، تجنب list(reader) ، فهو يحمّل كل شيء في الذاكرة. كرّر بدلًا من ذلك وعالِج صفًا بصف.
جرّب بنفسك
حمّل slm-corpus.csv واطبع:
- عدد الصفوف في الملف
- أسماء الأعمدة
- نص أول صف
استخدم هذا الهيكل:
import csv
with open("slm-corpus.csv", newline="") as f:
reader = csv.DictReader(f)
rows = list(reader)
print(f"Rows: {len(rows)}")
print(f"Columns: {list(rows[0].keys())}")
print(f"Sample: {rows[0]['text'][:200]}")الخلاصات الرئيسية
- افتح دائمًا ملفات CSV باستخدام
newline=""عند استخدام وحدةcsv - يمنحك
csv.DictReaderوصولًا بمفاتيح الترويسة؛ بينما يمنحكcsv.readerوصولًا بالمؤشرات - تحقق من تحميلك: افحص عدد الصفوف وأسماء الأعمدة وألقِ نظرة على بيانات عيّنة
- في الملفات الكبيرة، كرّر صفًا بصف بدلًا من التحويل إلى قائمة
تحدي الممارسة
اكتب دالة load_corpus(path) تأخذ مسار ملف CSV وتُرجع قائمة من السلاسل ، واحدة لكل عمود text في كل صف. تحقق من حالة عدم وجود الملف بطباعة رسالة خطأ وإرجاع قائمة فارغة.
def load_corpus(path):
import csv
try:
with open(path, newline="") as f:
reader = csv.DictReader(f)
return [row["text"] for row in reader]
except FileNotFoundError:
print(f"File not found: {path}")
return []1. لماذا يجب تمرير newline عند فتح ملف CSV بهدف استخدام وحدة csv؟
2. ما الذي تستخدمه csv.DictReader كمفاتيح للقاموس في كل صف؟
3. إذا كان reader = csv.DictReader(f)، فماذا تُرجع next(reader)؟