"समान" स्रोत कोड के क्लस्टर का पता लगाना


10

मान लें कि मेरे पास 400 छात्र हैं (जो एक बड़े विश्वविद्यालय में हैं) जिन्हें कंप्यूटर विज्ञान परियोजना करनी है, और उन्हें अकेले काम करना होगा (छात्रों का कोई समूह नहीं)। प्रोजेक्ट का एक उदाहरण "फोरट्रान में एक तेज फूरियर ट्रांसफॉर्म एल्गोरिथ्म को लागू करने" को दिया जा सकता है (मुझे पता है, कि सेक्सी ध्वनि नहीं है लेकिन यह मेरे सवाल को सरल बनाता है)। मैं सही हूं और मैं यह जांचने के लिए रूटीन भेजना चाहता हूं कि क्या ऐसे छात्रों के समूह हैं जिन्होंने कार्यान्वयन का प्रस्ताव दिया है जो "वास्तव में स्वतंत्र रूप से लिखे जाने के समान हैं"।

यह गुच्छों के लिए अनिश्चित खोज है। मुझे लगता है कि सवाल यह है कि कौन सी विशेषताओं का उपयोग करने के बजाय कौन सा क्लस्टरिंग एल्गोरिथ्म का उपयोग करना है। पहली चीज जो मैं करता हूं वह पत्र हिस्टोग्राम द्वारा एक पत्र है। आदर्श रूप से, चूंकि चॉटर उससे कहीं अधिक होशियार हैं, इसलिए मैं अंततः पत्र के अच्छे क्रमबद्ध यादृच्छिक क्रमों को देखने की कोशिश करूंगा कि क्या पत्र के हिस्टोग्राम (क्रमपरिवर्तन के साथ) का अच्छा मेल मौजूद है। इसके अलावा, जो कोड की संरचना का पता नहीं लगाते हैं, केवल पत्रों का सीमांत वितरण ... आपके पास क्या समाधान है? क्या मौजूदा सॉफ़्टवेयर या पैकेज उस समस्या के लिए समर्पित हैं? (वास्तव में मेरे पुराने दिनों में कंप्यूटर विज्ञान के शिक्षकों ने दावा किया था कि उनके पास उस प्रकार का उपकरण है, लेकिन मुझे अब संदेह है कि उनके पास कुछ बहुत ही सरल था)

मुझे लगता है कि सॉफ्टवेयर विकास से वकील को उस प्रकार के मुद्दे भी हैं (1000 छात्रों के साथ नहीं, लेकिन 2 बड़े कोड के साथ ... जो चीजों को कठिन बनाता है)?

जवाबों:


4

स्पष्ट पूर्व-प्रसंस्करण कदम उन फ़ाइलों को मर्ज करना है जो वास्तव में समान हैं।

उसके बाद कुंजी सामान्यीकरण है । कुछ बिंदु पर, छात्र कोड को रीक्रिएट करना शुरू कर देंगे, चर और नाम बदलकर। या टिप्पणियों को फिर से लिखें। एक अक्षर हिस्टोग्राम इससे बहुत अधिक प्रभावित होता है (साथ ही यह बहुत सारे भाषा गुणों को कैप्चर करेगा)।

एक सामान्य तकनीक भाषा-विशिष्ट पार्सर का उपयोग करना और स्रोत कोड को एक सार वाक्यविन्यास ट्री में बदलना है। फिर इसमें से फीचर्स निकाले। और शायद समानांतर में टिप्पणियों का अलग-अलग विश्लेषण करें।

उसके बाद लाइन-आधारित "सबसे लंबी सामान्य अनुवर्ती" दृष्टिकोण है। यदि आपके पास एकल लाइनों पर यथोचित रूप से अच्छी समानता है, तो आप किसी भी दो फ़ाइलों की सबसे लंबी आम खोज कर सकते हैं। इससे कई मैच भी होंगे।


बस यह जोड़ना चाहता था कि सबसे लंबे समय तक सामान्य परिणाम को कुशलतापूर्वक Suffix पेड़ों या प्रत्यय सरणियों का उपयोग करके पाया जा सकता है ।
sebp

धन्यवाद Anony, मैं वास्तव में आपके उत्तर की आत्मा को पसंद करता हूं (और इसे उखाड़ फेंका)। यह "डेटा ट्रैसफॉर्मेशन" के साथ सच्चे उच्च आयामी आंकड़ों की तरह लगता है और चरम पैटर्न की खोज करता है। आप उन पेड़ों पर किस प्रकार की दूरी तय करेंगे?
रॉबिन जिरार्ड '

मैं एएसटी अभ्यावेदन की समानता के लिए एक विशेषज्ञ नहीं हूं। मेरा मानना ​​है कि इस अर्थ में "अनुकरण" की धारणा है कि एक पेड़ दूसरे का एक विशेष प्रकार का उपप्रकार है। एएसटी की तुलना करने के लिए, आपको उन्हें संरेखित करना होगा और सापेक्ष मतभेदों को गिनना होगा, मुझे लगता है। हो सकता है कि शाखाओं के आदेश को ध्यान में नहीं रखा जा रहा हो, इसलिए तुच्छ कोड पुनरीक्षण परिणाम नहीं बदलता है। ध्यान रखें कि आप बिंदु जहाँ आप झूठे सकारात्मक मिलता है, क्योंकि वहाँ बस रहे हैं n समस्या कुशलता से हल करने के तरीके के लिए मिल सकता है, और आप गलत परिणामों की बस क्योंकि वे सही समाधान मिला ...
है QUIT - Anony-मूस

0

साहित्यिक चोरी विरोधी दुनिया से, मैं पहले "ग्राफ आइसोमॉर्फिज्म" की धारणा में आया था। शायद आप उस पर भी नज़र डाल सकते हैं।

LCS - सबसे लंबा सामान्य परिणाम भी संभव है। लेकिन इन सभी समाधानों की तुलना करने की कोशिश करें और देखें कि क्या सबसे अच्छा है :)


इस साइट पर आपका स्वागत है! क्या आप उपर्युक्त कार्य पर कुछ संदर्भ दे सकते हैं, और शायद अधिक विवरण ताकि पाठकों को इस बात का बेहतर अंदाजा हो सके कि ग्राफ समरूपता या LCS हाथ में समस्या को कैसे हल कर सकता है?
chl
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.