پردازش زبان طبیعیدست به کد

دست به کد: جمع‌آوری خودکار توئیت‌های فارسی با استفاده از GitLab CI

در ادامه مباحث جمع آوری و پردازش توئیت‌های فارسی، به عنوان یک منبع عالی برای پردازش متن، سنجش احساسات و بررسی میزان گرایش و توجه بخش تحصیل‌کرده و جوان جامعه (اکثریت قریب به اتفاق توئیت‌کنندگان) به یک موضوع خاص، در این مقاله، قصد داریم به ایجاد یک خط تولید ساده جمع‌آوری توئیت بپردازیم که روزانه و بدون پرداخت هیچ هزینه‌ای، به جمع آوری توئیت‌های فارسی (عمومی و یا در یک حوزه خاص) بپردازد. این کار را با امکانات گیت‌لب انجام می‌دهیم و کاری می‌کنیم که توئیت‌های جمع‌آوری شده به صورت روزانه در یک مخزن کد عمومی گیت‌هاب برای استفاده عموم ذخیره شود. این مقاله از چهار گام اصلی زیر تشکیل خواهد شد که در ادامه تک تک آنها را با هم انجام خواهیم داد :

  • ارسال خودکار توئیت‌ها به گیت‌هاب
  • خودکارسازی اجرای کد
  • دانلود توئیت‌های جمع‌آوری شده
  • ارسال خودکار توئیت‌ها به گیت‌هاب

پیش نیازها

قبل از شروع کار، مطمئن شوید که اکانت گیت‌لب دارید که البته با توجه به تحریم‌ جدید گیت‌هاب برای ایرانیان، مجدداً این سرویس رایگان و پیشرفته، مورد اقبال جامعه توسعه‌گران فارسی قرار گرفته است و احتمالاً حساب کاربری گیت‌لب خواهید داشت.

برای این پروژه، خیلی نیاز به آشنایی با گیت (یک سیستم مدیریت فایلها در پروژه‌های نرم‌افزاری) ندارید و می‌توانید از امکانات خود گیت‌لب برای آپلود فایلهای پروژه استفاده کنید. برای اینکه همراه با توضیحات، به صورت عملی کدها را مشاهده کرده و به دلخواه، تغییراتی در آنها انجام دهید، بهتر است مخزن کد پروژه را از این آدرس، Fork کنید تا کدها به حساب کاربری شما در گیت‌لب منتقل شود (گزینه Fork زمانی که وارد حساب کاربری خود شده باشید، فعال خواهد شد). با این کار می‌توانید برای ویرایش کدها (مثلاً جستجوی موضوعی خاص در توئیتر و جمع‌آوری توئیت‌های مرتبط با آن) با رفتن به زبانه Details از گزینه ‌ Web IDE ، به صورت آنلاین به تغییر و اجرای کدها بپردازید.(شکل زیر) خوبی ادیتور کد گیت‌لب این است که علاوه بر ویرایش فایلها، امکان آپلود فایلها و حذف آنها را هم برای شما فراهم می‌کند.

آخرین نکته‌ای که قبل از شروع کار،‌ باید خاطرنشان کنم این است که هدف این نوشتار، تنها آشنایی با نحوه اجرای خودکار کدها و ایجاد یک خط تولید داده ساده است بنابراین روی بخش جمع آوری توئيت‌ها با توجه به اینکه در دو مقاله قبلی، به تفصیل صحبت کرده‌ایم، توضیحی نخواهم داد و فرض بر این است که کدی که قرار است به صورت روزانه اجرا شود، از قبل موجود است. این کد درون پروژه فوق با نام get_tweets.py قرار دارد و در انتهای بخش اول این آموزش،‌ نحوه اجرای خودکار این فایل را فراخواهیم گرفت و مطمئناً شما این کار را با هر فایل دیگری می‌توانید انجام دهید.

مقدمه‌ای بر CI‌ یا تجمیع مداوم در مهندسی نرم‌افزار

