2222
03/08/2026
import java.io.*;
import java.util.*;
import com.fasterxml.jackson.databind.*;
public class ColumnSplitter {
public static void main(String[] args) throws Exception {
String inputFile = "input.csv";
BufferedReader br = new BufferedReader(new FileReader(inputFile));
ObjectMapper mapper = new ObjectMapper();
String line;
while ((line = br.readLine()) != null) {
String[] cols = line.split(",");
String col1 = cols[0];
String col2 = cols[1]; // { }
String col3 = cols[2]; // [ ]
// -------- col2 {} 분해 --------
Map<String, Object> map = mapper.readValue(col2, Map.class);
for (Map.Entry<String, Object> entry : map.entrySet()) {
System.out.println(col1 + "," + entry.getKey() + "," + entry.getValue());
}
// -------- col3 [] 분해 --------
List<Object> list = mapper.readValue(col3, List.class);
for (Object item : list) {
System.out.println(col1 + "," + item + "," + item);
}
}
br.close();
}
}
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.0</version>
</dependency>
회사
import java.io.*;
import java.util.*;
public class SemanticChunkParser {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new FileReader("data.csv"));
String line;
while ((line = br.readLine()) != null) {
String[] cols = line.split("\t"); // 탭 구분
String id = cols[0];
String types = cols[1];
String chunks = cols[3];
// { } 제거
types = types.replace("{", "").replace("}", "");
String[] typeList = types.split(",");
// [ ] 제거
chunks = chunks.replace("[", "").replace("]", "");
String[] chunkList = chunks.split(",");
for (String type : typeList) {
for (String chunk : chunkList) {
System.out.println(
id + "\t" +
type.trim() + "\t" +
chunk.trim()
);
}
}
}
br.close();
}
}
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.List;
public class SemanticChunkParser {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new FileReader("data.csv"));
ObjectMapper mapper = new ObjectMapper();
String line;
while ((line = br.readLine()) != null) {
String[] cols = line.split("\t");
String id = cols[0];
String types = cols[1];
String chunkJson = cols[3];
// { } 제거
types = types.replace("{", "").replace("}", "");
String[] typeList = types.split(",");
// JSON array → List
List<String> chunks =
mapper.readValue(chunkJson, new TypeReference<List<String>>() {});
for (String type : typeList) {
for (String chunk : chunks) {
System.out.println(
id + "\t" +
type.trim() + "\t" +
chunk
);
}
}
}
br.close();
}
}
Semantic Chunking 기반 텍스트 분할 및 추출 과정
본 과정은 EST 연구개발서(260209.json)로부터 추출된 비정형 데이터를 기반으로 의미 단위(Semantic Unit)의 텍스트를 생성하기 위한 전처리 단계이다. 문서 내 다양한 타입의 콘텐츠(text, table, image, number 등)를 구조적으로 정리한 후, 검색 및 활용이 가능한 의미 기반 문장 단위로 분할하는 것을 목표로 한다.
우선 원본 JSON 데이터에서 문서 구성 요소별 타입 정보를 기준으로 텍스트 데이터를 추출하였다. 해당 단계에서는 문서 파싱을 통해 text, table, image, number 등 다양한 타입의 데이터를 식별하고, 텍스트 기반 처리가 가능한 항목을 중심으로 분석 대상 데이터를 선별하였다.
다음 단계에서는 규칙 기반(Rule-based) 분할 방식을 적용하여 문서를 1차적으로 분리하였다. 문단 구분, 문장 종결 기호, 번호 체계, 표 구조 등 문서 구조적 특징을 기준으로 텍스트를 분리함으로써, 원본 문서의 의미적 흐름을 유지하면서도 처리 가능한 단위로 데이터를 정리하였다.
이후 텍스트 데이터에 포함된 typographical 요소(기호, 특수문자, 불필요한 공백 등) 및 고정 패턴을 정규화하는 과정을 수행하였다. 이를 통해 문서 내 노이즈 요소를 제거하고, 동일한 표현 체계를 유지하도록 전처리를 진행하였다. 해당 단계는 이후 의미 기반 분할 과정에서 발생할 수 있는 오류를 최소화하기 위한 정제 과정에 해당한다.
정제된 텍스트는 Semantic Chunking 기법을 활용하여 의미 단위 기반으로 최종 분할되었다. Semantic Chunking은 단순 문장 분할이 아닌 문맥적 연관성을 고려하여 텍스트를 그룹화하는 방식으로, 하나의 의미 단위를 구성하는 문장들을 하나의 Chunk로 구성하도록 설계하였다. 이 과정에서 문단 구조와 문장 간 의미적 연결성을 고려하여 적절한 Chunk 크기를 유지하도록 조정하였다.
최종적으로 생성된 Semantic Chunk는 List<String> 형태의 데이터 구조로 저장되며, 각 Chunk는 독립적인 의미 단위 텍스트로 구성된다. 이러한 구조는 이후 검색 기반 시스템(RAG), 문서 질의응답, 벡터 인덱싱 등의 단계에서 효율적으로 활용될 수 있도록 설계되었다.
본 과정은 문서 내 의미적 맥락을 최대한 보존하면서도 데이터 처리 및 검색 효율성을 확보하기 위한 전처리 파이프라인으로, 비정형 연구 문서를 구조화된 지식 데이터로 변환하는 핵심 단계에 해당한다.
1️⃣ 3줄 요약 (PPT용)
Semantic Chunking 기반 문서 전처리 과정
JSON 기반 연구개발 문서에서 text, table 등 텍스트 데이터를 추출하여 분석 대상 데이터를 구성하였다.
문서 구조 및 규칙 기반 분할을 통해 문단 및 문장 단위로 데이터를 정제하고 의미 단위로 재구성하였다.
최종적으로 의미 기반 Semantic Chunk를 생성하여 검색 및 AI 질의응답 시스템에서 활용 가능한 형태로 변환하였다.
2️⃣ AI / RAG 연결 설명 (연구보고서용)
본 연구에서는 대규모 문서 데이터를 효율적으로 활용하기 위해 Semantic Chunking 기반의 텍스트 전처리 방식을 적용하였다. 원본 연구개발 문서는 JSON 구조로 저장되어 있으며, 문서 내에는 text, table, image, number 등 다양한 형태의 데이터가 포함되어 있다. 이 중 AI 기반 분석이 가능한 텍스트 데이터를 중심으로 추출 및 정제 과정을 수행하였다.
추출된 텍스트는 규칙 기반 문서 분할 및 전처리 과정을 통해 문장 및 문단 단위로 정리되었으며, 이후 의미 기반 Semantic Chunking을 적용하여 문맥적으로 연관된 문장들을 하나의 의미 단위로 구성하였다. 이를 통해 문서의 의미적 흐름을 유지하면서도 AI 모델이 효율적으로 처리할 수 있는 적절한 크기의 텍스트 단위를 생성하였다.
생성된 Semantic Chunk는 List<String> 형태로 관리되며, 각 Chunk는 독립적인 의미 단위를 가지는 텍스트 데이터로 구성된다. 이러한 구조는 이후 벡터 임베딩(Vector Embedding) 및 벡터 데이터베이스(Vector DB) 구축 과정에서 활용되며, Retrieval-Augmented Generation(RAG) 기반 질의응답 시스템에서 검색 정확도를 향상시키는 핵심 데이터 단위로 사용된다.
특히 Semantic Chunk 단위로 문서를 분할함으로써 기존 문서 단위 검색 방식 대비 보다 정밀한 정보 검색이 가능하며, 질의와 의미적으로 가장 유사한 텍스트 조각을 선택하여 AI 모델의 응답 생성 품질을 향상시킬 수 있다. 따라서 본 Semantic Chunking 과정은 비정형 문서를 AI 기반 지식 검색 시스템에 활용하기 위한 핵심 전처리 단계로 활용된다.
💡 참고로 지금 작성한 내용은 딱 이런 문서에서 쓰는 스타일이야
AI 프로젝트 연구보고서
RAG 구축 보고서
PoC 결과 보고서
사내 기술 문서
원하면 내가 지금 너 문서 기준으로 추가로 만들어 줄게
1️⃣ Semantic Chunking 처리 흐름도 (보고서 그림 설명)
2️⃣ RAG 전체 파이프라인 설명 (Chunk → Embedding → VectorDB → Retrieval → LLM)
3️⃣ 한 페이지짜리 PPT 슬라이드 완성본
이거 만들면 보고서 퀄리티 진짜 확 올라가.