본문 바로가기
Python

[Python] JSON 구조 데이터 전처리 하기 (필드 정리)

by teamnova 2025. 6. 11.
728x90

 

오늘은 JSON 구조로 되어있는 데이터를 파이썬으로 전처리하는 과정을 다뤄보겠습니다. 

TTS 전사 데이터, 크롤링 데이터, 로그 파일 등 다양한 곳에 활용할 수 있습니다. 

 

 

JSON 데이터 

JSON(JavaScript Object Notation)은 사람도 읽기 쉬우면서, 기계도 쉽게 파싱 가능한 데이터 포맷입니다.
웹 API, AI 학습 데이터, 설정 파일 등 거의 모든 분야에서 표준처럼 사용되고 있습니다. 

 

가장 큰 특징으로는 key-value 구조라는 점입니다.

딕셔너리처럼 "key": value 쌍으로 구성되어 있으며, 값으로는 문자열, 숫자, 리스트, 객체 등 다양한 타입이 들어갈 수 있습니다.

 

또한 텍스트 기반 데이터이기 때문에 `.json`, `.jsonl` 파일 형태로 저장되며, 텍스트 에디터에서도 쉽게 내용을 확인할 수 있습니다. 파이썬, 자바스크립트, 자바 등 대부분의 프로그래밍 언어에서 쉽게 파싱할 수 있는 유연한 구조입니다.

 

JSON 데이터 예시 

{
  "audio_filepath": "data/001.wav",
  "text": "안녕하세요.",
  "speaker": "female_01",
  "emotion": "neutral"
}

 

위처럼 다양한 필드를 담을 수 있어서 TTS 전사 데이터, 크롤링 결과, 로그 이벤트, 설정 파일 등 어떤 데이터를 다룰 때도 잘 맞는 구조입니다. 

 

JSON 전처리

살펴본 바와 같이 JSON은 key-value 쌍으로 이루어져 있어,
데이터가 많아질수록 일관된 방식으로 필드를 관리하고 전처리하는 작업이 중요해집니다.

그렇다면 JSON 데이터가 길어졌을 때, 이를 간편하게 관리하고 필요한 필드만 추출하거나 텍스트 정제를 하려면 어떻게 해야 할까요?

이제부터는 Python 코드로 JSON 데이터를 전처리하는 방법을 살펴보겠습니다.

 

 

1) 예제 json 데이터 

{"type": "train", "name": "001", "audio_filepath": "wavs/001.wav", "text": "안녕하세요. 반갑습니다!", "speaker": "male_01", "emotion": "neutral"}
{"type": "eval", "name": "002", "audio_filepath": "wavs/002.wav", "text": "지금 몇 시예요?", "speaker": "female_01", "emotion": "curious"}
{"type": "train", "name": "003", "audio_filepath": "wavs/003.wav", "text": "오늘 날씨 정말 좋네요 :)", "speaker": "male_02", "emotion": "happy"}

 

 

 

2) 예제 데이터 전처리 하기 

import json
import re

# 1. 데이터 불러오기 (jsonl 형식: 한 줄당 하나의 JSON)
def load_jsonl(path):
    with open(path, 'r', encoding='utf-8') as f:
        return [json.loads(line) for line in f]

# 2. 간단한 텍스트 전처리 함수
def clean_text(text):
    # 특수문자 제거 + 공백 정리
    text = re.sub(r"[^\w\s가-힣]", "", text)
    text = re.sub(r"\s+", " ", text).strip()
    return text

# 3. 예제 처리
def preprocess_data(jsonl_path):
    data = load_jsonl(jsonl_path)
    
    processed = []
    for item in data:
        if item.get("type") == "train":
            new_item = {
                "audio": item.get("audio_filepath"),
                "text": clean_text(item.get("text")),
                "speaker": item.get("speaker", "unknown")
            }
            processed.append(new_item)
    
    return processed

# 4. 실행 예시
if __name__ == "__main__":
    result = preprocess_data("data/metadata.jsonl")
    print(result[:3])  # 앞에서 3개만 확인

 

위 예제는 `type`이 `"train"`인 항목만 추출하고,  
`text` 필드는 공백 정리 및 특수 문자 제거를 통해 전처리한 뒤,  
불필요한 필드를 제외하고 필요한 필드(`audio`, `text`, `speaker`)만 남겨 새로운 JSON 구조로 가공하는 과정입니다.

 

 

3) 출력 결과 

[
    {
        "audio": "wavs/001.wav",
        "text": "안녕하세요 반갑습니다",   # 특수문자 제거됨
        "speaker": "male_01"
    },
    {
        "audio": "wavs/003.wav",
        "text": "오늘 날씨 정말 좋네요",   # 이모티콘 제거됨
        "speaker": "male_02"
    }
]

 

 

  • type == "train"인 항목만 남김 (중간의 "eval" 항목은 제외)
  • text 필드는 clean_text() 함수에 따라:
    • 특수문자 (!, :, )) 제거됨
    • 공백 정리
  • speaker와 audio_filepath는 그대로 복사
  • emotion, name, type 같은 필드는 버려짐

 

 

이처럼 JSON 데이터를 필터링하고 텍스트 전처리를 적용하면,  
TTS나 기타 AI 데이터 준비 과정에서 훨씬 깔끔한 입력을 만들 수 있습니다.

다음에는 전처리된 데이터를 저장하거나 분할(train/val/test)하는 방법도 다뤄보겠습니다 :)  
감사합니다!