در مهندسی نرم افزار مدرن برای تولید حرفه‌ای یک محصول نرم‌افزاری، به ازای هر بخش از نرم‌افزار حتماً یک تست و آزمایش هم باید نوشته شود. این تست که خود یک برنامه کوچک است، این امکان را به ما میدهد که بتوانیم به صورت خودکار، تمام نرم افزار را تست کنیم و به ازای هر قابلیت جدید، مطمئن شویم که کدهای قبلی بدون اشکال اجرا خواهند شد. این موضوع باعث ایجاد یک روند در تولید نرم‌افزارها شده است که به آن تجمیع مداوم یا Continuous Integration می‌گوئیم . به این ترتیب که به ازای هر قابلیت جدیدی که توسط یکی از اعضای تیم آماده و تحویل مدیر پروژه میشود، این قابلیت به صورت موقت به پروژه اصلی اضافه شده و تمامی تستها، به صورت اتومات اجرا می‌شوند. اگر همه تستها پاس شدندو خطایی تولید نشد، این قابلیت در لیست انتشار قرار می‌گیرد و یا می تواند به صورت خودکار، منتشر شده و در اختیار عموم قرار گیرد ( Continuous Deployment ).

امکان اجرای خودکار تستها که خود کدهای نرم‌افزاری هستند را گیت‌لب برای ما به رایگان فراهم کرده است و ما هم قصد داریم از همین امکان برای مقاصد خود که جمع‌آوری داده است، (سوء) استفاده کنیم!. با ما همراه باشید.

گام اول: ایجاد یک خط تولید

کدهایی که گیت‌لب برای ما اجرا می‌کند، در یک ماشین مجازی مجزا و ایزوله اجرا شده و بعد از پایان برنامه هم این ماشین مجازی پاک شده و تنها فایلهای لاگ آن (مثلا پرینت‌هایی که انجام داده‌ایم به همراه خروجی‌های خود ماشین مجازی ) را می‌توانیم مشاهده کنیم و بفهمیم آیا همه چیز به خوبی انجام شده است یا نه. اگر این کدها، تستهای پروژه باشند و خطایی پیش آمده باشد، جزییات آن به ما ایمیل خواهد شد.

اما این به تنهایی کافی نیست و ما می‌خواهیم علاوه بر ذخیره توئیت‌ها در این ماشین مجازی که با اتمام کار آن، از بین خواهد رفت، بعداً بتوانیم به آنها دسترسی داشته باشیم. اینجاست که مفهومی با نام Artifact  در گیت‌لب معرفی شده است و منظور از آن، فایلهایی است که باید بعد از اجرای کدها، از ماشین مجازی استخراج و در اختیار کاربر قرار گیرد. بنابراین بهتر است خروجی مورد نظر خود را در یک پوشه مشخص قراردهید و همین پوشه را به گیت‌لب برای تولید خروجی اعلام نمایید. در این پروژه، ما توئیت‌ها را در فایلی با نام data.txt و در پوشه tweets ذخیره می‌کنیم.

فرض کنید کدهای استخراج توئیت ما درون یک فایل با نام get_tweets.py قرار گرفته است که دقیقاً همان‌کدهای مقالات قبلی است که تعداد توئیت‌های آن به ده هزار عدد، محدود شده است و قصد داریم این کد را هر یک ساعت یک بار اجرا کنیم و بدین ترتیب خواهیم توانست روزانه حدود ۱۲۰ هزار توئیت را جمع‌آوری کنیم.

در مرحله بعد، کتابخانه‌هایی که برای اجرای این کدها به آنها نیاز داریم در فایل requirements.txt وارد می‌کنیم : نام هر کتابخانه دریک خط

علاوه بر این، فایل .gitlab-ci.yml که حاوی تنظیمات اجرای خودکار کدها بعد از هر کامیت است را هم به صورت زیر به پروژه اضافه میکنیم . منظور از کامیت هم، هر نسخه جدیدی از پروژه است که با هر دستور git push به گیت‌لب ارسال می‌شود و یا هر تغییری که با استفاده از Web IDE به صورت آنلاین روی کدها صورت می‌دهیم.

Shell

