TL;DR
- گیت هاب میزبان بیش از 300 زبان برنامهنویسی است - از زبانهای رایج مانند پایتون،.
- جاوا و جاوا اسکریپت گرفته تا زبانهای باطنی مانند Befunge که فقط برای جوامع بسیار کوچک شناخته.
- شده است.
چه اتفاقی افتاد
گیت هاب میزبان بیش از 300 زبان برنامهنویسی است - از زبانهای رایج مانند پایتون،. جاوا و جاوا اسکریپت گرفته تا زبانهای باطنی مانند Befunge که فقط برای جوامع بسیار کوچک شناخته.
شده است. شکل 1:.
10 زبان برنامهنویسی برتر میزبانی شده توسط GitHub بر اساس تعداد مخزن یکی از چالشهای ضروری. که گیت هاب با آن مواجه است این است که بتواند این زبانهای مختلف را بشناسد.
هنگامیکه برخی از کدها به یک مخزن فشار داده میشوند،. مهم است که نوع کدی را که به منظور جستجو،.
هشدار آسیبپذیری امنیتی و برجستهسازی نحو اضافه شده است شناسایی کنید - و توزیع محتوای مخزن را به. کاربران نشان دهید.
علیرغم ظاهر، تشخیص زبان یک کار پیش پا افتاده نیست. نام فایلها و پسوندها،.
در حالی که نشانه خوبی از زبان برنامهنویسی احتمالی است،. تصویر کامل را ارائه نمیدهند.
در واقع، بسیاری از پسوندها با یک زبان مرتبط هستند (بهعنوان مثال، «. pl»، «.
pm»، «. t»، «.
pod» همگی با Perl مرتبط هستند)،. در حالی که برخی دیگر مبهم هستند و تقریباً به جای یکدیگر در بین زبانها استفاده میشوند (بهعنوان.
مثال،. «.
h» معمولاً برای نشان دادن بسیاری از زبانهای خانواده «C»، از جمله C، C++، و Objective استفاده میشود). در موارد دیگر،.
فایلها هستند به سادگی بدون پسوند (مخصوصاً برای اسکریپتهای اجرایی) یا با پسوند نادرست (از عمد. یا تصادفی) ارائه شده است.
Linguist ابزاری است که در حال حاضر برای شناسایی زبانهای کدنویسی در GitHub استفاده میکنیم. Linguist یک برنامه مبتنی بر روبی است که از استراتژیهای مختلف برای تشخیص زبان،.
استفاده از قراردادهای نامگذاری و پسوند فایل و همچنین در نظر گرفتن مدلهای Vim یا Emacs و همچنین. محتوای بالای فایل (shebang) استفاده میکند.
Linguist ابهامزدایی زبان را از طریق اکتشافی انجام میدهد و در صورت عدم موفقیت،. از طریق یک طبقهبندی Naive Bayes که بر روی نمونه کوچکی از دادهها آموزش دیده است.
اگرچه Linguist پیشبینی زبان سطح فایل را به خوبی انجام میدهد (دقت ۸۴%)،. عملکرد آن بهطور قابلتوجهی کاهش مییابد زمانی که فایلها از قراردادهای نامگذاری غیرمنتظره استفاده میکنند و مهمتر از.
همه،. زمانی که پسوند فایل ارائه نمیشود.
این باعث میشود Linguist برای محتوایی مانند GitHub Gists یا تکههای کد در README،. مسائل و درخواستهای کششی.
به منظور قویتر و پایدارتر کردن تشخیص زبان در دراز مدت،. طبقهبندیکننده یادگیری ماشینی به نام OctoLingua را بر اساس معماری شبکه عصبی مصنوعی (ANN) توسعه دادیم که میتواند.
پیشبینیهای زبان را در سناریوهای دشوار مدیریت کند. نسخه فعلی این مدل قادر است برای 50 زبان برتر میزبانی شده توسط GitHub پیش بینی کند و.
در دقت و عملکرد از Linguist پیشی بگیرد. مهرهها و پیچها پشت OctoLingua OctoLingua از ابتدا با استفاده از Python،.
Keras با TensorFlow ساخته شده است - و به گونهای ساخته شده است که دقیق،. قوی و نگهداری آسان باشد.
در این بخش، ما منابع داده، معماری مدل و معیار عملکرد خود را برای OctoLingua شرح میدهیم. ما همچنین توضیح میدهیم که برای افزودن پشتیبانی برای یک زبان جدید چه چیزی لازم است.
منابع داده نسخه فعلی OctoLingua بر روی فایلهای بازیابی شده آموزش داده شده است از روزتا کد. و از مجموعهای از مخازن با کیفیت که به صورت داخلی جمعسپاری شدهاند.
ما مجموعه زبان خود را به 50 زبان برتر میزبانی شده در GitHub محدود کردیم. Rosetta Code یک مجموعه داده شروع عالی بود زیرا حاوی کد منبع برای همان کار بود که در.
زبانهای برنامهنویسی مختلف بیان میشد. بهعنوان مثال،.
وظیفه تولید یک دنباله فیبوناچی در C،. C++،.
CoffeeScript،. D،.
Java،. Julia و غیره بیان میشود.
با این حال،. پوشش بین زبانها یکسان نبود،.
جایی که برخی از زبانها فقط تعداد انگشت شماری فایل دارند و برخی فایلها بسیار کم جمعیت بودند. بنابراین افزودن مجموعه آموزشی ما با برخی منابع اضافی ضروری بود و پوشش و عملکرد زبان را بطور.
قابل ملاحظهای بهبود بخشید. روند ما برای افزودن یک زبان جدید اکنون کاملاً خودکار است.
ما به صورت برنامهنویسی کد منبع را از مخازن عمومیدر GitHub جمع آوری میکنیم. ما مخازنی را انتخاب میکنیم که حداقل شرایط لازم را داشته باشند معیارهایی مانند داشتن حداقل تعداد.
فورک،. پوشش زبان مقصد و پوشش پسوندهای فایل خاص.
برای این مرحله از جمعآوری دادهها، زبان اصلی مخزن را با استفاده از طبقهبندی Linguist تعیین میکنیم. ویژگیها:.
استفاده از دانش قبلی بهطور سنتی،. برای مشکلات طبقهبندی متن با شبکههای عصبی،.
معماریهای مبتنی بر حافظه مانند شبکههای عصبی بازگشتی (RNN) و شبکههای حافظه کوتاهمدت بلند مدت (LSTM) اغلب استفاده. میشوند.
با این حال،. با توجه به اینکه زبانهای برنامهنویسی تفاوتهایی در واژگان،.
سبک اظهار نظر،. پسوند فایل،.
ساختار،. سبک واردات کتابخانهها و سایر تفاوتهای جزئی دارند،.
ما رویکرد سادهتری را انتخاب کردیم که با استخراج برخی از ویژگیهای مرتبط به شکل جدولی،. از همه این اطلاعات استفاده میکند تا به طبقهبندیکننده ما داده شود.
ویژگیهای استخراج شده در حال حاضر به شرح زیر است:. پنج کاراکتر ویژه برتر در هر فایل 20 توکن برتر در هر فایل پسوند فایل وجود کاراکترهای خاص.
خاص که معمولاً در فایلهای کد منبع استفاده میشوند مانند دونقطه،. بریسهای فرفری و نیمویرگول مدل شبکه عصبی مصنوعی (ANN).
ما از ویژگیهای فوق بهعنوان ورودی برای یک شبکه عصبی مصنوعی دو لایه استفاده میکنیم که. با استفاده از Keras با باطن Tensorflow ساخته شده است.
نمودار زیر نشان میدهد که مرحله استخراج ویژگی یک ورودی جدولی n بعدی برای طبقه بندی کننده. ما ایجاد میکند.
همانطور که اطلاعات در امتداد لایههای شبکه ما حرکت میکنند،. با انصراف منظم میشوند و در نهایت یک خروجی ۵۱ بعدی تولید میکنند که نشاندهنده احتمال پیشبینیشده نوشته.
شدن کد دادهشده در هر یک از ۵۰ زبان برتر GitHub به اضافه احتمال اینکه در هیچیک از. آنها نوشته نشده باشد را نشان میدهد.
شکل 2:. ساختار ANN مدل اولیه ما (50 زبان + 1 برای "دیگر") ما 90 ٪ از مجموعه داده خود.
را برای آموزش در حدود هشت دوره استفاده کردیم. علاوه بر این،.
درصدی از پسوندهای فایل را از دادههای آموزشی خود در مرحله آموزش حذف کردیم تا مدل را تشویق. کنیم از واژگان فایلها یاد بگیرد و در ویژگی پسوند فایل بیش از حد قرار نگیرد،.
که بسیار پیشبینیکننده است. معیار عملکرد OctoLingua در مقابل Linguist در شکل 3،.
امتیاز F1 (میانگین هارمونیک بین دقت و یادآوری) OctoLingua و Linguist را نشان میدهیم که بر روی یک. مجموعه آزمایشی محاسبه شده است (10 ٪ از منبع داده اولیه ما).
در اینجا ما سه تست را نشان میدهیم. اولین تست با مجموعه تست دست نخورده است.
تست دوم از همان مجموعه فایلهای آزمایشی با حذف اطلاعات پسوند فایل استفاده میکند و تست سوم نیز. از همان مجموعه فایلها استفاده میکند اما این بار با پسوندهای فایل درهم بهگونهای که باعث سردرگمیشود.
طبقه بندی کنندهها (بهعنوان مثال، یک فایل جاوا ممکن است پسوند ". txt" و یک فایل Python ممکن است دارای پسوند ".
java" باشد). شهود پشت درهمآمیزی یا حذف پسوندهای فایل در مجموعه آزمایشی ما،.
ارزیابی استحکام OctoLingua در طبقهبندی فایلها در زمانی که یک ویژگی کلیدی حذف میشود یا گمراهکننده است،. است.
طبقهبندیکنندهای که به شدت به پسوند متکی نیست برای طبقهبندی کلیات و قطعهها بسیار مفید خواهد بود،. زیرا در این موارد معمولاً افراد اطلاعات پسوند دقیقی ارائه نمیدهند (بهعنوان مثال،.
بسیاری از gistهای مرتبط با کد دارای پسوند txt. هستند).
جدول زیر نشان میدهد که چگونه OctoLingua عملکرد خوبی را در شرایط مختلف حفظ میکند،. و نشان میدهد که مدل عمدتاً از واژگان کد یاد میگیرد،.
نه از اطلاعات متا (یعنی پسوند فایل)،. در حالی که Linguist به محض تغییر اطلاعات پسوند فایل،.
شکست میخورد. شکل 3:.
عملکرد OctoLingua در مقابل Linguist در یک مجموعه آزمایشی تاثیر حذف پسوند فایل در زمان آموزش همانطور که. قبلا ذکر شد،.
در طول زمان آموزش،. درصدی از پسوندهای فایل را از دادههای آموزشی خود حذف کردیم تا مدل را تشویق کنیم تا.
از واژگان فایلها یاد بگیرد. جدول زیر عملکرد مدل ما را با بخشهای مختلف پسوند فایل حذف شده در طول زمان آموزش.
نشان میدهد. شکل 4:.
عملکرد OctoLingua با درصد متفاوتی از پسوندهای فایل حذف شده در سه نسخه آزمایشی ما توجه داشته باشید. که بدون حذف پسوند فایل در طول زمان آموزش،.
عملکرد OctoLingua در فایلهای آزمایشی بدون پسوند و پسوند تصادفی بهطور قابل توجهی نسبت به دادههای. آزمون معمولی کاهش مییابد.
از سوی دیگر،. زمانی که مدل بر روی مجموعه دادهای آموزش داده میشود که در آن برخی پسوندهای فایل حذف میشوند،.
عملکرد مدل در مجموعه آزمایشی اصلاحشده کاهش زیادی پیدا نمیکند. این تأیید میکند که حذف پسوند فایل از کسری از فایلها در زمان آموزش،.
طبقه بندی کننده ما را وادار میکند تا از واژگان بیشتر بیاموزد. همچنین نشان میدهد که ویژگی پسوند فایل،.
در حالی که بسیار پیش بینی کننده است،. تمایل به تسلط داشت و از اختصاص وزنهای بیشتر به ویژگیهای محتوا جلوگیری میکرد.
پشتیبانی از یک زبان جدید افزودن یک زبان جدید در OctoLingua نسبتاً مناسب است سرراست با به دست. آوردن تعداد زیادی فایل به زبان جدید شروع میشود (ما میتوانیم این کار را به صورت.
برنامهنویسی همانطور که در منابع داده توضیح داده شده انجام دهیم). این فایلها به یک مجموعه آموزشی و آزمایشی تقسیم میشوند و سپس از طریق پیش پردازنده.
و استخراج کننده ویژگی ما اجرا میشوند. این قطار و مجموعه آزمایشی جدید به مجموعه دادههای آموزشی و آزمایشی موجود ما اضافه شده است.
مجموعه آزمایشی جدید به ما اجازه میدهد تا تأیید کنیم که دقت مدل ما قابل قبول است. شکل 5:.
افزودن زبان جدید با OctoLingua برنامههای ما در حال حاضر،. OctoLingua در "مرحله نمونه سازی پیشرفته" است.
موتور طبقه بندی زبان ما در حال حاضر قوی و قابل اعتماد است،. اما هنوز از همه زبانهای برنامهنویسی در پلت فرم ما پشتیبانی نمیکند.
جدای از گسترش پشتیبانی زبان - که نسبتاً ساده است - هدف ما فعال کردن تشخیص زبان در. سطوح مختلف جزئیات است.
پیادهسازی فعلی ما در حال حاضر به ما اجازه میدهد،. با یک تغییر کوچک در موتور یادگیری ماشین خود،.
قطعه کد را طبقه بندی کنیم. بردن مدل به مرحلهای که بتواند زبانهای تعبیه شده را بهطور قابل اعتماد شناسایی و طبقه.
بندی کند،. چندان دور از ذهن نیست.
ما همچنین در حال بررسی امکان منبعباز کردن مدل خود هستیم و در صورت تمایل دوست داریم از. جامعه بشنویم.
خلاصه با OctoLingua،. هدف ما ارائه خدماتی است که زبان کد منبع قوی و قابل اعتماد را فعال میکند.
تشخیص در سطوح مختلف جزئیات،. از سطح فایل یا سطح قطعه گرفته تا تشخیص و طبقه بندی زبان بالقوه در سطح خط.
در نهایت،. این سرویس میتواند از جمله قابلیت جستجوی کد،.
اشتراکگذاری کد،. برجستهسازی زبان و ارائه تفاوتها را پشتیبانی کند - همه اینها با هدف پشتیبانی از توسعهدهندگان در کارهای.
توسعه روزانهشان علاوه بر کمک به آنها در نوشتن کد با کیفیت است. اگر علاقه مند به بهره برداری یا مشارکت در کار ما هستید، لطفاً با توییتر @github تماس بگیرید!
نویسندگان Kavita Ganesan،. @kavgan،.
مهندس یادگیری ماشین رومانو فوتی،. @romanofoti،.
مهندس ارشد یادگیری ماشین نوشته شده توسط از GitHub بیشتر کاوش کنید اسناد همه چیزهایی که برای تسلط. بر GitHub نیاز دارید،.
همه در یک مکان. به Docs بروید GitHub در GitHub آنچه در آینده است بسازید،.
مکانی برای هر کسی از هر کجا که بتواند هر چیزی بسازد. شروع به ساختن کنید داستانهای مشتری با شرکتها و تیمهای مهندسی که با GitHub می.
سازند آشنا شوید. بیشتر بدانید پادکست GitHub پادکست GitHub را دنبال کنید،.
نمایشی که به،. روندها،.
داستانها و فرهنگ در داخل و اطراف جامعه توسعه دهندگان منبعباز در GitHub اختصاص دارد. حالا گوش کن.
چرا مهم است
اهمیت این خبر در این است که روی استفاده واقعی از AI و تصمیمگیری سازمانی اثر میگذارد.
منبع
لینک منبع اصلی در کارت و صفحه مقاله نمایش داده میشود.
