GitHub में 300 से अधिक प्रोग्रामिंग भाषाएं हैं, जो कि पायथन, जावा और जावास्क्रिप्ट जैसी जाने-माने भाषाओं से लेकर गूढ़ भाषाओं जैसे गूढ़ भाषाओं
तक हैं , जिन्हें केवल छोटे समूहों के लोग जानते हैं।
शीर्ष 10 GitHub ने रिपॉजिटरी की संख्या द्वारा प्रोग्रामिंग भाषाओं की मेजबानी कीGitHub के सामने आने वाली समस्याओं में से एक विभिन्न प्रोग्रामिंग भाषाओं की मान्यता है। जब कुछ कोड रिपॉजिटरी में रखा जाता है, तो उसके प्रकार की मान्यता बहुत महत्वपूर्ण है। यह खोज, भेद्यता अलर्ट, सिंटैक्स हाइलाइटिंग के साथ-साथ उपयोगकर्ताओं को रिपॉजिटरी सामग्री के संरचनात्मक प्रतिनिधित्व के लिए आवश्यक है।
पहली नज़र में, भाषा की पहचान एक सरल कार्य है, लेकिन ऐसा नहीं है।
भाषाविद वह उपकरण है जिसका उपयोग हम वर्तमान में GitHub पर एक प्रोग्रामिंग भाषा को परिभाषित करने के लिए कर रहे हैं। भाषाविद् एक रूबी अनुप्रयोग है जो विभिन्न भाषा मान्यता रणनीतियों का उपयोग करता है, जिसमें नाम की जानकारी और फ़ाइल एक्सटेंशन शामिल हैं। इसके अलावा, यह Vim या Emacs मॉडल, साथ ही फ़ाइल के शीर्ष पर सामग्री (शेलबैंग) को भी ध्यान में रखता है। भाषाविद भाषाई अस्पष्टता को स्वाभाविक रूप से संसाधित करता है और, यदि यह काम नहीं करता है, तो डेटा के एक छोटे नमूने पर प्रशिक्षित एक भोले बेसेसियन क्लासिफायर का उपयोग करता है।
हालांकि भाषाविद् फ़ाइल स्तर (84% सटीकता) पर काफी अच्छी तरह से भविष्यवाणी करता है, जब फ़ाइलों का नाम अजीब रूप से लिया जाता है, तो सब कुछ टूट जाता है और तब भी जब फ़ाइलों का कोई विस्तार नहीं होता है। यह भाषाविद् जैसे GitHub Gists या README में कोड स्निपेट, त्रुटियों और पुल अनुरोधों के लिए बेकार कर देता है।
लंबे समय में भाषा की परिभाषा को स्पष्ट करने के लिए, हमने ऑक्टो लिलिंगुआ नामक एक मशीन लर्निंग क्लासिफायर विकसित किया है। यह आर्टिफिशियल न्यूरल नेटवर्क (ANN) आर्किटेक्चर पर आधारित है, जो गैर-तुच्छ परिदृश्यों में भाषा की भविष्यवाणी को संभाल सकता है। मॉडल का वर्तमान संस्करण GitHub पर शीर्ष 50 प्रोग्रामिंग भाषाओं के लिए भविष्यवाणियां कर सकता है और सटीकता में भाषाविद को पार कर सकता है।
OctoLingua के बारे में अधिक जानकारी
ऑक्टोइंग्लिंग को पायथन में स्क्रैच से लिखा गया था, केरस को टेंसोरफ्लो बैकएंड के साथ - यह सटीक, विश्वसनीय और बनाए रखने के लिए आसान बनाया गया था। इस भाग में, हम अपने डेटा स्रोतों, मॉडल वास्तुकला और ऑक्टो लिंगुआ प्रदर्शन परीक्षणों के बारे में बात करेंगे। हम एक नई भाषा को पहचानने की क्षमता को जोड़ने की प्रक्रिया के बारे में भी बात करेंगे।
डेटा स्रोत
OctoLingua के वर्तमान संस्करण को
रोसेटा कोड से प्राप्त फ़ाइलों और आंतरिक क्राउडसोर्स रिपॉजिटरी के सेट से प्रशिक्षित किया गया है। हमने GitHub पर अपनी भाषाओं के सेट को 50 सबसे लोकप्रिय तक सीमित कर दिया है।
रोसेटा कोड एक उत्कृष्ट प्रारंभिक डेटासेट था क्योंकि इसमें समान कार्य करने के लिए लिखा गया स्रोत कोड था, लेकिन विभिन्न प्रोग्रामिंग भाषाओं में। उदाहरण के लिए,
फाइबोनैचि संख्या उत्पन्न करने के लिए कोड C, C ++, CoffeeScript, D, Java, Julia और अन्य में प्रस्तुत किया गया था। हालांकि, भाषाओं की कवरेज विषम थी: कुछ प्रोग्रामिंग भाषाओं के लिए, कोड के साथ कुछ ही फाइलें थीं, दूसरों के लिए, फाइलें केवल बहुत कम कोड होती थीं। इसलिए, कुछ अतिरिक्त स्रोतों के साथ हमारे प्रशिक्षण डेटासेट को पूरक करना आवश्यक था और इस तरह भाषाओं की कवरेज और अंतिम मॉडल की प्रभावशीलता में काफी सुधार हुआ।
नई भाषा जोड़ने की हमारी प्रक्रिया पूरी तरह से स्वचालित नहीं है। हम प्रोग्रामेटिक रूप से GitHub पर सार्वजनिक रिपॉजिटरी से स्रोत कोड संकलित करते हैं। हम केवल उन रिपॉजिटरी का चयन करते हैं जो न्यूनतम योग्यता मानदंडों को पूरा करते हैं, जैसे कि लक्ष्य भाषा को कवर करने और विशिष्ट फ़ाइल एक्सटेंशन को कवर करने वाले कांटे की न्यूनतम संख्या। डेटा संग्रह के इस चरण में, हम भाषाविद् से वर्गीकरण का उपयोग करके भंडार की मुख्य भाषा को परिभाषित करते हैं।
लक्षण: पिछले ज्ञान पर आधारित
परंपरागत रूप से, मेमोरी-आधारित आर्किटेक्चर जैसे कि पुनरावर्ती तंत्रिका नेटवर्क (RNN) और दीर्घकालिक अल्पकालिक मेमोरी नेटवर्क (LSTM) का उपयोग तंत्रिका नेटवर्क का उपयोग करके पाठ वर्गीकरण समस्याओं को हल करने के लिए किया जाता है। हालाँकि, शब्दावली में प्रोग्रामिंग भाषाओं में अंतर, फ़ाइल एक्सटेंशन, संरचना, पुस्तकालयों के आयात की शैली और अन्य विवरणों ने हमें एक अलग दृष्टिकोण के साथ आने के लिए मजबूर किया जो इस सभी जानकारी का उपयोग करता है, हमारे क्लासिफायरियर के प्रशिक्षण के लिए सारणीबद्ध रूप में कुछ संकेत निकालता है। विशेषताएँ इस प्रकार प्राप्त की जाती हैं:
- एक फ़ाइल में शीर्ष 5 विशेष वर्ण
- किसी फ़ाइल में शीर्ष 20 वर्ण
- फ़ाइल एक्सटेंशन
- विशिष्ट विशेष वर्णों की उपस्थिति जो फ़ाइलों के स्रोत कोड में उपयोग की जाती हैं, जैसे कि बृहदान्त्र, घुंघराले ब्रेसिज़, अर्धविराम
मॉडल कृत्रिम तंत्रिका नेटवर्क (ANN)
हम उपरोक्त कारकों का उपयोग टेन्सरफ्लो बैकएंड के साथ केर के उपयोग से निर्मित दो-परत तंत्रिका नेटवर्क के लिए इनपुट के रूप में करते हैं।
नीचे दिए गए आरेख से पता चलता है कि सुविधा निष्कर्षण कदम हमारे वर्गीकरण के लिए एक n- आयामी तालिका प्रविष्टि बनाता है। जैसे-जैसे सूचना हमारे नेटवर्क की परतों से गुजरती है, इसे बाहर छोड़ने का आदेश दिया जाता है, और परिणाम 51-आयामी आउटपुट होता है, जो इस संभावना का प्रतिनिधित्व करता है कि यह कोड GitHub पर शीर्ष 50 भाषाओं में से प्रत्येक में लिखा गया है। यह इस संभावना को भी दर्शाता है कि कोड किसी भी 50 भाषाओं में नहीं लिखा गया है।
स्रोत मॉडल की ANN संरचना ("अन्य" के लिए 50 भाषाएँ + 1)हमने अपने स्रोत डेटाबेस का 90% प्रशिक्षण के लिए उपयोग किया। साथ ही, मॉडल के प्रशिक्षण चरण में, फ़ाइल एक्सटेंशन का हिस्सा हटा दिया गया था ताकि मॉडल फ़ाइलों की शब्दावली से बिल्कुल सीख सके, न कि उनके एक्सटेंशन से, जो प्रोग्रामिंग भाषा की इतनी अच्छी भविष्यवाणी करते हैं।
प्रदर्शन परीक्षण
ऑक्टोइंगुआ बनाम भाषाविद
नीचे दी गई तालिका में, हम एक ही परीक्षण सेट (हमारे मूल डेटा स्रोत के आयतन का 10%) पर गणना किए गए ऑक्टो लिलिंग और लिंग्विस्ट के लिए
F1 स्कोर (सटीकता और पूर्णता के बीच हार्मोनिक मतलब) दिखाते हैं।
तीन परीक्षण यहां दिखाए गए हैं। पहले परीक्षण में, डेटा सेट को बिल्कुल भी नहीं छुआ गया था; दूसरे में, फ़ाइल एक्सटेंशन हटा दिए गए थे; तीसरे में, क्लासिफायर को भ्रमित करने के लिए फ़ाइल एक्सटेंशन को मिलाया गया था (उदाहरण के लिए, एक जावा फ़ाइल में एक्सटेंशन ".txt" हो सकता है, और एक पायथन फ़ाइल में एक्सटेंशन ".Java" हो सकता है।
हमारे परीक्षण सूट में फ़ाइल एक्सटेंशन को फेरबदल करने या हटाने के पीछे का अंतर्ज्ञान यह है कि कुंजी टैग हटाए जाने या भ्रामक होने पर फ़ाइलों को वर्गीकृत करने में ऑक्टोइलिंगुआ की विश्वसनीयता का मूल्यांकन करें। एक क्लासिफायर, जो एक्सटेंशन पर बहुत निर्भर नहीं है, लॉग और कोड स्निपेट को वर्गीकृत करने के लिए बेहद उपयोगी होगा, क्योंकि इन मामलों में लोग आमतौर पर एक्सटेंशन के बारे में सटीक जानकारी नहीं देते हैं (उदाहरण के लिए, कई कोड-संबंधित लॉग में txt एक्सटेंशन होता है।)
नीचे दी गई तालिका से पता चलता है कि विभिन्न स्थितियों के तहत ऑक्टो लिंगुआ का प्रदर्शन कैसा है, जब हमने यह मान लिया था कि मॉडल मुख्य रूप से कोड की शब्दावली से सीखता है, और मेटा-जानकारी से नहीं (उदाहरण के लिए, फ़ाइल एक्सटेंशन)। उसी समय, भाषाविद् भाषा को गलत तरीके से निर्धारित करता है, जैसे ही सही फ़ाइल एक्सटेंशन के बारे में जानकारी गायब थी।
एक ही परीक्षण सूट पर ऑक्टोइंगुआ बनाम भाषाविद का प्रदर्शनकिसी मॉडल को प्रशिक्षित करते समय फ़ाइल एक्सटेंशन को हटाने का प्रभाव
जैसा कि पहले उल्लेख किया गया है, प्रशिक्षण के दौरान, हमने मॉडल से फाइलों की शब्दावली से सीख लेने के लिए डेटा से कुछ प्रतिशत फ़ाइल एक्सटेंशन को हटा दिया। नीचे दी गई तालिका प्रशिक्षण के दौरान हटाए गए फ़ाइल एक्सटेंशन के विभिन्न अनुपातों के साथ हमारे मॉडल के प्रदर्शन को दिखाती है।
हटाए गए फ़ाइल एक्सटेंशन के विभिन्न प्रतिशत के साथ ऑक्टोइंगुआ प्रदर्शनकृपया ध्यान दें कि एक्सटेंशन के साथ फ़ाइलों पर प्रशिक्षित एक मॉडल बिना एक्सटेंशन के या नियमित रूप से परीक्षण डेटा की तुलना में मिश्रित एक्सटेंशन के साथ परीक्षण फ़ाइलों पर काफी कम प्रभावी है। दूसरी ओर, जब एक मॉडल को डेटा सेट पर प्रशिक्षित किया जाता है जिसमें फ़ाइल एक्सटेंशन का हिस्सा हटा दिया जाता है, तो संशोधित परीक्षण सेट पर मॉडल का प्रदर्शन बहुत कम नहीं होता है। यह पुष्टि करता है कि प्रशिक्षण के दौरान फाइलों के हिस्से से एक्सटेंशन हटाने से हमारे क्लासिफायरियर को कोड शब्दावली से अधिक सीखने का संकेत मिलता है। यह भी दिखाता है कि फ़ाइल एक्सटेंशन को हावी होने दिया और विशेष रुप से प्रदर्शित सामग्री से वेटिंग को रोका।
नई भाषा का समर्थन
OctoLingua में एक नई भाषा जोड़ना एक काफी सरल प्रक्रिया है। यह एक नई भाषा में बड़ी संख्या में फ़ाइलों को खोजना और प्राप्त करना शुरू करता है (हम इसे प्रोग्रामिक रूप से कर सकते हैं, जैसा कि अनुभाग "डेटा स्रोत" में वर्णित है)। इन फ़ाइलों को प्रशिक्षण और परीक्षण सूट में विभाजित किया गया है, और फिर हमारे प्रीप्रोसेसर और फ़ीचर एक्सट्रैक्टर से गुजरते हैं। मौजूदा पूल में एक नया डेटासेट जोड़ा गया है। परीक्षण किट हमें यह सुनिश्चित करने की अनुमति देती है कि हमारे मॉडल की सटीकता स्वीकार्य रहे।
OctoLingua में एक नई भाषा जोड़नाहमारी योजनाएँ
OctoLingua वर्तमान में "उन्नत प्रोटोटाइप चरण" पर है। हमारा भाषा वर्गीकरण तंत्र पहले से ही विश्वसनीय है, लेकिन अभी तक GitHub पर उपलब्ध सभी प्रोग्रामिंग भाषाओं का समर्थन नहीं करता है। भाषा समर्थन का विस्तार करने के अलावा, जो इतना मुश्किल नहीं है, हम कोड विस्तार के विभिन्न स्तरों के साथ भाषा का पता लगाने का प्रयास करते हैं। हमारे वर्तमान कार्यान्वयन पहले से ही हमें अनुमति देता है, कोड अंशों को वर्गीकृत करने के लिए हमारे मशीन लर्निंग तंत्र के एक मामूली संशोधन के साथ। इसके अलावा, मॉडल को उस स्तर पर लाना मुश्किल नहीं है, जिस पर वह विश्वसनीय भाषाओं का पता लगा सकता है और उन्हें वर्गीकृत कर सकता है।
हम अपने मॉडल के लिए स्रोत कोड प्रकाशित करने पर भी विचार कर रहे हैं, लेकिन हमें समुदाय से अनुरोध की आवश्यकता है।
निष्कर्ष
OctoLingua को विकसित करने में हमारा लक्ष्य एक ऐसी सेवा तैयार करना है जो विभिन्न स्तरों पर विस्तार से स्रोत कोड द्वारा भाषा की विश्वसनीय परिभाषा प्रदान करती है: लाइन के स्तर पर भाषा की संभावित परिभाषा और वर्गीकरण के लिए फ़ाइलों या कोड टुकड़ों के स्तर से। इस सेवा पर हमारे सभी काम अपने दैनिक विकास कार्यों में डेवलपर्स का समर्थन करने के साथ-साथ उच्च गुणवत्ता वाले कोड लिखने के लिए शर्तों का निर्माण करना है।
यदि आप हमारे काम में योगदान करने में रुचि रखते हैं, तो कृपया ट्विटर
@github पर हमसे संपर्क करने में संकोच न करें!