اگر با داکر آشنا باشید، کدهای فوق برایتان گویا خواهد بود اما به طور خلاصه، در خط اول اعلام می‌کنیم که برای ایجاد یک خط تولید (اجرای مرحله به مرحله و خودکار یک فرآیند از برنامه‌ها را خط تولید می‌گوییم.) به ایمیج پایه پایتون نیاز داریم. ایمیج پایه پایتون هم یک لینوکس سبک وزن است که بر روی آن، پایتون نصب شده است و آماده اجرای برنامه‌های پایتون است.

در خط دوم و سوم، نام مراحل این خط تولید را اعلام می کنیم که در مثال ما یک مرحله بیشتر نداریم و نام آن را هم gettweets گذاشته‌ایم . در قسمت بعد،‌متغیر محیطی PIP _CACHE_DIR را مقداردهی می‌کنیم که برای نصب کتابخانه‌های مورد استفاده در پروژه نیاز خواهد بود و در ادامه، کدهایی که قبل از اجرای برنامه پایتون ما باید روی این سرور مجازی اجرا شوند را در بخش before_script مشخص می‌کنیم . دستور اول نسخه پایتون را چاپ می کند (برای مقاصد خطایابی) و دستور دوم هم کتابخانه‌های پایتون پروژه که در فایل requirements.txt قرار گرفته است را نصب می‌کند.

خط یازدهم، شروع توضیحات هر مرحله از خط تولید است که می‌توانیم با دادن هر نام دلخواهی شروع به ذکر جزییات هر مرحله نماییم. دقت کنید که در این بخش، جلوی متغیر stage  نام مرحله اولی که در بالا به آن اشاره کرده‌اید را حتما بنویسید. نهایتاً در قسمت script کد پایتونی که باید اجرا شود را مشخص می‌کنیم و در بخش artifacts هم مسیر خروجی‌های پروژه و پسوند یا نام آنها را مشخص می‌کنیم .

اکنون همه چیز آماده اجرای خودکار کدهای مورد نظر ماست. اگر این پروژه را کامیت کنید و یا تغییراتی که آنلاین روی کدها داده‌اید را ذخیره کنید، خط تولید شما به صورت خودکار شروع به اجرا خواهد کرد. کافی است به قسمت CI / CD بروید و از قسمت Pipelines بررسی کنید که خط تولید شما در حال اجراست یا نه .

اگر همه چیز اکی باشد،‌ مشابه با شکل فوق، باید عبارت passed را کنار شناسه خط تولید خود ببینید و اگر هم عبارت failed را مشاهده کردید، کافی است بر روی شناسه خط تولید کلیک کنید تا به صفحه نمایش اطلاعات کارها یا jobs آن خط تولید برود و از زبانه failed jobs ، خطای تولید شده را می‌توانید مشاهده کنید. در این حالت، تصویری مشابه زیر خواهید دید :

البته همیشه می‌توانید همزمان با اجرای خط تولید، این صفحه خروجی را هم مشاهده کنید و مثل شکل زیر چک کنید که توئیت‌ها به درستی دریافت می‌شوند یا نه .

حال اگر خط تولید ما با موفقیت تمام کارها را به اتمام رسانده باشد، می‌توانیم خروجی این خط تولید را که همان توئیت‌های ما هستند از دکمه منتهی الیه سمت راست توضیحات آن خط تولید،‌ دانلود کنیم. شکل زیر این امکان را نشان می‌دهد .

در این مرحله ذکر چند نکته هم خالی از لطف نیست :

  • هنگام امتحان عملی این کدها،‌متوجه شدم که ایجاد فایل‌های خروجی با خطا مواجه می‌شود. کاری که بنده انجام دادم این بود که این فایلها را در آدرس مطلوب، ایجاد کردم (یک فایل متن خالی) که مشکل حل شود. اگر شما هم با این خطا مواجه شدید می‌توانید از این روش موقتاً کار خود را راه بیندازید.
  • به صورت پیش‌فرض هر خط تولید باید حداکثر یک ساعت طول بکشید و در غیر اینصورت، کار در حال اجرا متوقف و خط تولید، در حالت شکست خورده ( Failed ) به اتمام می‌رسد. با سعی و خطایی که انجام دادم، تعداد ده هزار توئیت، برای نود درصد مواقع در زمانی خیلی کمتر از این عدد به اتمام می رسیدند و گاهی هم در یکساعت، به این تعداد نمی رسید و خط تولید، شکست می‌خورد. می‌توانید از منوی تنظیمات و زبانه CI / CD در بخش General pipelines زمان اجرا را بیشتر یا کمتر کنید. (من به شخصه زمان را روی دو ساعت تنظیم کردم) در هر صورت تنها تا ۲۰۰۰ ساعت در ماه، به صورت رایگان کدهای شما اجرا خواهد شد و حواستان به این موضوع هم باشد.

