인공지능/자연어 처리

코드 데이터 다뤄보기

이게될까 2025. 4. 18. 15:43
728x90
728x90

https://huggingface.co/datasets/espejelomar/code_search_net_python_10000_examples

 

espejelomar/code_search_net_python_10000_examples · Datasets at Hugging Face

['def', 'PintPars', '(', 'datablock', ',', 'araiblock', ',', 'zijdblock', ',', 'start', ',', 'end', ',', 'accept', ',', '*', '*', 'kwargs', ')', ':', 'if', "'version'", 'in', 'list', '(', 'kwargs', '.', 'keys', '(', ')', ')', 'and', 'kwargs', '[', "'versio

huggingface.co

https://huggingface.co/datasets/jtatman/python-code-dataset-500k

 

 

아마 스트링 데이터 다루기가 되지 않을까 싶습니다.

 

아직 작성 전 입니다. 

 

 

 

 

이런 데이터를 좀 더 자율롭게 다뤄보겠습니다.

 

 

더보기

 

아래 예시는 Jupyter Notebook(.ipynb) 환경에서, Hugging Face에 올라온 code_search_net_python_10000_examples 데이터셋의 일부(약 100개 예시)만 가져와 1) print문 추가, 2) 함수 이름 변경, 3) 무작위 위치에 주석 추가, 4) 변수명 변경을 각각 개별적으로 적용하고 저장할 수 있도록 구성한 예시 코드입니다. 데이터셋이 워낙 방대하므로, 실제 실행 시에는 인터넷 연결 및 datasets 라이브러리 설치가 필요합니다. 코드는 크게 아래와 같이 단계별로 나누어 작성했습니다.

────────────────────────────────────────────────────────────────────────

1) 데이터셋 불러오기 및 샘플링

2) 코드 변환 함수 정의 (print문 추가, 함수명 변경, 주석 삽입, 변수명 변경)

3) 변환 예시 수행 및 결과 저장

4) Notebook에서 편리하게 확인할 수 있도록 출력

────────────────────────────────────────────────────────────────────────

아래 예시는 구조와 작동 방식을 보여주는 데 집중했으며, 실제 활용 시에는 주석, 함수명, 변수명 등을 원하는 스타일에 맞춰 자유롭게 수정하시기 바랍니다.

────────────────────────────────────────────────────────────────────────

[1] 데이터셋 불러오기 및 샘플링

────────────────────────────────────────────────────────────────────────

```python

# 첫 번째 셀: 데이터셋 로드하고 100개 정도만 추출

!pip install datasets --quiet

from datasets import load_dataset

import random

# Hugging Face에서 데이터셋 불러오기 (train split 사용)

dataset = load_dataset("espejelomar/code_search_net_python_10000_examples", split="train")

# 예시용으로 100개만 랜덤으로 샘플링

num_samples = 100

sampled_dataset = dataset.shuffle(seed=42).select(range(num_samples)) # 맨 앞 100개

# 또는 random.sample(range(len(dataset)), num_samples) 같이 사용 가능

```

────────────────────────────────────────────────────────────────────────

[2] 코드 변환 함수 정의

────────────────────────────────────────────────────────────────────────

아래 예시 함수들은 각각의 코드를 문자열로 받아 특정 작업을 수행한 뒤, 변환된 문자열을 반환하도록 설계되었습니다. 여기서는 간단히 정규식 또는 문자열 치환 정도만 시연하고 있으며, 실제로는 파이썬 파싱(parsing) 라이브러리를 활용해 더 정교한 처리가 가능합니다.

```python

import re

def add_random_prints(code_str, print_text="임의의 메시지"):

"""

code_str 내 임의 위치에 print문을 추가합니다.

"""

lines = code_str.split('\n')

if len(lines) > 1:

insert_idx = random.randint(0, len(lines)-1)

# 임의의 위치(줄) 뒤에 print 문을 삽입

lines.insert(insert_idx, f"print('{print_text}') # 자동 추가된 print")

return "\n".join(lines)

def rename_functions(code_str, old_name="old_function", new_name="new_function"):

"""

code_str 내 함수 이름을 변경합니다.

간단한 예시로, 완벽한 파싱 없이 문자열 치환으로 처리.

"""

# 함수 정의 부분만 단순 치환 예시 (정교하게 하려면 AST 파싱 권장)

pattern = rf"def\s+{old_name}\s*\("

replacement = f"def {new_name}("

return re.sub(pattern, replacement, code_str)

def insert_random_comment(code_str, comment_text="# 무작위 주석입니다"):

"""

code_str 내 임의 위치(줄)에 주석을 추가합니다.

"""

lines = code_str.split('\n')

if len(lines) > 1:

insert_idx = random.randint(0, len(lines)-1)

lines.insert(insert_idx, comment_text)

return "\n".join(lines)

def rename_variables(code_str, old_var="old_var", new_var="new_var"):

"""

code_str 내 특정 변수명을 간단 치환 방식으로 변경합니다.

"""

# 정규식을 이용해 old_var라는 단어가 독립적으로 등장할 때만 치환

pattern = rf"\b{old_var}\b"

return re.sub(pattern, new_var, code_str)

```

