پیشنیاز و هدف یادگیری
این بخش، گام 7 از مسیر «پایتون از صفر» است. هدف این درس تبدیل متن به واژه و ساخت فراوانی با دیکشنری است. پیشنیاز: لیست در پایتون؛ طول، کمینه، بیشینه و میانگین. کتابخانهٔ خارجی لازم نیست؛ ماژولهای استاندارد همراه Python 3 هستند. اگر مفهوم قبلی برایتان ناآشناست، ابتدا مقالهٔ پیشنیاز را بخوانید و مثالش را اجرا کنید؛ حفظکردن کد جای فهم ورودی و خروجی را نمیگیرد.
مفهوم اصلی به زبان ساده
رشته در پایتون دنبالهای از نویسههای یونیکد است، پس متن فارسی هم مانند انگلیسی قابل پردازش است. split بدون آرگومان، متن را بر اساس فاصلههای سفید جدا میکند و فاصلههای تکراری، تب و خط جدید را درست مدیریت میکند. تعریف واژه در این پروژه ساده است: هر بخش جداشده با فاصله یک واژه است، نه یک تحلیل زبانی کامل.
مسئلهٔ این درس
در پروژهٔ «شمارندهٔ واژههای متن» باید یک تابع مستقل بنویسید. میزکار ورودی نمونه را در request.json قرار میدهد؛ تابع solve دیکشنری داده را میگیرد و نتیجهٔ خود را برمیگرداند. در این قرارداد input لازم نیست و خواندن تعاملی از ترمینال ممکن است اجرای ارزیابی را متوقف کند. از مثال زیر شروع کنید و پیش از اجرای آن، شکل نتیجه را حدس بزنید.
نمونهکد قابل اجرا
def solve(data):
words = data['text'].casefold().split()
counts = {}
for word in words:
counts[word] = counts.get(word, 0) + 1
return {'total': len(words), 'counts': counts}
print(solve({'text': 'Python python سلام'}))نتیجهٔ مورد انتظار
{
"total": 3,
"counts": {
"python": 2,
"سلام": 1
}
}توضیح مرحلهبهمرحله
ابتدا متن را با casefold برای مقایسهٔ بدون حساسیت به بزرگی حرف آماده میکنیم. سپس برای هر واژه شمارندهٔ دیکشنری را یکی افزایش میدهیم. get برای کلیدی که هنوز دیده نشده مقدار صفر میدهد. خروجی total تعداد کل واژهها و counts فراوانی هر واژه است. در نمونهٔ انگلیسی Python و python یک کلید مشترک میسازند.
قرارداد ورودی و خروجی
مثال فقط یک ورودی است، نه همهٔ مسئله. مقدارها را از data بخوانید و جواب نمونه را ثابت در برنامه ننویسید. نام کلیدها، نوع عدد و رشته و ترتیب فهرستها بخشی از قراردادند. در پروژه، بخش پایانی main.py نتیجهٔ تابع را در result.json ذخیره میکند؛ آن بخش را نگه دارید. موفقیت اجرای برنامه با درستبودن پاسخ و قبولی ارزیابی یکسان نیست.
خطای رایج و راه تشخیص
نشانهگذاری حذف نمیشود؛ در این قرارداد «سلام» و «سلام!» دو واژهٔ متفاوتاند. همچنین ی فارسی و ي عربی خودبهخود یکی نمیشوند. اگر عادیسازی لازم دارید باید آن را صریح تعریف کنید، نه اینکه بیخبر بخشی از داده را تغییر دهید.
تمرین مستقل و خودآزمایی
متنی با چند خط، فاصلهٔ تکراری و واژهٔ فارسی تکرارشونده بسازید. تفاوت split() و split(" ") را مشاهده کنید و ببینید کدامیک عضو خالی تولید میکند.
برای هر آزمایش، ورودی، خروجی مورد انتظار و خروجی واقعی را جدا بنویسید. اگر تفاوتی دیدید، یک نمونهٔ کوچکتر بسازید و تغییر را دوباره امتحان کنید. به جای اجرای چند تغییر همزمان، هر بار یک فرض را بررسی کنید. پس از فهم نمونه، پروژهٔ مرتبط را در میزکار حل کنید؛ ارزیابی با چند ورودی متفاوت انجام میشود و پاسخ ثابت نمونه پذیرفته نخواهد شد.
گام بعدی
موضوعهای این درس: str · split · casefold · dict. اگر میتوانید دلیل هر خط را توضیح دهید و ورودی تازهای را بدون دستکاری منطق اصلی حل کنید، به مقالهٔ بعدی بروید. هدف مسیر مقدماتی، تسلط بر همین رفتارهای کوچک و قابل آزمایش است؛ برای شروع پروژههای یادگیری ماشین عجله نکنید.
منابع و مطالعهٔ بیشتر
برای بررسی جزئیات و ادامهٔ مطالعه؛ متن این راهنما مستقلاً برای نوونتیکس نوشته شده است.