گام دوم: خودکارسازی اجرای کد

همانطور که در بالا اشاره شد، با ایجاد یک خط تولید پردازشی، با هر بار کامیت کردن کدها (تغییر و به روز رسانی مخزن کد)، این خط تولید به صورت خودکار اجرا می‌شود. اما ما قصد داریم این کار را به صورت زمان‌بندی شده و خودکار به ازای هر ساعت انجام دهیم. یعنی هر یک ساعت یک‌بار،‌ این خط تولید شروع به اجرا کرده، توئیت‌های ما را جمع آوری و ذخیره کند.

قالب زمان‌بندی خط تولید بر اساس Cron Jobs ‌لینوکس است که در آن، پنج کاراکتر به ترتیب زیر، زمان اجرا را در یک دقیقه خاص، ساعت یا روز مشخص از ماه، یک ماه خاص و یا یک روز هفته تعیین می کند. (مشاهده مثال‌های بیشتر در این آدرس)

برای تعیین زمان اجرای خط تولید از منوی سمت چپ، از بخش CI / CD زیر منوی کارهای زمان‌بندی شده یا Schedules را انتخاب کرده،‌ نوع زمان بندی را به صورت دستی و برابر * * * * ۰ قرار می‌دهیم یعنی سر دقیقه صفر هر ساعت (با شروع از زمان حال).

با ذخیره این زمان‌بند، از این به بعد هر یک ساعت یک‌بار کد شما اجرا شده و خروجی آن در قالب فایلهای تعیین شده، توسط شما قابل دانلود خواهد بود.

اما این که هر روز بخواهیم بیست و چهار خط تولید اجرا شده را بررسی و فایلهای تک تک را جداگانه دانلود و ذخیره کنیم، کمی غیر عملیاتی است. در گام بعد، با نوشتن یک کد ساده، این فایلها را با اجرای یک برنامه، دانلود و ذخیره خواهیم کرد. در گام آخر ، همین کار را هم به صورت خودکار انجام می‌دهیم و تمام توئیت‌های جمع‌آوری شده در یک روز را به صورت خودکار به گیت‌هاب منتقل ‌می‌کنیم.

گام سوم: دانلود توئیت‌های جمع‌آوری شده

در گام سوم، برای بهبود فرآیند جمع آوری توئیت‌ها به کمک امکانات خود گیت‌لب، به دانلود خروجی‌های هر خط تولید می‌پردازیم. برای اینکار نیاز به شناسه پروژه در گیت‌هاب و یک توکن دسترسی برای دانلود خروجی‌ها داریم. شناسه پروژه که در زیر نام مخزن کد در زبانه Details به صورت زیر قابل مشاهده است :

برای ایجاد یک توکن دسترسی که با داشتن آن، گیت‌لب اجازه دانلود خروجی‌ها را به ما خواهد داد، باید به قسمت تنظیمات گیت‌لب برویم و آنرا تولید کنیم. بر روی نام کاربری خود در گوشه بالای سمت راست صفحه کلیک کرده و گزینه تنظیمات را بزنید.

سپس از منوی سمت چپ، وارد بخش Access Tokens شوید :

در مرحله آخر هم با وارد کردن نام اکسس توکن و دادن اطلاعاتی مانند زمان منقضی شدن آن ، دکمه ایجاد توکن را بزنید تا پیامی مشابه زیر به شما نشان داده شود. اکسس توکن تولید شده را که در زیر پیام Your New Personal Access Token قرار گرفته است کپی کنید و برای خودتان آنرا ذخیره کنید چون به دلایل امنیتی این اکسس توکن مجدداً به شما نمایش داده نخواهد شد.