────────────────────────────────────────────────────────────────────────

[3] 변환 예시 수행 및 결과 저장

────────────────────────────────────────────────────────────────────────

아래 코드는 샘플로 가져온 100개 예시에 대하여, 각각 함수들을 적용한 결과를 리스트 형태로 저장합니다. 실제 사용 시에는 필요한 변환만 골라 적용하면 됩니다.

```python

print_injected_codes = []

function_renamed_codes = []

comment_injected_codes = []

variable_renamed_codes = []

for i in range(num_samples):

# dataset 컬럼 이름은 실제로 확인 후 변경해주세요. 예: 'content', 'code', 'func_code' 등

original_code = sampled_dataset[i]["code"] # 예시로 'code' 컬럼명 가정

# 1) print문 추가 버전

code_with_print = add_random_prints(original_code, print_text="디버깅용 출력")

print_injected_codes.append(code_with_print)

# 2) 함수명 변경 버전

code_with_renamed_func = rename_functions(original_code, old_name="solve", new_name="my_solve")

function_renamed_codes.append(code_with_renamed_func)

# 3) 무작위 주석 추가 버전

code_with_comment = insert_random_comment(original_code, comment_text="# 임의 주석 추가")

comment_injected_codes.append(code_with_comment)

# 4) 변수명 변경 버전

code_with_renamed_var = rename_variables(original_code, old_var="data", new_var="my_data")

variable_renamed_codes.append(code_with_renamed_var)

# 이렇게 변환된 4가지 종류의 코드가 각각 별도의 리스트에 보관됩니다.

```

────────────────────────────────────────────────────────────────────────

[4] 결과를 간단히 확인하기

────────────────────────────────────────────────────────────────────────

아래처럼 개별 변환 결과를 원하는 방식으로 확인할 수 있습니다. 예를 들어, 0번 인덱스의 결과만 비교해볼 수도 있고, 4가지를 모두 한 번에 출력해볼 수도 있습니다.

```python

# 0번 인덱스 코드 변환 예시 출력

print("──────────── Original Code ────────────")

print(sampled_dataset[0]["code"])

print("\n──────────── Code with Print ────────────")

print(print_injected_codes[0])

print("\n──────────── Code with Function Renamed ────────────")

print(function_renamed_codes[0])

print("\n──────────── Code with Comment Inserted ────────────")

print(comment_injected_codes[0])

print("\n──────────── Code with Variable Renamed ────────────")

print(variable_renamed_codes[0])

```

────────────────────────────────────────────────────────────────────────

▣ 활용 및 수정 가이드

────────────────────────────────────────────────────────────────────────

1. “add_random_prints”, “rename_functions” 등 함수의 이름이나 로직을 원하는 대로 변경하여 사용하실 수 있습니다.

2. 샘플링 개수(num_samples = 100)는 적절히 조정 가능하며, shuffle 뒤 .select()를 사용하면 앞에서부터 원하는 개수만큼 쉽게 가져올 수 있습니다.

3. AST 파싱(예: ast 모듈, libcst, redbaron, parso 등)을 사용하면, 좀 더 정교하게 함수명/변수명을 변환할 수 있습니다.

4. 저장 시에는 print_injected_codes, function_renamed_codes 등 4개의 리스트를 각각 파일로 쓰거나, 하나의 CSV/JSON 파일로 만들어서 관리할 수 있습니다.

위와 같은 코드 구조를 활용하면, Jupyter Notebook 환경에서 손쉽게 100여 개의 코드 예시를 추출한 뒤, 필요에 따라 다양한 조작(주석 삽입, 함수명 변경, 변수명 변경, print문 추가 등)을 한 결과를 따로 저장하여 비교·분석할 수 있습니다.

 

 

728x90