GitHub memiliki lebih dari 300 bahasa pemrograman, mulai dari bahasa terkenal seperti Python, Jawa, dan Javascript hingga bahasa esoterik seperti
Befunge , yang hanya diketahui oleh sekelompok kecil orang.
10 bahasa pemrograman yang dipandu oleh GitHub berdasarkan jumlah repositoriSalah satu masalah yang dihadapi GitHub adalah pengenalan berbagai bahasa pemrograman. Ketika beberapa kode ditempatkan di repositori, pengenalan jenisnya sangat penting. Ini diperlukan untuk alasan pencarian, peringatan kerentanan, penyorotan sintaksis, serta representasi struktural dari konten repositori kepada pengguna.
Sepintas, pengenalan bahasa adalah tugas yang sederhana, tetapi tidak demikian halnya.
Ahli bahasa adalah alat yang saat ini kami gunakan untuk mendefinisikan bahasa pemrograman di GitHub. Linguist adalah aplikasi Ruby yang menggunakan berbagai strategi pengenalan bahasa, termasuk informasi nama dan ekstensi file. Selain itu, memperhitungkan model Vim atau Emacs, serta konten di bagian atas file (shebang). Ahli bahasa memproses ambiguitas linguistik secara heuristik dan, jika ini tidak berhasil, maka gunakan pengklasifikasi Bayesian naif yang dilatih pada sampel data yang kecil.
Meskipun Linguist memprediksi dengan cukup baik di tingkat file (84% akurasi), semuanya rusak ketika file diberi nama aneh, dan terlebih lagi ketika file tidak memiliki ekstensi. Ini membuat Linguist tidak berguna untuk konten seperti GitHub Gists atau cuplikan kode dalam README, kesalahan, dan menarik permintaan.
Untuk membuat definisi bahasa menjadi lebih jelas dalam jangka panjang, kami telah mengembangkan classifier pembelajaran mesin yang disebut OctoLingua. Ini didasarkan pada arsitektur Jaringan Syaraf Tiruan (JST), yang dapat menangani prediksi bahasa dalam skenario non-sepele. Versi model saat ini dapat membuat prediksi untuk 50 bahasa pemrograman teratas di GitHub dan melampaui Linguist secara akurat.
Lebih detail tentang OctoLingua
OctoLingua ditulis dari awal dengan Python, Keras dengan backend TensorFlow - ia dibuat agar akurat, andal, dan mudah dirawat. Pada bagian ini, kita akan berbicara tentang sumber data kami, arsitektur model, dan tes kinerja OctoLingua. Kami juga akan berbicara tentang proses penambahan kemampuan untuk mengenali bahasa baru.
Sumber data
Versi OctoLingua saat ini telah dilatih tentang file yang diperoleh dari
Rosetta Code dan dari serangkaian repositori crowdsource internal. Kami telah membatasi serangkaian bahasa kami hingga 50 bahasa terpopuler di GitHub.
Rosetta Code adalah dataset awal yang sangat baik karena mengandung kode sumber yang ditulis untuk melakukan tugas yang sama, tetapi dalam bahasa pemrograman yang berbeda. Misalnya, kode untuk menghasilkan
angka -
angka Fibonacci disajikan dalam C, C ++, CoffeeScript, D, Java, Julia, dan lainnya. Namun, cakupan bahasa-bahasa itu heterogen: untuk beberapa bahasa pemrograman, hanya ada beberapa file dengan kode, untuk yang lain, file mengandung kode yang terlalu sedikit. Oleh karena itu, perlu untuk melengkapi set data pelatihan kami dengan beberapa sumber tambahan dan dengan demikian secara signifikan meningkatkan cakupan bahasa dan keefektifan model akhir.
Proses kami menambahkan bahasa baru tidak sepenuhnya otomatis. Kami secara kompilasi mengkompilasi kode sumber dari repositori publik di GitHub. Kami hanya memilih repositori yang memenuhi kriteria kualifikasi minimum, seperti jumlah minimum garpu yang mencakup bahasa target dan yang mencakup ekstensi file tertentu. Pada tahap pengumpulan data ini, kami mendefinisikan bahasa utama repositori menggunakan klasifikasi dari Linguist.
Gejala: Berdasarkan pengetahuan sebelumnya
Secara tradisional, arsitektur berbasis memori seperti Recurrent Neural Networks (RNN) dan Long Short Term Memory Networks (LSTM) digunakan untuk memecahkan masalah klasifikasi teks menggunakan jaringan saraf. Namun, perbedaan dalam bahasa pemrograman dalam kosa kata, ekstensi file, struktur, gaya mengimpor perpustakaan dan detail lainnya memaksa kami untuk datang dengan pendekatan berbeda yang menggunakan semua informasi ini, mengekstraksi beberapa tanda dalam bentuk tabel untuk melatih classifier kami. Atribut diambil sebagai berikut:
- Top 5 Karakter Khusus dalam File
- 20 karakter teratas dalam file
- Ekstensi file
- Kehadiran karakter khusus khusus yang digunakan dalam kode sumber file, seperti titik dua, kurung kurawal, titik koma
Model Jaringan Syaraf Tiruan (JST)
Kami menggunakan faktor-faktor di atas sebagai input untuk jaringan saraf dua lapis yang dibangun menggunakan Keras dengan backend Tensorflow.
Diagram di bawah ini menunjukkan bahwa langkah ekstraksi fitur membuat entri tabel n-dimensi untuk classifier kami. Ketika informasi bergerak melalui lapisan-lapisan jaringan kami, itu diperintahkan dengan keluar, dan hasilnya adalah keluaran 51 dimensi, yang mewakili kemungkinan bahwa kode ini ditulis dalam masing-masing dari 50 bahasa teratas di GitHub. Ini juga menunjukkan kemungkinan bahwa kode tidak ditulis dalam salah satu dari 50 bahasa.
Struktur JST dari model sumber (50 bahasa + 1 untuk "lainnya")Kami menggunakan 90% dari database sumber kami untuk pelatihan. Juga, pada langkah pelatihan model, bagian dari ekstensi file telah dihapus sehingga model dapat belajar secara khusus dari kosakata file, dan bukan dari ekstensi mereka, yang memprediksi bahasa pemrograman dengan sangat baik.
Tes kinerja
OctoLingua vs Ahli Bahasa
Pada tabel di bawah, kami menunjukkan
Skor F1 (rata-rata harmonis antara akurasi dan kelengkapan) untuk OctoLingua dan Linguist yang dihitung pada set tes yang sama (10% dari volume sumber data asli kami).
Tiga tes ditunjukkan di sini. Pada tes pertama, kumpulan data tidak tersentuh sama sekali; yang kedua, ekstensi file dihapus; di yang ketiga, ekstensi file diacak untuk mengacaukan classifier (misalnya, file Java bisa memiliki ekstensi ".txt", dan ekstensi file Python ".java".
Intuisi di balik pengocokan atau penghapusan ekstensi file dalam rangkaian pengujian kami adalah untuk mengevaluasi keandalan OctoLingua dalam mengklasifikasikan file ketika tag kunci dihapus atau menyesatkan. Penggolong yang tidak terlalu bergantung pada ekstensi akan sangat berguna untuk mengklasifikasikan log dan cuplikan kode, karena dalam kasus ini orang biasanya tidak memberikan informasi yang akurat tentang ekstensi (misalnya, banyak log terkait kode memiliki ekstensi txt.)
Tabel di bawah ini menunjukkan bagaimana OctoLingua memiliki kinerja yang baik dalam berbagai kondisi, ketika kami mengasumsikan bahwa model belajar terutama dari kosakata kode, dan bukan dari meta-informasi (misalnya, ekstensi file). Pada saat yang sama, Linguist menentukan bahasa dengan keliru, begitu informasi tentang ekstensi file yang benar hilang.
Kinerja OctoLingua vs. Ahli Bahasa pada test suite yang samaEfek menghapus ekstensi file saat melatih model
Seperti disebutkan sebelumnya, selama pelatihan, kami menghapus persentase tertentu dari ekstensi file dari data untuk membuat model belajar dari kosakata file. Tabel di bawah ini menunjukkan kinerja model kami dengan berbagai proporsi ekstensi file dihapus selama pelatihan.
Kinerja OctoLingua dengan persentase berbeda dari ekstensi file yang dihapusHarap perhatikan bahwa model yang dilatih pada file dengan ekstensi secara signifikan kurang efektif pada file uji tanpa ekstensi atau dengan ekstensi campuran daripada pada data uji reguler. Di sisi lain, ketika model dilatih pada kumpulan data di mana bagian ekstensi file dihapus, kinerja model tidak banyak berkurang pada set tes yang dimodifikasi. Ini mengkonfirmasi bahwa menghapus ekstensi dari bagian file selama pelatihan meminta classifier kami untuk belajar lebih banyak dari kosa kata kode. Ini juga menunjukkan bahwa ekstensi file cenderung mendominasi dan mencegah pembobotan dari konten yang ditampilkan.
Dukungan bahasa baru
Menambahkan bahasa baru ke OctoLingua adalah proses yang cukup sederhana. Itu dimulai dengan pencarian dan memperoleh sejumlah besar file dalam bahasa baru (kita bisa melakukan ini secara terprogram, seperti yang dijelaskan dalam bagian "Sumber Data"). File-file ini dibagi ke dalam suite pelatihan dan uji, dan kemudian melewati preprocessor dan extractor fitur kami. Dataset baru ditambahkan ke kumpulan yang ada. Test kit memungkinkan kami memastikan keakuratan model kami tetap dapat diterima.
Menambahkan bahasa baru ke OctoLinguaRencana kami
OctoLingua saat ini berada pada "tahap prototyping lanjutan". Mekanisme klasifikasi bahasa kami sudah dapat diandalkan, tetapi belum mendukung semua bahasa pemrograman yang tersedia di GitHub. Selain memperluas dukungan bahasa, yang tidak begitu sulit, kami berusaha menyediakan deteksi bahasa dengan berbagai tingkat detail kode. Implementasi kami saat ini sudah memungkinkan kami, dengan sedikit modifikasi dari mekanisme pembelajaran mesin kami, untuk mengklasifikasikan fragmen kode. Selain itu, tampaknya tidak sulit untuk membawa model ke tahap di mana ia dapat dengan andal mendeteksi dan mengklasifikasikan bahasa yang disematkan.
Kami juga mempertimbangkan untuk menerbitkan kode sumber untuk model kami, tetapi kami membutuhkan permintaan dari komunitas.
Kesimpulan
Tujuan kami dalam pengembangan OctoLingua adalah untuk menciptakan layanan yang memberikan definisi bahasa yang andal oleh kode sumber pada berbagai tingkat detail: dari level file atau fragmen kode hingga definisi potensial dan klasifikasi bahasa di level line. Semua pekerjaan kami pada layanan ini ditujukan untuk mendukung pengembang dalam pekerjaan pengembangan sehari-hari mereka, serta menciptakan kondisi untuk menulis kode berkualitas tinggi.
Jika Anda tertarik untuk berkontribusi dalam pekerjaan kami, jangan ragu untuk menghubungi kami di Twitter
@github !