문자 빈도 분석 및 시각화 도구
문자 빈도 분석 및 시각화 도구는 입력한 텍스트에서 각 문자가 몇 번 나타나는지 세어 그 분포를 막대 차트로 시각화한다. 결과는 고전 암호 해독, 허프만 코딩 같은 데이터 압축 알고리즘 설계, 언어별 문자 사용 패턴 분석 등 다양한 분야에서 활용할 수 있다.
문자 빈도 분석
문서화
문자 빈도 분석이란 무엇인가?
문자 빈도 분석은 텍스트에서 각 문자가 몇 번 나타나는지 세는 과정입니다. 여기에는 문자, 숫자, 공백, 구두점 및 텍스트에 포함된 다른 모든 기호가 포함됩니다. 결과는 문자 하나와 개수 하나로 이루어진 간단한 표 또는 차트입니다.
이 도구는 붙여넣거나 입력한 모든 텍스트의 문자를 자동으로 셉니다. 고유한 문자를 각각의 개수와 함께 나열하고 막대그래프를 그려, 가장 흔한 문자를 한눈에 알아볼 수 있습니다.
이 기법은 오래되었습니다. 아랍 학자 알킨디는 서기 850년경 단순한 암호를 푸는 방법으로 이를 설명했습니다. 오늘날에는 데이터 압축, 철자 및 인코딩 검사, 기본적인 언어 식별에도 쓰입니다.
문자 빈도를 계산하는 방법
문자 빈도를 손으로 계산하는 과정은 세 단계로 이루어집니다.
- 공백과 구두점을 포함해 텍스트를 한 문자씩 확인합니다.
- 서로 다른 각 문자에 대해 누적 집계를 유지합니다. 새 문자는 1에서 시작하고, 반복되는 문자는 기존 집계에 1을 더합니다.
- 모든 문자와 최종 집계값을 나열합니다.
이 도구는 해시 맵이라는 자료 구조를 사용해 같은 작업을 자동으로 수행합니다. 해시 맵은 키에 대응하는 값을 저장하는 조회 테이블입니다. 텍스트의 각 문자에 대해 도구는 해당 문자가 맵에 이미 등록되어 있는지 확인합니다. 등록되어 있으면 저장된 개수에 1을 더합니다. 등록되어 있지 않으면 개수가 1인 새 항목을 만듭니다. 이 방법은 각 문자를 정확히 한 번씩 처리하므로, 처리 시간은 텍스트 길이에 정비례해 증가하며 그보다 빠르게 증가하지 않습니다.
계산이 끝나면 도구는 문자 기준의 알파벳순으로 결과를 나열합니다. 현재는 개수순으로 정렬하는 옵션을 제공하지 않습니다.
백분율로 나타낸 문자 빈도
텍스트마다 길이가 다르면 개수만으로 비교하기 어려울 수 있습니다. 따라서 빈도는 전체 문자 수에 대한 백분율로 나타내는 경우가 많습니다.
여기서 는 문자 가 나타나는 횟수이고, 은 텍스트의 전체 문자 수입니다. 이 도구는 백분율 열이 아니라 원시 개수와 전체 문자 수를 표시하지만, 어떤 문자든 그 개수를 전체 수로 나눈 뒤 100을 곱하면 백분율을 계산할 수 있습니다.
계산 예시
공백이나 구두점이 없고 문자가 11개인 "mississippi"라는 단어를 예로 들어 보겠습니다.
각 문자를 세면 다음과 같습니다.
| 문자 | 개수 | 백분율 |
|---|---|---|
| i | 4 | 36.4% |
| m | 1 | 9.1% |
| p | 2 | 18.2% |
| s | 4 | 36.4% |
표는 알파벳순(i, m, p, s)으로 정렬되어 있으며, 이는 이 도구가 결과를 정렬하는 방식과 같습니다. 개수의 합은 단어의 전체 길이인 11입니다. 백분율 열을 구하려면 각 개수를 11로 나눈 뒤 100을 곱합니다. 예를 들어 4 ÷ 11 × 100 ≈ 36.4%입니다.
이 도구 사용 방법
입력 상자에 텍스트를 입력하거나 붙여 넣습니다. 누를 버튼 없이 도구가 즉시 분석합니다. 텍스트가 바뀌면 문자 목록과 막대 차트도 그에 맞춰 업데이트됩니다.
결과 영역에는 다음이 표시됩니다.
- 문자마다 하나씩 막대가 있는 막대 차트. 막대가 높을수록 해당 문자가 더 자주 나타난다는 뜻입니다.
- 공백과 구두점을 포함한 텍스트의 전체 문자 수
- 각 문자와 정확한 개수의 목록.
"복사" 버튼을 누르면 결과가 일반 텍스트로 서식 지정됩니다. 문자와 개수가 한 줄에 하나씩 표시되어 스프레드시트나 문서에 바로 붙여 넣을 수 있습니다. 이 출력에서는 공백을 "space"로 표시하므로 빈 줄로 오해하지 않게 합니다.
일반적인 영어 텍스트에서 가장 흔한 다섯 글자는 E, T, A, O, I입니다. Q나 Z처럼 드문 글자가 유난히 자주 나오는 텍스트는 인코딩되었거나 암호화되었거나 다른 언어로 쓰였을 수 있습니다.
문자 빈도 분석의 활용
치환 암호 해독
치환 암호는 메시지의 각 글자를 처음부터 끝까지 같은 규칙으로 다른 글자나 기호로 바꿉니다. 바꾸는 규칙이 일정하므로 원래 언어의 빈도 패턴이 암호문에도 남습니다. 영어에서 글자 E는 전체 글자의 약 12%를 차지합니다. 암호문에서 어떤 기호가 그와 비슷한 비율로 나타나면 E를 대신하는 기호일 가능성이 큽니다. 현대 암호가 등장해 퍼즐과 역사 문서를 제외하면 쓸모가 없어지기 전까지, 이 방법은 수 세기 동안 치환 암호를 푸는 주된 방법이었습니다.
데이터 압축
gzip 유틸리티가 사용하는 DEFLATE 압축 형식은 LZ77 방식과 허프만 부호화를 결합합니다. 허프만 부호는 기호의 빈도로 만듭니다. 자주 나오는 문자에는 짧은 이진 부호를, 드문 문자에는 더 긴 부호를 줍니다. 흔한 문자가 한 번 나올 때 차지하는 공간이 작으므로, 정보를 잃지 않고도 파일 전체가 줄어듭니다.
인코딩 문제 찾기
"é"가 있어야 할 자리에 "é"처럼 이상하고 예상하지 못한 문자가 표시되는 텍스트는 파일을 저장할 때 사용한 문자 인코딩과 파일을 읽을 때 사용한 인코딩이 일치하지 않음을 나타내는 경우가 많습니다. 일반적인 문자 대신 이상한 기호가 비정상적으로 급증하는 빈도 차트는 인코딩 문제를 확인하는 데 도움이 될 수 있습니다.
언어 식별
언어마다 전형적인 문자 분포가 다릅니다. 영어는 E, T, A를 많이 쓰고, 독일어는 영어에는 전혀 나오지 않는 ä, ö, ü 같은 글자도 씁니다. 텍스트의 문자 빈도를 알려진 언어별 분포와 비교하면 언어를 빠르게, 대략적으로 짐작할 수 있습니다.
문체와 저자 식별
작가는 구두점과 문자 사용에서 일관된 습관을 보이는 경향이 있으므로, 문자 수준의 패턴은 저자를 식별할 때 작은 증거 하나로 활용할 수 있습니다. 문자 빈도만으로는 누가 글을 썼는지 입증하기 어려우며, 단어 선택, 문장 길이 및 다른 문체 지표와 함께 사용할 때 가장 효과적입니다.
다른 텍스트 분석 방법
문자 빈도는 텍스트를 분석하는 유일한 방법이 아닙니다.
- 단어 빈도는 문자 대신 완전한 단어의 개수를 셉니다. 텍스트의 의미에 더 가까운 방법이며 키워드 조사와 주제 분석에서 흔히 사용됩니다.
- N-그램 분석은 문자나 단어의 짧은 연속열을 살펴봅니다. 예를 들어 두 개 또는 세 개의 단위를 묶습니다. 예측 키보드와 자동 완성 기능은 이를 이용해 다음 문자나 단어를 추정합니다.
- 감성 분석은 단순한 개수 세기를 넘어서는 방법을 사용해 텍스트가 긍정적인지, 부정적인지 또는 중립적인지를 판단합니다.
- 플레시-킨케이드 점수와 같은 가독성 분석은 문장과 단어의 길이를 바탕으로 텍스트를 읽기 어려운 정도를 추정합니다.
자주 묻는 질문
문자 빈도 분석은 무엇을 알려 주나요?
텍스트에서 각 문자가 얼마나 자주 나타나는지 보여 줍니다. 결과를 읽으면 암호학, 압축, 인코딩 오류 탐지 또는 텍스트의 언어 추정에 유용한 패턴을 발견할 수 있습니다.
이 도구는 결과를 어떻게 정렬하나요?
문자를 알파벳순으로 정렬합니다. 개수순으로 정렬하는 옵션은 없으므로, 가장 흔한 문자와 가장 드문 문자는 개수를 훑어보거나 막대그래프를 읽어서 찾아야 합니다.
이 도구는 백분율을 표시하나요?
아니요. 각 문자의 원시 개수와 전체 문자 수를 표시합니다. 문자의 개수를 전체 수로 나눈 뒤 100을 곱하면 백분율을 계산할 수 있습니다.
문자 빈도 분석으로 현대 암호를 해독할 수 있나요?
아니요. 하나의 문자가 항상 같은 대체 문자에 대응하는 단순 치환 암호에만 사용할 수 있습니다. AES와 같은 현대 암호는 이러한 일관된 패턴이 없는 출력을 생성하므로, 빈도 개수만으로는 원래 메시지에 대해 알 수 있는 것이 없습니다.
이 도구는 공백과 구두점을 세나요?
네. 공백, 탭, 줄 바꿈, 구두점 등 입력에 포함된 모든 문자를 셉니다. 일반적인 텍스트에서는 공백이 단일 문자 중 가장 자주 나타나는 경우가 많습니다.
신뢰할 만한 패턴을 얻으려면 텍스트가 얼마나 필요한가요?
정해진 최소 길이는 없습니다. 아주 짧은 텍스트는 순전히 우연으로 빈도가 예상 패턴과 크게 다르게 나타날 수 있습니다. 표본이 길수록 알려진 언어 패턴과 더 가깝게 일치하는 경향이 있습니다.
참고 문헌
- Naskręcki, B., 아담 미츠키에비치 대학교. Elements of Cryptanalysis, Chapter 3: Frequency Analysis. 빈도 분석 — 서기 850년경에 쓰인 알킨디의 빈도 분석 논문.
- 코넬 대학교 수학과. English Letter Frequency. 영어 글자 빈도표 — 40,000단어 표본에서 E가 12.02%로 가장 많고, 그다음이 T, A, O, I입니다.
- IETF. RFC 1951: DEFLATE Compressed Data Format Specification version 1.3. RFC 1951 — DEFLATE는 LZ77과 허프만 부호화를 결합하며, 허프만 부호는 기호의 빈도로 만듭니다.