텍스트 데이터 속 숨겨진 오염
텍스트 데이터는 보이는 것만큼 깨끗한 적이 없습니다. 웹 페이지에서 복사하면 숨겨진 서식 문자가 따라옵니다. 스프레드시트에서 내보내면 줄 바꿈이 들쭉날쭉합니다. 사용자에게 텍스트를 받으면 스마트 따옴표, 제로 너비 공백, 악센트 문자, 이모지가 뒤섞여 들어옵니다. 이런 보이지 않는 오염물질이 문자열 비교를 깨뜨리고, DB 쿼리를 오류 내고, 내 컴퓨터에서는 잘 되는데 프로덕션에서만 실패하는 미스터리 버그를 만듭니다.
텍스트 데이터 정리는 화려한 작업이 아니지만 필수적입니다. 아래 기법들은 가장 흔한 문제를 다루며, 순서대로 적용하면 지저분한 입력을 일관된 텍스트로 변환할 수 있습니다.
1. 줄 바꿈 통일
운영체제마다 줄 바꿈 규칙이 다릅니다. Windows는 CRLF(\r\n), Unix/macOS는 LF(\n), 구형 Mac은 CR(\r)을 사용합니다. 여러 출처의 텍스트가 합쳐지면 줄 바꿈이 섞여서 파싱 오류, 줄 수 오류, 표시 문제가 발생합니다.
해결은 간단합니다. 모든 줄 바꿈을 LF 하나로 통일하세요. 다른 작업(줄 수 세기, 분할, 중복 제거)이 일관된 줄 바꿈에 의존하므로, 이것이 모든 텍스트 정리의 첫 단계여야 합니다.
2. 보이지 않는 문자 제거
유니코드에는 공백과 탭 외에도 수십 가지 보이지 않는 문자가 있습니다. 제로 너비 공백(U+200B), 제로 너비 결합자(U+200D), 바이트 순서 표시(U+FEFF), 소프트 하이픈(U+00AD) 등이 대부분의 편집기에서 보이지 않은 채 텍스트에 숨어 있을 수 있습니다.
이 문자들은 화면에서 같아 보이는 문자열이 실제로는 다른 문제를 일으킵니다. UI에서 똑같이 보이는 두 이름이 동일성 검사에 실패합니다. URL이 정확해 보이는데 경로에 보이지 않는 문자가 있어서 작동하지 않습니다.
3. 공백 정규화
사용자가 스페이스를 여러 번 입력합니다. 복사-붙여넣기로 깨지지 않는 공백(U+00A0)이 들어옵니다. 탭과 스페이스가 섞여서 정렬이 어긋납니다. 줄 앞뒤의 공백이 조용히 쌓입니다.
공백 정규화란: 깨지지 않는 공백을 일반 공백으로 교체하고, 연속된 공백을 하나로 합치고, 각 줄의 앞뒤 공백을 제거하고, 탭과 스페이스를 용도에 맞게 통일하는 것입니다.
4. 중복 줄 제거
데이터 내보내기, 로그 파일, 수집된 텍스트에는 정확히 같은 줄이 반복되는 경우가 많습니다. 중복을 제거할 때는 원래 순서를 보존하는 것이 중요합니다. 단순 정렬 후 중복 제거는 순서가 있는 데이터의 의미를 바꿔 버립니다.
공백이나 대소문자만 다른 유사 중복을 처리할 때는 비교 전에 정규화하되, 출력은 원본 버전을 사용하세요.
5. 빈 줄 제거
붙여 넣은 텍스트나 내보낸 데이터에는 연속된 빈 줄이 흔합니다. 모든 빈 줄을 제거하거나 연속된 빈 줄을 하나로 합치면 문단 구조를 유지하면서 텍스트가 깔끔해집니다.
빈 것처럼 보이지만 공백이 포함된 줄에 주의하세요. 줄을 먼저 트림한 다음 진짜 빈 줄을 제거하세요.
6. HTML 태그 제거
웹 페이지에서 스크래핑하거나 리치 텍스트 편집기에서 복사한 텍스트에는 HTML 마크업이 섞여 있는 경우가 많습니다. 기본적인 태그 제거는 < 와 > 사이의 모든 것을 제거하는 정규식으로 대부분 처리됩니다.
태그 제거 후 남아 있는 HTML 엔티티(&를 &로, <를 <로 등)도 디코딩해서 깨끗한 일반 텍스트를 만드세요.
7. 악센트 문자 정규화
다국어 텍스트에서 악센트 문자는 여러 유니코드 형태로 존재할 수 있습니다. "é"가 단일 코드 포인트(U+00E9)일 수도 있고, e + 결합 악센트 두 코드 포인트일 수도 있습니다. 화면에서는 같아 보이지만 바이트가 다르기 때문에 문자열 매칭과 정렬이 깨집니다.
유니코드 정규화(NFC 또는 NFD)로 일관된 표현을 보장합니다. NFC는 가능한 곳에서 문자를 합성하며 데이터 저장에 가장 흔히 사용됩니다.
슬러그, 파일명, 식별자처럼 ASCII만 필요한 경우에는 악센트를 완전히 제거(é→e, ñ→n, ü→u)할 수 있지만, 정보 손실이 있으므로 주의해서 사용하세요.
8. 특수 문자 제거
검색 인덱싱용 데이터 정리, 머신러닝을 위한 텍스트 전처리, URL 슬러그 생성 등 맥락에 따라 구두점이나 기호를 제거해야 할 수 있습니다.
제거 대상을 신중하게 정하세요. 이메일 주소가 포함된 텍스트에서 구두점을 전부 없애면 @가 사라집니다. 전화번호에서 하이픈을 제거하면 의미가 달라집니다. 다음 단계에서 필요한 문자가 무엇인지 정확히 파악한 후 제거하세요.
9. 인코딩 문제 수정
모지바케 — 인코딩 불일치로 인한 글자 깨짐 — 는 여전히 흔한 문제입니다. UTF-8로 인코딩된 텍스트를 Latin-1로 해석하면 특유의 패턴이 나타납니다. 원래 인코딩을 파악할 수 있다면 이 패턴은 복구 가능합니다.
예방이 최선입니다. 텍스트 파일을 읽고 쓸 때 항상 인코딩을 명시하고, UTF-8을 기본으로 사용하며, 데이터 파이프라인 초반에 인코딩 가정을 검증하세요.
10. 이모지 제거 또는 대체
이모지는 멀티바이트 유니코드 시퀀스로, 기본 텍스트만 기대하는 시스템에서 문제를 일으킵니다. 일부 DB는 첫 이모지에서 텍스트를 잘라버리고, 일부 API는 이모지가 포함된 페이로드를 거부하고, 표시 시스템마다 렌더링이 달라집니다.
이모지를 깨끗하게 제거하려면 가족 이모지, 피부색 수정자 등 여러 유니코드 코드 포인트에 걸친 다중 문자 시퀀스까지 처리해야 합니다.
정리 파이프라인 구축
작업 순서가 중요합니다. 권장 순서:
1. 인코딩 문제 먼저 수정 (나머지 모든 것이 올바른 인코딩에 의존) 2. 줄 바꿈 통일 3. 보이지 않는 문자 제거 4. 공백 정규화 및 줄 트림 5. 빈 줄 제거 6. 내용별 정리 적용 (HTML 태그, 특수 문자, 악센트) 7. 필요 시 중복 제거
각 단계가 다음 단계에 더 깨끗한 입력을 제공합니다. 순서가 잘못되면 — 예를 들어 공백 정규화 전에 중복을 제거하면 — 공백만 다른 줄이 중복으로 인식되지 않아 결과가 나빠집니다.
원본 데이터는 그대로 보관하고 정리된 출력을 별도로 만드세요. 텍스트 정리는 항상 되돌릴 수 있는 게 아니며, 요구 사항은 바뀝니다. 원시 소스가 있으면 필요에 따라 파이프라인을 조정하고 다시 실행할 수 있습니다.