شناسه پروژه و اکسس توکن را مطابق زیر در کلاس CONFIG وارد می‌کنیم. سپس با استفاده از تابع get_finished_jobs شناسه تمام کارهایی که با موفقیت در خط تولید ما به اتمام رسیده‌اند را استخراج می‌کنیم (برای این پروژه آنرا روی کارهای پایان‌یافته در ۶ ساعت اخیر تنظیم کرده‌ایم). در انتها هم با استفاده از تابع download_artifact(job_id) به دانلود و ذخیره توئیت‌ها می‌پردازیم. کدهای این بخش درون فایل data_aggregator.py قرار گرفته است.

Python

گام چهارم : ارسال خودکار توئیت‌ها به گیت‌هاب

برای اینکه خط تولید ما کاملا خودکار شده و توئیت‌های روزانه را بتوانیم در یک مخزن کد مخصوص این کار ذخیره کنیم، می‌توانیم یک خط تولید دیگر در گیت‌لب راه‌اندازی کنیم که هر بیست و چهار ساعت اجرا شده، به شیوه فوق تمام خروجی‌ها را دانلود و در گیت‌هاب به عنوان یک نقطه تجمیع و دسترسی، برای ما ذخیره کند. البته برای این پروژه، با توجه به اینکه فایلهای بیش از ۲۵ مگابایت به صورت مستقیم در گیت‌هاب آپلود نمی‌شوند، با توجه به حجم توئیت‌های جمع‌آوری شده، هر شش ساعت یکبار این کار را انجام داده‌ام و به دلایل امنیتی، برای این کار از یک پروژه جدید در گیت‌لب استفاده کرده‌ام (چون مشخصات کاربری و رمز عبور گیت‌هاب و اکسس توکن بنده افشا میشد از یک پروژه خصوصی مجزا استفاده کردم اما شما اگر از همان ابتدا یک پروژه خصوصی ایجاد کنید نگران این مساله نباشید و خط تولید دومتان را هم در همین پروژه به سادگی ایجاد و مدیریت کنید)

می‌توانید از توابع API سرویس‌هایی مثل آمازون درایو، گوگل درایو، وان درایو ، دراپ باکس و مانند آن به جای گیت‌هاب برای ذخیره خودکار توئیت‌ها استفاده کنید. کد زیر در همان فایل data_aggregator.py عمل آپلود فایل زیپ تولید شده در مرحله قبل به گیت‌هاب را انجام می‌دهد :

Python
مخزن کدی برای جمع‌آوری توئیت‌های فارسی
خروجی این مرحله همانطور که در کد بالا مشخص است در این مخزن کد گیت‌هاب قرار گرفته است : github.com/smbanaie/TweetData که روزانه به صورت خودکار، حدود صد هزار توئیت فارسی شامل متن توئیت و مشخصات کاربر توئیت‌کننده، هشتگ‌ها و اطلاعات مفید دیگر به آن اضافه می‌شود.

سخن پایانی

ایده اصلی این نوشتار از این مقاله گرفته شده است که نویسنده در آن، روزانه به جمع آوری اخبار یک خبرگزاری خاص پرداخته است. شما هم می‌توانید با امکانات رایگان سایت گیت‌لب، به جمع‌آوری خودکار داده‌های مورد نیاز خود و ذخیره آنها بپردازید.

امتیاز کاربران: ۴٫۴۳ ( ۳ رای)

مجتبی بنائی

دانشجوی دکترای نرم‌افزار دانشگاه تهران (yun.ir/smbanaie)، مدرس دانشگاه و فعال در حوزه توسعه نرم‌افزار و مهندسی داده که تمرکز کاری خود را در چند سال اخیر بر روی مطالعه و تحقیق در حوزه کلان‌داده و زیرساخت‌های پردازش داده و تولید محتوای تخصصی و کاربردی به زبان فارسی و انتشار آنها در سایت مهندسی داده گذاشته است. مدیریت پروژه‌های نرم‌افزاری و طراحی سامانه‌های مقیاس‌پذیر اطلاعاتی از دیگر فعالیتهای صورت گرفته ایشان در چند سال گذشته است.

1 دیدگاه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

دکمه بازگشت به بالا