Phát hiện các cụm mã nguồn tương tự của Wap


10

Giả sử tôi có 400 sinh viên (đó là trong một trường đại học lớn) phải làm một dự án khoa học máy tính, và họ phải làm việc một mình (không có nhóm sinh viên). Một ví dụ về dự án có thể là "thực hiện thuật toán biến đổi phạm vi nhanh trong fortran" (tôi biết, điều đó không có vẻ gợi cảm nhưng điều đó làm cho câu hỏi của tôi đơn giản hơn). Tôi là người sửa lỗi và tôi muốn gửi các thói quen để kiểm tra xem có nhóm nào sinh viên đã đề xuất thực hiện "quá giống với văn bản thực sự độc lập" hay không.

Đây là tìm kiếm không giám sát cho các cụm. Tôi nghĩ rằng câu hỏi là về việc sử dụng thuộc tính nào hơn là sử dụng thuật toán phân cụm. Điều đầu tiên tôi sẽ làm là một biểu đồ bằng chữ cái. Lý tưởng nhất, vì những kẻ gian lận thông minh hơn thế, cuối cùng tôi cũng sẽ thử các hoán vị ngẫu nhiên của các chữ cái để xem liệu có phù hợp với biểu đồ của chữ cái (có hoán vị) không. Ngoài ra, những người không khám phá cấu trúc của mã, chỉ phân phối biên của các chữ cái ... bạn có giải pháp nào? Có phần mềm hoặc gói hiện có dành riêng cho vấn đề đó không? (thực ra ngày xưa, các giáo viên khoa học máy tính của tôi tuyên bố họ có loại công cụ đó, nhưng bây giờ tôi nghi ngờ rằng họ có một cái gì đó rất đơn giản)

Tôi đoán luật sư từ sự phát triển phần mềm cũng có loại vấn đề đó (không phải với 1000 sinh viên, nhưng với 2 mã lớn ... điều này làm cho mọi thứ khó khăn hơn)?

Câu trả lời:


4

Bước tiền xử lý rõ ràng là hợp nhất các tệp thực sự giống hệt nhau.

Sau đó, chìa khóa là bình thường hóa . Tại một số điểm, sinh viên sẽ bắt đầu tái cấu trúc mã, đổi tên các biến và như vậy. Hoặc sắp xếp lại các ý kiến. Một biểu đồ chữ cái bị ảnh hưởng quá nhiều bởi điều này (cộng với nó sẽ nắm bắt rất nhiều thuộc tính ngôn ngữ).

Một kỹ thuật phổ biến là sử dụng trình phân tích cú pháp cụ thể theo ngôn ngữ và chuyển đổi mã nguồn thành cây cú pháp trừu tượng. Sau đó trích xuất các tính năng từ này. Và có thể phân tích các ý kiến ​​riêng song song.

Sau đó, có cách tiếp cận "chuỗi chung dài nhất" dựa trên dòng. Nếu bạn có sự tương đồng khá tốt trên các dòng đơn, bạn có thể tìm kiếm chuỗi con chung dài nhất của bất kỳ hai tệp nào. Điều này cũng sẽ mang lại một số trận đấu.


Chỉ muốn thêm rằng chuỗi con chung dài nhất có thể được tìm thấy một cách hiệu quả bằng cách sử dụng các cây Suffix hoặc mảng hậu tố.
sebp

Cảm ơn Anony, tôi thực sự thích tinh thần của câu trả lời của bạn (và nâng cao nó). Nghe có vẻ như số liệu thống kê chiều cao thực sự với "thông tin dữ liệu" và tìm kiếm các mẫu cực đoan. Những loại khoảng cách bạn sẽ đặt trên những cây đó?
cướp girard

Tôi không phải là một chuyên gia về sự giống nhau của các đại diện AST. Tôi tin rằng có một khái niệm "mô phỏng" theo nghĩa một cây là một loại cây con đặc biệt của cây kia. Để so sánh AST, bạn cần căn chỉnh chúng và tính sự khác biệt tương đối, tôi đoán vậy. Có thể không tính thứ tự của các chi nhánh, vì vậy việc sắp xếp lại mã tầm thường không thay đổi kết quả. Xin lưu ý rằng bạn có thể đi đến điểm bạn nhận được dương tính giả vì chỉ có n cách giải quyết vấn đề hiệu quả và bạn nhận được dương tính giả chỉ vì họ tìm ra giải pháp chính xác ...
Có QUIT - Anony-Mousse

0

Từ thế giới chống đạo văn, trước đây tôi đã bắt gặp khái niệm "Đồ thị đẳng cấu". Có lẽ bạn cũng có thể nhìn vào đó.

LCS - Hậu quả chung dài nhất cũng có thể xảy ra. Nhưng hãy thử so sánh tất cả các giải pháp này và xem những gì tốt nhất :)


Chào mừng đến với trang web này! Bạn có thể đưa ra một số tài liệu tham khảo về công việc đã nói ở trên và có thể biết thêm chi tiết để người đọc có thể hiểu rõ hơn về cách thức biểu đồ đẳng cấu hoặc LCS có thể giải quyết vấn đề trong tay không?
chl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.