Toggle navigation
Toggle navigation
This project
Loading...
Sign in
2021-1-capstone-design2
/
2017103967
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Snippets
Network
Create a new issue
Builds
Commits
Issue Boards
Authored by
김성주
2021-06-14 18:37:23 +0900
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
04c099a9b3f72a55fa8262f148b06724ed9644aa
04c099a9
1 parent
45fcec6a
release fix and readme
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
104 additions
and
6 deletions
ReadMe.md
code/code2vec/release.sh
code/code2vec/train.sh
code/siamese/predict.py
code/similarity_plotter/code2vec_tester.py
ReadMe.md
0 → 100644
View file @
04c099a
# 비지도 학습을 이용한 소스 코드 유사성 검증
### **Author**
2017103967 김성주
### 1. Dataset
학습에 사용할 소스 코드 데이터셋이 필요합니다.
본 연구에서는 Github에서 MNIST dataset을 사용한 python 코드를 크롤링하여 수집했고,
```
code/crawler/main.py``` 혹은 ```code/crawler/cralwer.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 도구를 사용해 수행했습니다.
자세한 과정은 [링크](https://github.com/JetBrains-Research/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
```
로 진행할 수 있습니다.
\ No newline at end of file
code/code2vec/release.sh
0 → 100644
View file @
04c099a
model_dir
=
models
set
-e
python -u code2vec.py --load
${
model_dir
}
/saved_model --save_t2v
${
model_dir
}
/release/targets.txt
\ No newline at end of file
code/code2vec/train.sh
View file @
04c099a
type
=
python
dataset_name
=
dataset
data_dir
=
../data/
${
dataset_name
}
data
=
${
data_dir
}
/
${
dataset_name
}
...
...
code/siamese/predict.py
View file @
04c099a
...
...
@@ -19,7 +19,7 @@ def avg_feature_vector(text, model, num_features, index2word_set):
feature_vec
=
np
.
divide
(
feature_vec
,
n_words
)
return
feature_vec
def
compare
(
c
2v_model
,
model
,
dir1
,
dir2
):
def
compare
(
t
2v_model
,
model
,
dir1
,
dir2
):
files
=
[
f
for
f
in
readdir
(
dir1
)
if
is_extension
(
f
,
'py'
)]
plt
.
ylabel
(
'cos_sim'
)
...
...
@@ -28,7 +28,7 @@ def compare(c2v_model, model, dir1, dir2):
idx
=
0
L
=
len
(
files
)
data
=
[]
index2word_set
=
set
(
c
2v_model
.
index_to_key
)
index2word_set
=
set
(
t
2v_model
.
index_to_key
)
for
f
in
files
:
print
(
idx
,
"/"
,
L
)
...
...
@@ -47,8 +47,8 @@ def compare(c2v_model, model, dir1, dir2):
print
(
result
)
vectors_text_path
=
'data/targets.txt'
c
2v_model
=
KeyedVectors
.
load_word2vec_format
(
vectors_text_path
,
binary
=
False
)
t
2v_model
=
KeyedVectors
.
load_word2vec_format
(
vectors_text_path
,
binary
=
False
)
model
=
load_model
(
config
.
MODEL_PATH
)
# Usage
# compare(c2v_model, model, 'data/refined', 'data/shuffled')
\ No newline at end of file
# compare(t2v_model, model, 'data/refined', 'data/shuffled')
\ No newline at end of file
...
...
code/similarity_plotter/code2vec_tester.py
View file @
04c099a
...
...
@@ -4,7 +4,7 @@ import random
from
utils
import
*
import
matplotlib.pyplot
as
plt
vectors_text_path
=
'data/targets.txt'
#
w
2v output file from model
vectors_text_path
=
'data/targets.txt'
#
t
2v output file from model
model
=
KeyedVectors
.
load_word2vec_format
(
vectors_text_path
,
binary
=
False
)
def
compare
(
dir1
,
dir2
):
...
...
Please
register
or
login
to post a comment