비정형 데이터
고친 사람 github-actions[bot]
비정형 데이터는 데이터베이스의 표에 칸을 나눠 넣을 수 없는 데이터를 가리킵니다. 고객이 자유롭게 써 보낸 문의 글이 그렇습니다. 글 속에 「환불해 달라」는 뜻이 있어도 그 뜻을 담는 칸은 따로 없습니다. 그래서 이 데이터를 쓰는 일은 대개 그 안의 뜻을 뽑아내는 데서 시작합니다.
쉽고 빠른 이해
무슨 일을 하는 말인가 — 정해진 칸 없이 쌓이는 데이터를 한데 묶어 부르는 말입니다. 문의 글, 상품 사진, 상담 통화 녹음이 다 여기 듭니다.
왜 따로 부르나 — 칸이 정해진 데이터는 「주문 상태가 환불인 것」처럼 조건 하나로 골라냅니다. 칸이 없는 데이터에는 그 방법이 안 통합니다. 다루는 도구가 다르니 이름을 갈라 부릅니다.
어떻게 다루나
- 원본 파일은 지우지 않고 파일 저장소에 둡니다
- 프로그램이 글을 읽거나 사진 속 글씨를 읽어 뜻을 뽑아냅니다
- 뽑은 결과를 표의 칸이나 검색용 색인에 넣고 거기서 찾습니다
대가 — 뜻을 뽑는 데 계산이 많이 듭니다. 뽑은 결과가 틀릴 수도 있습니다. 들어오는 값을 막아 주는 검사도 없어서 잘못된 파일도 쌓입니다.
언제 쓰나 — 칸으로 받을 수 있는 것은 칸으로 받습니다. 미리 정할 수 없는 말만 글로 받습니다.
상세
이 절은 비정형 데이터가 정형 데이터와 어디서 갈리는지부터 봅니다. 그다음 이 데이터를 어떻게 쓸 수 있게 만들고 어디에 두는지를 고객 문의 글 하나를 따라가며 봅니다.
신청서와 손편지
주민센터 신청서에는 이름 칸과 주소 칸이 인쇄돼 있습니다. 그래서 신청서 천 장에서 주소만 모으기는 쉽습니다. 손편지에도 이름과 주소가 들어 있지만 어디에 적힐지는 아무도 정하지 않았습니다. 손편지 천 통에서 주소를 모으려면 한 통씩 읽어야 합니다.
칸이 정해진 데이터
데이터베이스의 표는 신청서를 닮았습니다. 표에 어떤 열이 있고 열마다 무슨 값이 들어가는지를 미리 정해 둡니다. 이 약속을 스키마라고 부릅니다.
스키마를 따르는 데이터를 정형 데이터라고 부릅니다. 주문 표의 행 하나는 주문 번호와 금액과 주문 상태를 늘 같은 열에 담습니다. 그래서 「주문 상태가 환불인 주문」을 조건 하나로 골라낼 수 있습니다.
칸이 없는 데이터
비정형 데이터는 손편지 쪽입니다. 스키마가 없어서 어느 부분에 무슨 정보가 들었는지 미리 정해져 있지 않습니다.
고객 문의 글 하나를 보겠습니다. 「택배가 일주일째 안 와요. 그냥 돈 돌려받고 싶어요.」 사람은 이 글이 배송 지연이고 환불 요청이라는 것을 바로 압니다. 그런데 글 어디에도 「요청 종류: 환불」이라는 칸은 없습니다.
글만 그런 것이 아닙니다. 사진과 소리와 영상도 비정형 데이터입니다. 종류마다 예와 그 안에 든 정보를 나란히 놓으면 아래와 같습니다.
| 종류 | 예 | 안에 든 정보 |
|---|---|---|
| 글 | 문의 글 · 이메일 · 계약서 | 요청 내용 · 감정 · 조항 |
| 이미지 | 상품 사진 · 스캔한 영수증 | 물건의 모양 · 영수증 금액 |
| 소리 | 상담 통화 녹음 | 오간 말 · 목소리의 높낮이 |
| 영상 | 매장 방범 카메라 영상 | 드나든 사람 수 |
표의 오른쪽 열이 이 데이터의 쓸모입니다. 정보는 분명히 들어 있습니다. 그 정보를 꺼내는 방법이 정해져 있지 않을 뿐입니다.
파일 포맷과 내용의 구조
비정형이라고 해서 파일이 아무렇게나 생긴 것은 아닙니다. 사진 파일도 문서 파일도 바이트를 어떤 순서로 적을지 엄격하게 정해져 있습니다. 이 규칙을 파일 포맷이라고 부릅니다.
비정형은 파일 포맷이 아니라 내용을 두고 하는 말입니다. 사진 파일의 포맷을 알면 화면에 사진을 그릴 수는 있습니다. 그래도 사진 속 물건이 신발인지 가방인지는 어느 칸에도 적혀 있지 않습니다.
파일 바깥에는 칸이 정해진 정보가 붙어 있기도 합니다. 파일 이름, 크기, 만든 시각, 사진을 찍은 기기 같은 것입니다. 이렇게 데이터를 설명하는 데이터를 메타데이터라고 부릅니다. 메타데이터로 「어제 올라온 사진」은 고를 수 있습니다. 「신발 사진」은 못 고릅니다.
정형과 비정형 사이
둘 사이에 걸친 데이터도 있습니다. JSON(JavaScript Object Notation) 문서나 XML(eXtensible Markup Language) 문서는 값마다 이름표가 붙어 있습니다. 그래서 프로그램이 status 라는 이름표를 따라가 그 값을 읽어 낼 수 있습니다.
그렇다고 표처럼 모든 데이터가 같은 칸을 갖지는 않습니다. 어떤 문서에는 phone 이 있고 어떤 문서에는 없습니다. 이런 데이터를 반정형 데이터라고 부릅니다. 서버가 남기는 로그도 흔히 여기 듭니다.
아래 표는 세 갈래를 구조가 적힌 곳으로 견줍니다.
| 정형 | 반정형 | 비정형 | |
|---|---|---|---|
| 구조가 적힌 곳 | 표의 스키마 | 데이터 안의 이름표 | 없음 |
| 예 | 주문 표의 행 | JSON 문서 · 로그 한 줄 | 문의 글 · 사진 · 녹음 |
| 원하는 것을 고르는 법 | 조건으로 바로 | 이름표를 따라가서 | 뜻을 먼저 뽑아서 |
맨 아래 줄이 이 구분을 두는 까닭입니다. 데이터가 어느 갈래인지 알아야 그것을 찾고 셀 도구를 고를 수 있습니다.
경계가 늘 깔끔하지는 않습니다. JSON 문서의 memo 칸에 고객이 쓴 긴 글이 들었다고 해 봅시다. 칸은 이름표가 붙어 있어도 그 안의 글은 비정형입니다. 그래서 파일 하나를 통으로 판정하기보다 꺼내려는 정보가 칸에 들어 있는지를 봅니다.
조건 검색이 놓치는 글
정형 데이터에서 원하는 행을 고르는 도구는 SQL(Structured Query Language)의 조건입니다. 비정형 글에도 어떤 글자가 들었는지를 보는 조건은 걸 수 있습니다. 앞의 문의 글 한 건으로 해 보겠습니다.
-- body = '…그냥 돈 돌려받고 싶어요.'
SELECT count(*) FROM inquiry
WHERE body LIKE '%환불%'; -- 0
LIKE '%환불%' 은 글 안에 「환불」이라는 글자가 있는지만 봅니다. 이 고객은 「환불」 대신 「돈 돌려받고」라고 썼습니다. 그래서 환불 요청인데도 세어지지 않습니다.
반대로 「환불은 안 해도 되니 빨리만 보내 주세요」는 세어집니다. 글자는 맞았습니다. 뜻은 반대입니다. 비정형 데이터를 다루는 일은 이 틈을 메우는 일입니다.
뜻을 뽑아 칸으로 옮기는 처리
틈을 메우는 방법은 한 줄로 모입니다. 원본에서 뜻을 뽑아 표의 칸이나 색인으로 옮깁니다. 색인은 나중에 빨리 찾으려고 원본과 따로 만들어 두는 목록입니다.
뽑는 방법은 무엇을 하고 싶은지와 데이터 종류에 따라 다릅니다. 아래에서는 문의 글을 먼저 보고 사진과 소리를 뒤에 봅니다.
글을 낱말로 찾고 싶으면 먼저 글을 낱말 단위로 쪼갭니다. 이 일이 토큰화입니다. 쪼개 두어야 「배송」이라는 낱말이 어느 글에 나왔는지 셀 수 있습니다.
쪼갠 낱말마다 그 낱말이 나온 글의 목록을 적어 둡니다. 이 목록이 역색인입니다. 책 뒤의 찾아보기처럼 낱말에서 글로 바로 건너갈 수 있습니다. 이렇게 낱말로 글을 찾는 일이 전문 검색입니다.
글자가 아니라 뜻으로 찾고 싶으면 임베딩을 씁니다. 임베딩은 글 하나를 숫자 목록 하나로 바꾸는 일입니다. 바꾸는 일은 머신러닝 모델이 맡습니다. 모델은 많은 글로 미리 학습시켜 글을 숫자로 바꿔 주는 프로그램입니다.
이 숫자 목록을 벡터라고 부릅니다. 뜻이 비슷한 글은 비슷한 벡터가 됩니다. 찾는 말도 벡터로 바꾼 뒤 그와 가까운 벡터를 가진 글을 고르는 일이 벡터 검색입니다. 그래서 「환불」로 찾아도 「돈 돌려받고」가 걸릴 수 있습니다.
글마다 갈래를 골라 표의 열에 적을 수도 있습니다. 모델이 문의 글을 읽고 「환불 요청」과 「배송 문의」 가운데 하나를 고르는 식입니다. 이 일이 분류입니다. 고른 값을 열에 넣고 나면 그 열은 정형 데이터처럼 조건으로 셉니다.
사진과 소리는 대개 글로 먼저 바꿉니다. 사진 속 글씨를 읽어 글자로 바꾸는 일이 광학 문자 인식입니다. 통화 녹음을 글로 받아 적는 일은 음성 인식입니다. 글이 되고 나면 앞의 방법을 그대로 씁니다.
글로 바꿀 수 없는 정보도 있습니다. 사진 속 물건이 신발인지 가방인지는 글씨가 아니라 모양에 들어 있습니다. 이런 정보를 그림에서 읽어 내는 분야가 컴퓨터 비전입니다. 읽어 낸 「신발」이나 「가방」도 표의 열에 적으면 조건으로 셉니다.
아래 그림은 이 절의 길을 한데 모은 것입니다. 어느 길로 가든 끝에는 표의 칸이나 색인(역색인 · 벡터)이 남습니다.
flowchart TD
P["사진"] -->|광학 문자 인식| B["글"]
S["통화 녹음"] -->|음성 인식| B
P -->|컴퓨터 비전| F["물건 종류 열 · 조건으로 세기"]
B -->|토큰화| C["역색인 · 낱말로 찾기"]
B -->|임베딩| D["벡터 · 뜻으로 찾기"]
B -->|분류| E["요청 종류 열 · 조건으로 세기"]
원본 파일과 뽑은 결과의 보관
비정형 데이터는 대개 크기가 큽니다. 사진 한 장이 주문 표의 행 하나보다 훨씬 무겁습니다. 그래서 원본은 파일 그대로 파일 저장소에 두는 경우가 많습니다. 데이터베이스에는 파일이 놓인 경로와 메타데이터만 한 행으로 적습니다.
파일 저장소로는 파일 시스템과 객체 저장소를 흔히 씁니다. 객체 저장소는 큰 파일을 이름 하나로 넣고 꺼내는 저장소입니다.
뽑아낸 결과는 원본과 따로 둡니다. 분류 결과는 표의 열로 갑니다. 역색인은 검색 엔진에 둡니다. 검색 엔진은 역색인을 들고 낱말 검색을 해 주는 프로그램입니다.
벡터는 벡터 데이터베이스에 둡니다. 가까운 벡터를 빨리 찾아 주도록 만든 데이터베이스입니다.
원본은 뽑은 뒤에도 지우지 않습니다. 뽑는 방법이 나중에 바뀌기 때문입니다. 더 나은 모델이 나오면 같은 원본에서 다시 뽑을 수 있습니다. 원본을 지웠다면 예전에 뽑은 결과가 가진 전부입니다.
원본을 지우지 않고 모으다 보면 원본만 모아 두는 곳이 따로 생깁니다. 여러 원천의 원본을 모양 그대로 한곳에 모아 두는 저장소가 데이터 레이크입니다. 표에 맞춰 손질하는 일은 넣을 때가 아니라 꺼내 쓸 때 합니다.
비정형 데이터를 다루는 비용
첫째 비용은 계산입니다. 글을 쪼개고 모델에 넣는 일은 조건 하나로 행을 고르는 일보다 계산을 훨씬 많이 씁니다. 데이터가 늘면 이 비용도 함께 늘어납니다.
둘째는 틀릴 수 있다는 점입니다. 분류 모델은 「환불은 안 해도 되니」를 환불 요청으로 잘못 고를 수 있습니다. 표에 적힌 값을 고르는 조건과 달리 뽑아낸 값에는 늘 오류가 섞입니다. 그래서 뽑은 결과 가운데 일부를 사람이 골라 확인하는 일이 따라붙습니다.
셋째는 들어오는 값을 검사하기 어렵다는 점입니다. 스키마는 문지기 노릇을 합니다. 금액 열에 글자를 넣으려 하면 저장이 거절됩니다. 비정형 데이터에는 이런 문지기가 없어서 깨진 파일이나 빈 파일도 쌓입니다. 이렇게 쌓인 데이터를 믿을 수 있는지가 데이터 품질의 문제입니다.
넷째는 개인정보입니다. 문의 글에는 고객이 직접 쓴 전화번호나 주소가 섞여 들어옵니다. 어느 칸에 있는지 정해져 있지 않으니 찾아서 가리기도 어렵습니다.
칸으로 받을지 글로 받을지
비정형 데이터는 대개 받는 순간에 생깁니다. 문의 화면에 글 상자 하나만 두면 고객이 하고 싶은 말이 전부 그 글 상자로 들어옵니다.
칸으로 받을 수 있는 정보를 칸으로 받으면 뜻을 뽑는 단계가 사라집니다. 문의 화면에 「요청 종류」 선택 상자를 두면 고객이 「환불」을 직접 고릅니다. 그 값은 처음부터 정형 데이터입니다.
모든 것을 칸으로 받을 수는 없습니다. 고객이 무슨 말을 하고 싶을지 미리 다 알 수 없기 때문입니다. 그래서 흔히 둘을 함께 둡니다. 요청 종류는 선택 상자로 받습니다. 나머지는 그 아래 글 상자로 받습니다.
관련 항목
비정형 데이터와 맞세워지는 데이터 갈래
정형 데이터 · 반정형 데이터 · 스키마 · 관계형 데이터베이스 · 테이블 · JSON · XML · 로그
비정형 데이터의 하위 종류
이미지 · 오디오 · 동영상 · 이메일 · 자연어
비정형 데이터에서 뜻을 뽑는 기법
토큰화 · 자연어 처리 · 분류 · 임베딩 · 광학 문자 인식 · 음성 인식 · 컴퓨터 비전 · 머신러닝 · 대규모 언어 모델
비정형 데이터를 찾는 검색 방식
검색 · 색인 · 전문 검색 · 역색인 · 벡터 · 벡터 검색 · 시맨틱 검색 · 검색 엔진
비정형 데이터를 모으고 보관하는 저장소
객체 저장소 · 파일 시스템 · 데이터 레이크 · 데이터 웨어하우스 · 벡터 데이터베이스 · 문서 데이터베이스 · BLOB · ELT
비정형 데이터에 따라붙는 관리 과제
다른 이름: unstructured data · 비구조화 데이터 · 비정형 자료