"유사한"소스 코드의 클러스터 감지


10

컴퓨터 과학 프로젝트를 수행해야하는 400 명의 학생 (큰 대학교에 있음)이 있고 학생들이 혼자 일해야한다고 가정합니다 (학생 그룹 없음). 프로젝트의 예는 "fortran에서 빠른 푸리에 변환 알고리즘을 구현하는 것"이라고 할 수 있습니다 (나는 섹시하지는 않지만 내 질문을 더 간단하게 만듭니다). 저는 정답이며, "정말 독립적으로 작성하기에는 너무 유사한"구현을 제안한 학생 그룹이 있는지 확인하기 위해 루틴을 보내려고합니다.

이것은 클러스터에 대한 감독되지 않은 검색입니다. 질문은 사용할 클러스터링 알고리즘이 아니라 사용할 속성에 대한 것입니다. 내가 할 첫 번째 일은 편지 별 히스토그램입니다. 이상적으로는 사기꾼이 그보다 똑똑하기 때문에 결국에는 문자의 히스토그램 (순열 포함)이 올바르게 일치하는지 확인하기 위해 무작위로 선택된 임의의 순열을 시도합니다. 또한 코드 구조를 탐색하지 않고 글자의 한계 분포 만 탐색합니다 ... 어떤 솔루션이 있습니까? 해당 문제에 대한 기존 소프트웨어 또는 패키지가 있습니까? (실제로 컴퓨터 과학 교사들은 이전에 이런 종류의 도구가 있다고 주장했지만 이제는 매우 간단한 도구가 있다고 생각합니다)

나는 소프트웨어 개발의 변호사가 이런 종류의 문제를 가지고 있다고 생각합니다 (1000 명의 학생이 아니라 2 개의 큰 코드가 있습니다 ...

답변:


4

명백한 전처리 단계는 실제로 동일한 파일을 병합하는 것입니다.

그 후 키는 정규화 입니다. 어느 시점에서 학생들은 코드 리팩토링, 변수 이름 바꾸기 등을 시작합니다. 또는 의견을 바꾸십시오. 문자 히스토그램은 이것의 영향을 너무 많이받습니다 (또한 많은 언어 속성을 캡처합니다).

일반적인 기술은 언어 별 구문 분석기를 사용하고 소스 코드를 추상 구문 트리로 변환하는 것입니다. 그런 다음 기능을 추출하십시오. 주석을 개별적으로 병렬 분석 할 수도 있습니다.

그런 다음 회선 기반 "가장 긴 공통 하위 시퀀스"접근 방식이 있습니다. 한 줄에 대해 상당히 유사한 유사성이있는 경우 두 파일 중 가장 긴 공통 하위 시퀀스를 검색 할 수 있습니다. 이것은 또한 많은 일치를 낳을 것입니다.


접미사 트리 또는 접미사 배열을 사용하여 가장 긴 공통 하위 시퀀스를 효율적으로 찾을 수 있다고 덧붙였습니다 .
sebp

감사합니다 익명, 나는 당신의 대답의 정신을 정말로 좋아합니다 (그리고 그것을 상향했습니다). "데이터 변형"이 포함 된 실제 고차원 통계처럼 들리고 극단적 인 패턴을 검색합니다. 그 나무에 어떤 거리를 두시겠습니까?
로빈 지라드

나는 AST 표현의 유사성에 대한 전문가가 아닙니다. 한 트리는 다른 트리의 특수한 하위 트리라는 의미에서 "시뮬레이션"개념이 있다고 생각합니다. AST를 비교하려면 그것들을 정렬하고 상대적인 차이를 세어야합니다. 분기 순서를 고려하지 않았을 수도 있으므로 사소한 코드 순서 변경으로 결과가 변경되지 않습니다. 문제를 효율적으로 해결하는 n 가지 방법이 있기 때문에 오 탐지가 발생하는 지점에 도달 할 수 있으며 올바른 해결책을 찾은 것만으로 오 탐지가 발생합니다.
QUIT--Anony-Mousse

0

반 표절 세계에서 나는 이전에 "그래프 동 형사상"이라는 개념을 접했다. 어쩌면 당신도 그것을 볼 수 있습니다.

LCS-가장 긴 공통 서브 시퀀스도 가능합니다. 그러나이 모든 솔루션을 비교하고 가장 좋은 것이 무엇인지보십시오. :)


이 사이트에 오신 것을 환영합니다! 앞서 언급 한 작업에 대한 참고 자료를 제공하고 더 자세한 내용을 통해 독자들이 그래프 동형 또는 LCS가 문제를 어떻게 해결할 수 있는지 더 잘 이해할 수 있도록 하시겠습니까?
chl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.