Name Last Update
code Loading commit data...
reports Loading commit data...
ReadMe.md Loading commit data...

비지도 학습을 이용한 소스 코드 유사성 검증

Author

2017103967 김성주

1. Dataset

학습에 사용할 소스 코드 데이터셋이 필요합니다.

본 연구에서는 Github에서 MNIST dataset을 사용한 python 코드를 크롤링하여 수집했고,

code/crawler/main.py 혹은 code/crawler/crawler.py를 참고하시기 바랍니다.

데이터셋의 소스 코드들이 unique한 경우에 표절 데이터셋을 추가적으로 생성할 수 있습니다.

본 연구에서는 original dataset에 대해 함수/클래스/조건문 등의 구문 단위로 shuffle하거나,

고유 키워드나 주로 쓰이는 키워드를 최대한 제외하고 변수명과 함수명을 난독화하거나 (obfuscate),

original source code A와 B를 merge한 데이터셋을 생성하였습니다.

자세한 것은 code/dataset_generator/main.py를 참고하시기 바랍니다.

2. Embedding Vector

단어 임베딩 모델에 학습시키기 위해서는, raw dataset에 대한 tokenized vocabulary가 필요합니다.

소스 코드는 일반적인 텍스트와 달리 공백이나 줄 단위로 토큰화할 수 없으므로,

syntax를 분석하여 파싱할 필요가 있습니다. 본 연구에서는 astminer 도구를 사용해 수행했습니다.

자세한 과정은 링크를 참고하시기 바랍니다.

tokenized dataset은 모델에 입력하기 전 별도의 전처리가 필요합니다.

code/code2vec/preprocess_py.sh를 참고하시기 바랍니다.

전처리된 파일은 c2v format입니다. c2v 파일을 이용해 학습을 진행할 수 있습니다.

code/code2vec/train.sh를 참고하시기 바랍니다.

3. Similarity Plotting

학습이 진행된 모델을 사용해 소스 코드 간의 cosine similarity를 계산할 수 있습니다.

code/similarity_plotter/code2vec_tester.py를 참고하시기 바랍니다.

해당 코드에서 불러오는 모델 파일은 code/code2vec/release.sh를 이용해 생성할 수 있습니다.

4. Siamese Network

여러 가지의 시도가 혼재되어 있어 진행 중 에러가 발생할 수 있습니다.

전체적인 과정은 code/siamese_network/train.py를 참고하시기 바랍니다.

Siamese Network 학습을 위해서는 pair dataset과 embedding matrix가 필요합니다.

code/siamese_network/dataset.py에서 2에서 학습한 모델의 출력 벡터를 불러와 pair dataset을 생성합니다. 또한 해당 코드에서 embedding matrix를 불러옵니다.

embedding matrix는 다음과 같은 과정으로 생성할 수 있습니다.

embedding_index = {}
words = model.index_to_key
vocab_size = len(words) + 1
embedding_matrix = np.zeros((vocab_size, 384))

for i in range(len(words)):
    word = words[i]
    if word in model:
        embedding_matrix[i] = model[word]

# save data here

네트워크 구조는 code/siamese_network/model.py를 참고하시기 바랍니다.

train/test/predict는 각각 code/siamese_network/train.py , code/siamese_network/test.py,

code/siamese_network/predict.py로 진행할 수 있습니다.