태그 보관물: clustering

clustering

“유사한”소스 코드의 클러스터 감지 번째 일은

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

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

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



답변

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

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

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

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


답변

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

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


답변