ReadMe.md 3.15 KB

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

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로 진행할 수 있습니다.