Mendeteksi Cluster kode sumber "mirip"


10

Asumsikan saya memiliki 400 siswa (yang ada di universitas besar) yang harus melakukan proyek ilmu komputer, dan bahwa mereka harus bekerja sendiri (tidak ada kelompok siswa). Contoh proyek dapat membiarkan "menerapkan algoritma transformasi fourier cepat di fortran" (Saya tahu, itu tidak terdengar seksi tetapi itu membuat pertanyaan saya lebih sederhana). Saya yang benar dan saya ingin mengirim rutinitas untuk memeriksa apakah ada kelompok siswa yang telah mengusulkan implementasi yang "terlalu mirip untuk benar-benar ditulis secara independen".

Ini adalah pencarian cluster tanpa pengawasan. Saya pikir pertanyaannya lebih tentang atribut mana yang harus digunakan daripada algoritma pengelompokan mana yang digunakan. Hal pertama yang akan saya lakukan adalah huruf demi huruf histogram. Idealnya, karena penipu lebih pintar dari itu, saya akhirnya akan mencoba permutasi acak yang dipilih dengan baik untuk melihat apakah ada kecocokan histogram huruf (dengan permutasi) yang baik. Juga mereka yang tidak menjelajahi struktur kode, hanya distribusi marginal surat ... solusi apa yang Anda miliki? apakah ada perangkat lunak atau paket yang ada yang didedikasikan untuk masalah itu? (sebenarnya di masa lalu saya guru ilmu komputer mengklaim mereka memiliki jenis alat itu, tapi saya sekarang curiga bahwa mereka memiliki sesuatu yang sangat sederhana)

Saya kira pengacara dari pengembangan perangkat lunak memiliki jenis masalah juga (tidak dengan 1000 siswa, tetapi dengan 2 kode besar ... yang membuat segalanya lebih sulit)?

Jawaban:


4

Langkah pra-pemrosesan yang jelas adalah menggabungkan file yang benar-benar identik.

Setelah itu kuncinya adalah normalisasi . Pada titik tertentu, siswa akan mulai refactoring kode, mengubah nama variabel dan semacamnya. Atau tulis ulang komentar. Huruf histogram terlalu dipengaruhi oleh ini (ditambah lagi akan menangkap banyak properti bahasa).

Teknik umum adalah dengan menggunakan parser khusus bahasa dan mengubah kode sumber menjadi pohon sintaksis abstrak. Kemudian ekstrak fitur dari ini. Dan mungkin menganalisis komentar secara terpisah secara paralel.

Lalu ada pendekatan berbasiskan "urutan terpanjang umum". Jika Anda memiliki kesamaan yang cukup baik pada satu baris, Anda dapat mencari urutan kedua terpanjang dari semua file. Ini juga akan menghasilkan sejumlah kecocokan.


Hanya ingin menambahkan bahwa urutan umum terpanjang dapat ditemukan secara efisien menggunakan pohon Suffix atau array suffix.
sebp

Terima kasih Anony, saya sangat suka semangat jawaban Anda (dan membesarkannya). Kedengarannya seperti statistik dimensi tinggi sejati dengan "data trasformation" dan mencari pola yang ekstrem. Berapa jarak yang akan Anda tempuh pada pohon-pohon itu?
robin girard

Saya bukan ahli untuk kesamaan representasi AST. Saya percaya ada anggapan "simulasi" dalam arti bahwa satu pohon adalah jenis subtree khusus yang lain. Untuk membandingkan AST, Anda harus menyelaraskannya dan menghitung perbedaan relatif, saya kira. Mungkin tidak memperhitungkan urutan cabang, jadi pemesanan ulang kode sepele tidak mengubah hasil. Ketahuilah bahwa Anda mungkin sampai pada titik di mana Anda mendapatkan positif palsu karena hanya ada n cara untuk menyelesaikan masalah secara efisien, dan Anda mendapatkan positif palsu hanya karena mereka menemukan solusi yang tepat ...
Punya QUIT - Anony-Mousse

0

Dari dunia anti plagiarisme, saya sebelumnya menemukan gagasan "Grafik Isomorfisme". Mungkin Anda bisa melihatnya juga.

LCS - Pergantian Umum Terpanjang juga dimungkinkan. Tapi coba bandingkan semua solusi ini dan lihat apa yang terbaik :)


Selamat datang di situs ini! Bisakah Anda memberikan beberapa referensi pada karya yang disebutkan di atas, dan mungkin lebih banyak detail sehingga pembaca bisa mendapatkan ide yang lebih baik tentang bagaimana grafik isomorfisme atau LCS dapat memecahkan masalah yang dihadapi?
chl
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.